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

Vulkan/GLSL中的统一缓冲区数组?,glsl,vulkan,Glsl,Vulkan,假设我有一些struct MyUniform: struct MyUniform { /*...*/ }; 我在主机上有10个这样的数组,比如: MyUniform my_uniform_data[10] = /*...*/; 我想从着色器访问所有十个(作为一个数组) 在VkDescriptorSetLayoutBinding中,它有一个字段descriptorCount: descriptorCount是绑定中包含的描述符的数量,在着色器中作为 数组 因此,我假设至少有一种方法可以将

假设我有一些struct MyUniform:

struct MyUniform {
   /*...*/
};
我在主机上有10个这样的数组,比如:

MyUniform my_uniform_data[10] = /*...*/;
我想从着色器访问所有十个(作为一个数组)

在VkDescriptorSetLayoutBinding中,它有一个字段
descriptorCount

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

因此,我假设至少有一种方法可以将此数组设置为着色器,即将descriptorCount设置为10,然后我可以在GLSL中写入:

layout(set = 2, binding = 4) uniform MyUniform {
    /*...*/
} my_uniform_data[10];
现在,在为此编写vkdescriptor集时,我将使用一个
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);
}
VkDescriptorBufferInfo bi[10];
对于(int i=0;i<10;i++){
bi[i].buffer=my\u buffer;
bi[i]。偏移量=i*sizeof(MyUniform);
bi[i]。范围=sizeof(MyUniform);
}
这种安排显然适应了每个数组元素可以来自不同的缓冲区和偏移量的情况

有没有一种方法可以安排描述符布局和更新,以便使用单个描述符写入整个数组


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

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

struct myData{
/*...*/
};
布局(设置=2,绑定=4)统一myUniform{
myData数据[];
};

记住对齐。

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

struct myData{
/*...*/
};
布局(设置=2,绑定=4)统一myUniform{
myData数据[];
};

记住对齐。

对于您的情况,只需要一个
VkWriteDescriptorSet
,但我认为您无法为所有统一缓冲区创建一个
VkDescriptorBufferInfo
。你为什么要这么做?使用多个
VkDescriptorBufferInfo
的缺点是什么?对于您的情况,只需要一个
VkWriteDescriptorSet
,但我认为您无法为所有统一的缓冲区创建一个
VkDescriptorBufferInfo
。你为什么要这么做?使用多个
VkDescriptorBufferInfo
的缺点是什么?