同一VkPipeline是否有多个VkDescriptorSetLayout?

时间:2019-02-17 15:10:42

标签: c++ vulkan

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

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

使用单个VkDescriptorSetLayout,我将其传递给VkPipelineLayoutCreateInfo.pSetLayouts,然后使用该VkCmdBindDescriptorSet调用VkPipelineLayout

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

1 个答案:

答案 0 :(得分:4)

  

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

然后它们没有相同的VkPipeline。统一缓冲区是否是动态缓冲区是流水线的一部分,因为它是该流水线描述符集的布局的一部分。

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

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

要执行所需的操作,需要创建两个单独的不同的VkPipeline对象。一个可以是另一个的派生形式,以便暗示实现之间的变化不会特别大。但是您需要两个管道。

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