我要使用相同的VkPipeline
渲染两个实体,问题在于它们具有不同的VkDescriptorSetLayout
(第一个实体使用动态统一缓冲区,第二个实体使用标准统一缓冲区); >
如何将两个VkDescriptorSetLayout
传递到图形管道,然后在创建命令缓冲区的过程中绑定正确的管道?
使用单个VkDescriptorSetLayout
,我将其传递给VkPipelineLayoutCreateInfo.pSetLayouts
,然后使用该VkCmdBindDescriptorSet
调用VkPipelineLayout
。
但是对于两个VkDescriptorSetLayouts
,如何正确地将它们绑定到VkPipelineLayout
,然后如何在命令缓冲期间选择我想要的那个?
答案 0 :(得分:4)
第一个实体使用动态统一缓冲区,第二个仅使用标准统一缓冲区
然后它们没有相同的VkPipeline
。统一缓冲区是否是动态缓冲区是流水线的一部分,因为它是该流水线描述符集的布局的一部分。
管道可以具有多个描述符集,但是每个集合都代表资源的集合,所有管道可以同时访问。在您的着色器代码中,这就是layout(set = #, descriptor = #)
的含义;着色器中的统一块是指特定集合索引中的特定描述符。并且它将始终引用该特定集合索引内的该特定描述符。那个特定集合中的那个特定描述符是否是动态的,是构成VkDescritorSetLayout
对象的VkPipelineLayout
使用的VkPipeline
的一部分。
管道布局中的特定描述符集不能有两个集。那没有道理。
要执行所需的操作,需要创建两个单独的不同的VkPipeline
对象。一个可以是另一个的派生形式,以便暗示实现之间的变化不会特别大。但是您需要两个管道。
但是,实际上,最好有一个始终使用动态统一缓冲区的管道。