Glsl 一套制服中的“绑定”必须是唯一的吗?

Glsl 一套制服中的“绑定”必须是唯一的吗?,glsl,vulkan,Glsl,Vulkan,这使用glslang编译,没有任何错误。我认为集合中的绑定必须是唯一的 如果确实允许,您将如何将数据发送到采样器和测试 layout (set = 0, binding = 0) uniform sampler2D sampler; layout (set = 0, binding = 0) uniform Test{ mat4 m; } test; Vulkan 1.0.58对此进行了澄清,宣布上述代码明确为非法代码: 只要被编译的入口点静态使用的所有着色器变量都与描述符集布局绑定中的描

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

如果确实允许,您将如何将数据发送到
采样器
测试

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

Vulkan 1.0.58对此进行了澄清,宣布上述代码明确为非法代码:

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


描述符集布局类型几乎不可能与
VK\u描述符类型\u统一\u缓冲区/\u动态
VK\u描述符类型\u组合图像\u采样器
兼容。因此,这将不起作用。

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

报告说:

pBindings
数组的元素的
VkDescriptorSetLayoutBinding::binding
成员必须分别具有不同的值

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

该节说:

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

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

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;