繁体   English   中英

Vulkan/GLSL 中的统一缓冲区数组?

[英]Array of uniform buffer(s) in Vulkan/GLSL?

假设我有一些 struct MyUniform:

struct MyUniform {
   /*...*/
};

我在 C 的主机上有一个由 10 个组成的数组,例如:

MyUniform my_uniform_data[10] = /*...*/;

我想从着色器访问所有十个(作为一个数组)。

在 VkDescriptorSetLayoutBinding 它有一个字段descriptorCount

descriptorCount 是绑定中包含的描述符的数量,在着色器中作为数组访问。

所以我假设至少有一种将这个数组放到着色器的方法是将descriptorCount设置为10,然后我就可以在GLSL中编写:

layout(set = 2, binding = 4) uniform MyUniform {
    /*...*/
} my_uniform_data[10];

现在,当为此编写 VkDescriptorSet 时,我将拥有一个10 * sizeof(MyUniform)字节的缓冲区。 因此,在VkWriteDescriptorSet中,我还将descriptorCount设置为 10,然后我必须创建一个 10 VkDescriptorBufferInfo的数组:

VkDescriptorBufferInfo bi[10];
for (int i = 0; i < 10; i++) {
    bi[i].buffer = my_buffer;
    bi[i].offset = i*sizeof(MyUniform);
    bi[i].range = sizeof(MyUniform);
}

这种安排清楚地适应了每个数组元素可以来自不同的缓冲区和偏移量的情况。

有没有办法安排描述符布局和更新,以便用单个描述符编写整个数组?

还是以这种方式更新 GLSL 统一数组以使用多个描述符的唯一方法?

描述符 arrays 创建描述符的 arrays(例如缓冲区); 但是您需要的是缓冲区中的结构数组:

struct myData{
    /*...*/
};

layout(set = 2, binding = 4)uniform myUniform {
    myData data[];
};

记住 alignment。

暂无
暂无

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

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