c++ - Vulkan:为什么主命令缓冲区和辅助命令缓冲区都需要设置 framebuffer 和 renderpass?

标签 c++ vulkan

// 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/

相关文章:

c++ - 如何在 C++ 中基于用户输入或没有模式的文件创建动态对象

c++ - 在 Windows 上使用 CMake 设置 Vulkan 项目

vulkan 扩展 : which are supported by whom?

graphics - Vulkan命令执行顺序

c++ - make_unique 给出错误 2248

c++ - 我如何创建一个将模板对象与其自己的模板列表相关联的方法?

c++ - 使用扩展元组参数调用成员函数 std::invoke 与 std::apply

c++ - vkCreateSwapchainKHR 错误

c++ - Class vs unique_ptr<MyClass> 导致 Vulkan 错误

c++ - 忽略 std::min 中的零并计算其他数字的最小值