是否可以在已经记录渲染通道时将渲染通道调用到其他目标?
在伪代码(使用 hpp 标头(中,如下所示:
cmd1.beginRenderPass(&render_pass_info, vk::SubpassContents::eInline); // main fb
cmd2.beginRenderPass(&render_pass_info, vk::SubpassContents::eInline); // off screen fb
// Render to off screen target
cmd2.endRenderPass();
// Render to main target
cmd1.endRenderPass();
我不确定您的伪代码与标题中的问题有何关系。看,您使用cmd1
启动渲染通道,它大概表示一个命令缓冲区。然后使用cmd2
启动渲染通道,它大概表示一个单独的命令缓冲区。由于这两个命令都应正确执行,这意味着它们都是主命令缓冲区(因为您无法在辅助命令缓冲区中开始渲染通道(。
除此之外,如果在命令缓冲区中启动渲染通道,则必须在同一 CB 中终止该渲染通道。因此,就命令的提交顺序而言,不同主命令缓冲区中的渲染通道无法重叠。
那么......问题是什么?对 Vulkan 来说,唯一重要的命令顺序是提交顺序:命令缓冲区提交到队列的顺序,以及每个缓冲区中命令的顺序。Vulkan 不关心一个 CB 中的命令相对于另一个 CB 的记录顺序。
因此,队列将看到其中一个渲染通道开始,然后结束,然后下一个开始,然后结束。您问题中的代码不会"嵌套"渲染通道。
唯一可能发生的渲染通道"嵌套"是,如果你对同一个 CB 进行嵌套。不,你不能嵌套它们。
如果可以的话,它没有任何用处。
如果"渲染到主目标"操作要求"渲染到屏幕外目标"已完成,则这与具有适当障碍/依赖项的两个顺序渲染通道操作相同。如果两者都不依赖于另一个,那么这与两个顺序渲染通道操作相同,它们之间没有障碍/依赖关系。
唯一有意义的地方是,如果您要渲染到"主目标"一段时间,然后想要以使用"主目标"结果的方式呈现到"屏幕外目标">,然后想要返回到"主目标"以使用"屏幕外目标"结果的方式。但这只是一个渲染通道,有 3 个子通道使用不同的附件,以及它们之间的适当依赖关系/输入目标。