集合中的“绑定”必须是统一的唯一吗?

时间:2017-06-29 14:17:32

标签: glsl vulkan

layout (set = 0, binding = 0) uniform sampler2D sampler;
layout (set = 0, binding = 0) uniform Test{
  mat4 m;
} test;

这与glslang编译没有任何错误。我认为集合中的绑定必须是唯一的吗?

如果确实允许这样做,您会如何将数据发送到samplertest

typedef struct VkWriteDescriptorSet {
    VkStructureType                  sType;
    const void*                      pNext;
    VkDescriptorSet                  dstSet;
    uint32_t                         dstBinding;
    uint32_t                         dstArrayElement;
    uint32_t                         descriptorCount;
    VkDescriptorType                 descriptorType;
    const VkDescriptorImageInfo*     pImageInfo;
    const VkDescriptorBufferInfo*    pBufferInfo;
    const VkBufferView*              pTexelBufferView;
} VkWriteDescriptorSet;

2 个答案:

答案 0 :(得分:2)

除了Nicol Bolas引用的要求之外,还有其他一些相关部分:

Valid Usage for VkDescriptorSetLayoutCreateInfo说:

  

VkDescriptorSetLayoutBinding::binding数组元素的pBindings成员必须各自具有不同的值。

这意味着您无法使用具有特定(设置,绑定)的多个变量的描述符集布局。因此,您也无法创建具有多个具有相同绑定的变量的描述符集或管道。因此,即使GLSL和SPIR-V本身有效,也无法使用变量或消除在Vulkan中使用哪一个变量。

13.2.2 Pipeline Layouts节说:

  

管道中所有着色器中静态使用的所有资源变量必须使用(set,binding,arrayElement)声明,该(set,binding,arrayElement)存在于相应的描述符集布局中,并且具有适当的描述符类型并包含一组着色器阶段在stageFlags中使用。

由于这会将管道着色器中的SPIR-V变量与描述符集布局中的绑定联系起来,因此无法在Vulkan管道中使用SPIR-V,因为无法满足此要求:你只能为其中一个具有相同(设置,绑定)的变量满足它。

答案 1 :(得分:1)

Vulkan 1.0.58澄清了这一点,声明上述代码明确是非法的:

  

为多个着色器变量分配相同的描述符集和绑定值是有效的,只要所有被编译的入口点静态使用的那些变量与描述符集布局绑定中的描述符类型兼容。 / p>

您的描述符集布局类型几乎不可能与VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER/_DYNAMICVK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER兼容。所以这不会起作用。