【发布时间】:2021-05-03 02:25:35
【问题描述】:
假设我有一些 struct MyUniform:
struct MyUniform {
/*...*/
};
我有一个由 10 个组成的数组,所以在 C 中的主机上,例如:
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 统一数组以以这种方式使用多个描述符的唯一方法?
【问题讨论】:
-
对于您的情况,只需要一个
VkWriteDescriptorSet,但我认为您不能为所有统一缓冲区创建一个VkDescriptorBufferInfo。你为什么要这样做?使用多个VkDescriptorBufferInfo有什么坏处?