【问题标题】:Descriptor bindings and binding numbers描述符绑定和绑定编号
【发布时间】:2018-07-26 03:14:09
【问题描述】:

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

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

如 14.5.3 所述

sDescriptorSet 装饰和 Binding 装饰标识的变量>b 表示该变量与VkDescriptorSetLayoutBinding 相关联,该VkDescriptorSetLayoutBinding绑定 等于pSetLayouts 中的b >[s] 在VkPipelineLayoutCreateInfo

中指定

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

到目前为止一切顺利。令人困惑的部分是在调用vkUpdateDescriptorSets 时。结构 VkWriteDescriptorSet 具有元素 dstBindng 其中

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

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

【问题讨论】:

  • 你听起来很困惑,两个同名的东西是否指的是同一个东西。
  • 不应该吗?我知道正确的答案是第一个(dstBindng 的值必须与变量资源中用作装饰的绑定号相同)。可能我一直在想VkWriteDescriptorSetdstBinding 应该将VkDescriptorSetLayoutBinding 的元素作为索引引用。
  • Vulkan 规范编写得非常仔细,以便清楚地说明描述符集中的绑定和某些用户提供的数组的索引。
  • 确实,在具体问题上,并没有提到应该使用 dstBinding 作为索引。我仍然觉得它有些混乱。
  • 查看英特尔关于descriptor sets 的教程。在那里你可以找到关于绑定的解释,我希望它比规范更清楚。

标签: vulkan


【解决方案1】:

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

【讨论】:

  • 我不知道 writeDescriptorSet.dstArrayElement = 0;有效,但我推测我可以将其设置为 3 并跳过将 pBufferInfo 更新为元素 3
猜你喜欢
  • 2018-12-04
  • 2022-07-04
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多