如何在渲染过程之间保留附件内容
How to preserve attachment content between render passes
我有多个 "renderers" 应该绘制到同一个附件(准确地说是交换链图像)。我事先不知道此类渲染器的数量,所以我无法使用子通道。这就是我想要实现它的方式:
VkCommandBuffer cb{...}; // get current "main" command buffer
for(auto r : renderers)
{
VkRenderPassBeginInfo renderPassBeginInfo{get_render_pass_begin_info(...)};
vkCmdBeginRenderPass(cb, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
array<VkCommandBuffer, 2> buffs{r->getCommandBuffers()}; // renderer build two secondary command buffers...
vkCmdExecuteCommands(cb, 1, buffs[0]); // first should be used in a render pass
vkCmdEndRenderPass(cb);
vkCmdExecuteCommands(cb, 1, buffs[1]); // second should be used ooutside of a render pass
}
这里的问题是每次对 vkCmdBeginRenderPass
的新调用都会清除目标。发生这种情况是因为附件是用 loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR
创建的,因为我需要清除它(但只清除一次)。
我的解决方案是将 vkCmdBeginRenderPass
和 vkCmdEndRenderPass
移出循环,但在这种情况下,我需要 "collect" 所有辅助命令缓冲区不要在渲染过程中使用并稍后执行它们。
但是由于渲染过程的概念并没有进入我的脑海,我想知道是否有办法在渲染过程之间保留附件的数据?
您可以停止清除加载中的附件。只需在渲染通道开始之前或第一个子通道开始时手动清除它们。
话虽这么说,渲染通道并不便宜,而且这确实不是使用它们的方式。正确的解决方案是重构您的渲染代码,以便您只需要一个渲染通道。
我有多个 "renderers" 应该绘制到同一个附件(准确地说是交换链图像)。我事先不知道此类渲染器的数量,所以我无法使用子通道。这就是我想要实现它的方式:
VkCommandBuffer cb{...}; // get current "main" command buffer
for(auto r : renderers)
{
VkRenderPassBeginInfo renderPassBeginInfo{get_render_pass_begin_info(...)};
vkCmdBeginRenderPass(cb, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
array<VkCommandBuffer, 2> buffs{r->getCommandBuffers()}; // renderer build two secondary command buffers...
vkCmdExecuteCommands(cb, 1, buffs[0]); // first should be used in a render pass
vkCmdEndRenderPass(cb);
vkCmdExecuteCommands(cb, 1, buffs[1]); // second should be used ooutside of a render pass
}
这里的问题是每次对 vkCmdBeginRenderPass
的新调用都会清除目标。发生这种情况是因为附件是用 loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR
创建的,因为我需要清除它(但只清除一次)。
我的解决方案是将 vkCmdBeginRenderPass
和 vkCmdEndRenderPass
移出循环,但在这种情况下,我需要 "collect" 所有辅助命令缓冲区不要在渲染过程中使用并稍后执行它们。
但是由于渲染过程的概念并没有进入我的脑海,我想知道是否有办法在渲染过程之间保留附件的数据?
您可以停止清除加载中的附件。只需在渲染通道开始之前或第一个子通道开始时手动清除它们。
话虽这么说,渲染通道并不便宜,而且这确实不是使用它们的方式。正确的解决方案是重构您的渲染代码,以便您只需要一个渲染通道。