繁体   English   中英

Vulkan计算着色器仅读取部分统一缓冲区

[英]Vulkan compute shader reading only parts of the uniform buffer

我编写了一个非常简单的计算着色器,该着色器读取绑定到描述符集的大小为1KB的统一缓冲区,并将其作为256 uint的数组进行遍历,然后对于每个元素,将值加倍并将结果写入另一个存储中绑定到描述符集的缓冲区(当然也在着色器中定义):

#version 450 core

layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;

layout(set = 0, binding = 0) uniform InputBuffer
{
    uint values[256];
} inputBuffer;

layout(set = 0, binding = 1) buffer OutputBuffer
{
    uint values[256];
} outputBuffer;

void main(void)
{
    for(int i = 0; i < 256; i++) {
        outputBuffer.values[i] = inputBuffer.values[i] * 2;
    }

    return;
}

输入数据是通过统一缓冲区提供的,在运行着色器之前,该缓冲区已分配并写入了内存。 我只是用3的值覆盖每个字节:

memset(*mappedMemory, 3, 1024);

着色器写入存储缓冲区的结果值很奇怪,四分之一的数据似乎是正确的,结果填充为0s 在此处输入图片说明

我检查了代码中为Vulkan函数提供大小或偏移量的几个点,它们全部分别为1024(1KB)0

我猜这可能是因为Vulkan计算着色器如何从统一的缓冲存储器读取数据,而std140数据布局可能是此问题的根源,但是据我所知,这些教程/规范之间没有提及任何内容。抵消要求!

您已经忘记了std140布局的工作原理。 基本类型数组中的元素大小始终为 16个字节。 因此,您的uint values[256]; 确实uvec4 values[256];

您应该使用uvec4 values[64]; 数组,并像这样索引它:

outputBuffer.values[i] = inputBuffer.values[i / 4][i % 4] * 2;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM