如何在渲染过程之间保留附件内容

时间:2018-05-31 12:41:26

标签: vulkan

我有多个“渲染器”,它们应该绘制到相同的附件(交换链图像是精确的)。我事先不知道这些渲染器的数量,所以我不能使用子通道。这就是我想要实现它的方式:

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创建的,因为我需要清除它(但只需清除一次)。

我的解决方案是将vkCmdBeginRenderPassvkCmdEndRenderPass移到循环之外,但在这种情况下,我需要“收集”所有不能在里面使用的辅助命令缓冲区渲染过程并稍后执行它们。

但是由于渲染过程的概念没有进入我的脑海,我想知道是否有办法在渲染过程之间保留附件的数据?

1 个答案:

答案 0 :(得分:2)

您可以在加载时停止清除附件。只需在渲染通道开始之前或第一个子通道的开始处手动清除它们。

话虽这么说,渲染过程并不便宜,这实际上不是使用它们的方法。正确的解决方案是重构您的渲染代码,这样您只需要一次渲染过程。