我可以在 2 处绑定描述符而不绑定 0 和 1 吗?

Can I bind a descriptor at 2 without binding 0 and 1?

我在着色器管道中有以下制服:

layout (set = 1, binding = 0) uniform window_uniform_data_uniform {};

现在我想绑定这个集合,所以我这样做:

vkCmdBindDescriptorSets(cmd_buffer->vk_buffer_handle, VkPipelineBindPoint::VK_PIPELINE_BIND_POINT_GRAPHICS,
        PipelineLayouts::GUI,
        1, // THE UNIFORM BUFFER IS SET 1
        1,
        &DescriptorSets::GUI, 0, nullptr);

当我调用该函数时出现验证错误:

Vulkan validation layer callback: Validation Error: [ VUID-VkPipelineLayoutCreateInfo-pSetLayouts-parameter ] Object 0: handle = 0x1acf6211460, type = VK_OBJECT_TYPE_INSTANCE; | MessageID = 0xb3f957d3 | Invalid VkDescriptorSetLayout Object 0x0. The Vulkan spec states: If setLayoutCount is not 0, pSetLayouts must be a valid pointer to an array of setLayoutCount valid VkDescriptorSetLayout handles

我认为发生这种情况的原因是因为在管道布局描述中我说有一组布局计数:

pipelineLayoutInfo.setLayoutCount = 1;
pipelineLayoutInfo.pSetLayouts = &DescriptorSetLayouts::GUI; 

这对我来说很有意义,因为在着色器中我只有 set = 1,没有 0。但是我认为发生的是我传递的 vkCmdBindDescriptorSets (firstSet (1), descriptorSetCount(1) ) 因为我只想更新集合 1。Vulkan 可能会查找 element/position 1 个管道布局,发现它为空或具有无效参数。这是正确的吗?

如果是这种情况,这是否意味着如果我在设置为 11 的着色器中有一个描述,即使我从不更新它们,也需要使用 10 个虚拟布局创建管道?

VkPipelineLayoutCreateInfo 有成员 setLayoutCount,但没有“set offset”成员。管道布局具有 setLayoutCount 个描述符集,索引范围为 [0, setLayoutCount).

您的管道有一个设置 0,即使该管道中的着色器从不使用它。它仍然存在。

请注意,您收到的验证错误不是来自 vkBindDescriptorSets;它来自 VkPipelineLayoutCreateInfo,可能在对 vkCreatePipelineLayout.

的调用中