// Contains the list of secondary command buffers to be submitted
std::vector<VkCommandBuffer> secondaryCommandBuffers;
// Inheritance info for the secondary command buffers
VkCommandBufferInheritanceInfo inheritanceInfo = {};
...
inheritanceInfo.renderPass = renderpass; <-------------
inheritanceInfo.framebuffer = frameBuffer; <-------------
...
VkCommandBufferBeginInfo secondaryCommandBufferBeginInfo = {};
...
commandBufferBeginInfo.pInheritanceInfo = &inheritanceInfo;
...
vkBeginCommandBuffer(secondaryCommandBuffers[i], &secondaryCommandBufferBeginInfo);
vkEndCommandBuffer(secondaryCommandBuffers[i]);
// renderPassBeginInfo for the primary command buffer
VkRenderPassBeginInfo renderPassBeginInfo = {};
...
renderPassBeginInfo.renderPass = renderPass; <-------------
renderPassBeginInfo.framebuffer = frameBuffer; <-------------
vkBeginCommandBuffer(primaryCommandBuffer, &cmdBufInfo);
vkCmdBeginRenderPass(primaryCommandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
vkCmdExecuteCommands(primaryCommandBuffer, secondaryCommandBuffers.size(), secondaryCommandBuffers.data());
vkEndCommandBuffer(primaryCommandBuffer);
为什么辅助命令缓冲区已经设置了 framebuffer 和 renderpass,并且为主命令缓冲区也设置了 framebuffer 和 renderpass?
一定要设置成一样吗?
最佳答案
包含渲染命令的辅助命令缓冲区必须在渲染 channel 内执行,并且完全在该渲染 channel 的特定子 channel 内执行(因此VkCommandBufferInheritanceInfo::subpass
)。这是他们的目的。
framebuffer
参数是可选的,可以是VK_NULL_HANDLE
。
渲染过程模型本质上要求命令生成的所有方面都能够确定正在发生的事情。渲染命令的生成方式在很多方面取决于正在使用哪个渲染 channel 的哪个子 channel 。这是整个机制的核心。
主要/次要 CB 区别允许在主要命令缓冲区(包含开始、结束和子 channel 切换操作)中定义渲染 channel 操作的结构,而实际渲染命令可以在次要命令中构建其他线程上的缓冲区。但是为了让那些其他线程完成他们的工作,他们必须知道他们是如何被使用的。因此需要渲染 channel 。
关于c++ - Vulkan:为什么主命令缓冲区和辅助命令缓冲区都需要设置 framebuffer 和 renderpass?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57810816/