描述符绑定和绑定号

时间:2016-09-07 13:19:34

标签: vulkan

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

  

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

如14.5.3所述

  

使用 s DescriptorSet 装饰标识的变量以及 绑定装饰> b 表示此变量与 pSetLayouts <中绑定等于 b VkDescriptorSetLayoutBinding相关联在VkPipelineLayoutCreateInfo

中指定的/ em> [ s ]

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

到目前为止一切顺利。令人困惑的部分是在调用vkUpdateDescriptorSets时。 Struct VkWriteDescriptorSet包含元素 dstBindng

  

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

我对 dstBindng 的值是否必须与变量资源中用作装饰的绑定号相同感到困惑,或者它应该用作内部索引VkDescriptorSetLayoutBinding数组。

1 个答案:

答案 0 :(得分:0)

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);