同一个 VkPipeline 有多个 VkDescriptorSetLayout?

Multiple VkDescriptorSetLayout for the same VkPipeline?

我有两个实体要用相同的VkPipeline渲染,问题是它们有不同的VkDescriptorSetLayout(第一个实体使用动态统一缓冲区,第二个仅使用标准统一缓冲区);

如何将两者 VkDescriptorSetLayout 传递给图形管道,然后在创建命令缓冲区期间绑定正确的一个?

对于单个 VkDescriptorSetLayout,我只是将其传递给 VkPipelineLayoutCreateInfo.pSetLayouts,然后用 VkPipelineLayout 调用 VkCmdBindDescriptorSet

但是有两个VkDescriptorSetLayouts,如何将它们正确绑定到VkPipelineLayout,然后如何在命令缓冲期间选择我想要的那个?

The first entities uses Dynamic Uniform Buffers, the second only standard Uniform Buffers

那么他们没有相同的VkPipeline。统一缓冲区是否动态是管道的一部分,因为它是管道描述符集布局的一部分。

管道可以有多个描述符集,但每个集代表一个资源集合,所有这些资源管道可以同时访问。在您的着色器代码中,这就是 layout(set = #, binding = #) 的意思;着色器中的统一块引用 特定集合索引 中的特定描述符。它将始终引用该特定集合索引中的特定描述符。并且该特定集合中的特定描述符是否是动态的是 VkPipelineLayout 使用的 VkDescritorSetLayout 的一部分,用于构造 VkPipeline 对象。

管道布局中的特定描述符集不能有两组。这没有意义。

做你想做的事需要创建两个独立的、不同的 VkPipeline 对象。一个可以是另一个的派生,以暗示实现它们之间的变化不会特别大。但是你需要两条管道。

但实际上,只有一个始终使用动态统一缓冲区的管道可能会更好。