描述符绑定和绑定编号

hid*_*bit 5 vulkan

我对规范中使用的关于VkDescriptorSetLayoutBinding结构描述的描述符绑定的语言有点困惑。该绑定元素

是此条目的绑定号,对应着色器阶段中相同绑定号的资源。

如 14.5.3 所述

使用sDescriptorSet修饰和bBinding修饰标识的变量表示此变量与在pSetLayouts [ s ] 中指定的具有等于b绑定相关联VkDescriptorSetLayoutBindingVkPipelineLayoutCreateInfo

因此,如果我正确地得到了这一点,那么描述的描述符绑定VkDescriptorSetLayoutBinding必须为该集中的每个活动资源变量都有一个条目。每个描述符绑定引用哪个资源变量由绑定变量和每个变量的绑定修饰决定。

到现在为止还挺好。令人困惑的部分是调用vkUpdateDescriptorSets. 结构VkWriteDescriptorSet具有元素dstBindng,其中

是该集合中的描述符绑定。

我很困惑dstBindng的值是否必须与在变量资源中用作装饰的绑定号相同,还是应该用作VkDescriptorSetLayoutBinding数组内的索引。

Jon*_*son 2

VkWriteDescriptorSet 中的 dstBinding 是 pBufferInfo 指向的第一个 VkDescriptorBufferInfo 的绑定#。

即我想将4个缓冲区写入描述符集,但它们是不同类型的(3个存储缓冲区和一个统一缓冲区)。我可以从绑定 #0 开始写入 3 个存储缓冲区(写入绑定 #0、#1、#2),然后从绑定 #3 开始写入 1 个统一缓冲区。

VkDescriptorBufferInfo descriptorBufferInfo[4];
...

VkWriteDescriptorSet writeDescriptorSet = {};
writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
writeDescriptorSet.pNext = NULL;
writeDescriptorSet.dstSet = descriptorSet;
writeDescriptorSet.dstBinding = 0;
writeDescriptorSet.dstArrayElement = 0;
writeDescriptorSet.descriptorCount = 3;
writeDescriptorSet.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
writeDescriptorSet.pImageInfo = NULL;
writeDescriptorSet.pBufferInfo = descriptorBufferInfo;
writeDescriptorSet.pTexelBufferView = NULL;

vkUpdateDescriptorSets(device, 1, &writeDescriptorSet, NULL, NULL);

writeDescriptorSet.dstBinding = 3;
writeDescriptorSet.descriptorCount = 1;
writeDescriptorSet.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
writeDescriptorSet.pBufferInfo = &descriptorBufferInfo[3];

vkUpdateDescriptorSets(device, 1, &writeDescriptorSet, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)