layout (set = 0, binding = 0) uniform sampler2D sampler;
layout (set = 0, binding = 0) uniform Test{
mat4 m;
} test;
这与glslang
编译没有任何错误。我认为集合中的绑定必须是唯一的吗?
如果确实允许这样做,您会如何将数据发送到sampler
和test
?
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;
答案 0 :(得分:2)
Valid Usage for VkDescriptorSetLayoutCreateInfo说:
VkDescriptorSetLayoutBinding::binding
数组元素的pBindings
成员必须各自具有不同的值。
这意味着您无法使用具有特定(设置,绑定)的多个变量的描述符集布局。因此,您也无法创建具有多个具有相同绑定的变量的描述符集或管道。因此,即使GLSL和SPIR-V本身有效,也无法使用变量或消除在Vulkan中使用哪一个变量。
管道中所有着色器中静态使用的所有资源变量必须使用(set,binding,arrayElement)声明,该(set,binding,arrayElement)存在于相应的描述符集布局中,并且具有适当的描述符类型并包含一组着色器阶段在stageFlags中使用。
由于这会将管道着色器中的SPIR-V变量与描述符集布局中的绑定联系起来,因此无法在Vulkan管道中使用SPIR-V,因为无法满足此要求:你只能为其中一个具有相同(设置,绑定)的变量满足它。
答案 1 :(得分:1)
Vulkan 1.0.58澄清了这一点,声明上述代码明确是非法的:
为多个着色器变量分配相同的描述符集和绑定值是有效的,只要所有被编译的入口点静态使用的那些变量与描述符集布局绑定中的描述符类型兼容。 / p>
您的描述符集布局类型几乎不可能与VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER/_DYNAMIC
和VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
兼容。所以这不会起作用。