Vulkan 可以进行嵌套渲染过程吗?

Vulkan can you do nested render passes?

是否可以在已记录渲染过程时将渲染过程调用到不同的目标?

在伪代码中(使用 hpp header)是这样的:

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();

我不确定您的 pseudo-code 与您标题中的问题有何关联。看,您使用 cmd1 开始渲染过程,这大概代表命令缓冲区。然后使用 cmd2 开始渲染过程,这可能代表一个单独的命令缓冲区。由于这两个命令都应正确执行,这意味着它们都是主要命令缓冲区(因为您无法在辅助命令缓冲区中开始渲染过程)。

此外,如果您在命令缓冲区中启动渲染通道,则必须在同一 CB 中终止该渲染通道。因此,就命令的提交顺序而言,不同主命令缓冲区中的渲染通道无法重叠。

所以...问题是什么?对 Vulkan 唯一重要的命令顺序是 提交顺序 :命令缓冲区提交给 queue 的顺序,以及每个缓冲区中命令的顺序。 Vulkan 不关心一个 CB 中的命令相对于另一个 CB 记录的顺序。

因此 queue 将看到其中一个渲染过程开始,然后结束,然后下一个开始,然后结束。您问题中的代码不会 "nest" 渲染通行证。

唯一可能发生的 "nesting" 渲染过程是对同一个 CB 进行渲染。不,你不能嵌套它们。

如果可以的话,它也没有用。

如果您的 "render to main target" 操作要求 "render to off screen target" 完成,那么这与适当 barriers/dependencies 的两个顺序渲染过程操作相同。如果两者都不依赖于另一个,那么这与两个顺序渲染过程操作相同,它们之间有 no barriers/dependencies。

唯一可能有意义的地方是,如果您渲染到 "main target" 一段时间,然后想要以使用 [=] 结果的方式渲染到 "off screen target" 42=] 然后想以使用 "off screen target" 结果的方式返回到 "main target"。但这只是 一个渲染通道,有 3 个使用不同附件的子通道,以及它们之间适当的 dependencies/input 目标。