同一个VkPipeline有多个VkDescriptorSetLayout?

Sho*_*ing 1 c++ vulkan

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

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

有了单VkDescriptorSetLayout,我就直接把它传递给VkPipelineLayoutCreateInfo.pSetLayouts,然后VkCmdBindDescriptorSet用那个调用VkPipelineLayout

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

Nic*_*las 5

第一个实体使用动态统一缓冲区,第二个实体仅使用标准统一缓冲区

那么他们就不一样了VkPipeline。统一缓冲区是否是动态的是pipeline 的一部分,因为它是该 pipeline 描述符集布局的一部分。

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

管道布局中的特定描述符集不能有两个集。这没有道理。

要执行您想要的操作,需要创建两个独立的、不同的VkPipeline对象。一个可以是另一个的衍生,从而暗示实现上它们之间的变化不会特别大。但你需要两条管道。

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