了解 Vulkan 统一布局的“设置”索引

问题描述

我一直在关注(非常棒的)nvpro 光线追踪教程,并对使用 layout(binding = 0,set = 1) 绑定 CameraProperties 统一缓冲区的方式有疑问 - 我理解绑定 = 0,但为什么设置 = 1 ?

教程说“set = 1 是因为它是传递给 pipelineLayoutCreateInfo.setPSetLayouts 的第二个描述符集”,但是当我查看 Hellovulkan::createGraphicsPipeline() 时,我看到布局计数是 1 ,这是使用 m_descSetLayout (绑定相机统一缓冲区的内容)的地方。我错过了什么?

教程的相关部分是here

谢谢!

解决方法

参见第 7.1 章:

  std::vector<vk::DescriptorSetLayout> rtDescSetLayouts = {m_rtDescSetLayout,m_descSetLayout};
  pipelineLayoutCreateInfo.setSetLayoutCount(static_cast<uint32_t>(rtDescSetLayouts.size()));
  pipelineLayoutCreateInfo.setPSetLayouts(rtDescSetLayouts.data());

管道布局包含两个描述符集布局,m_rtDescSetLayout 用于索引 0(集合 0)处的加速结构,m_descSetLayout 用于索引 1(集合 1)中的屏幕描述符。在 Vulkan 中,该集合自动从管道布局创建信息中的描述符集布局索引派生而来。