2017-06-29 24 views
1
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

除了要求尼科尔流星锤报价,有一对夫妇的其他相关部分:

Valid Usage for VkDescriptorSetLayoutCreateInfo说:

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

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

13.2.2 Pipeline Layouts说:

在管道中的所有着色器静态使用的所有资源变量必须以声明(套,装订,arrayElement)存在于相应的描述组布局,是一个合适的描述符类型,并包含stageFlags中使用的一组着色器阶段。

因为这关系SPIR-V变量在管道的着色器绑定在一个描述符集布局,SPIR-V将是无效的福尔康管道使用,因为就没有办法满足这一要求:你只能为其中一个具有相同(set,binding)的变量满足它。

1

福尔康1.0.58阐明了这一点,声明上面的代码,以明确是非法的:

它是有效的多重着色器变量被分配相同的描述符集和有约束力的价值观,只要所有被编译的入口点静态使用的那些都与描述符集合布局绑定中的描述符类型兼容。

几乎没有办法,您的描述符集布局类型可以兼容VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER/_DYNAMICVK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER。所以这将无法工作。

相关问题