同一个 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
对象。一个可以是另一个的派生,以暗示实现它们之间的变化不会特别大。但是你需要两条管道。
但实际上,只有一个始终使用动态统一缓冲区的管道可能会更好。
我有两个实体要用相同的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
对象。一个可以是另一个的派生,以暗示实现它们之间的变化不会特别大。但是你需要两条管道。
但实际上,只有一个始终使用动态统一缓冲区的管道可能会更好。