【问题标题】:Vulkan can you do nested render passes?Vulkan 你能做嵌套渲染通道吗?
【发布时间】:2019-10-08 01:46:44
【问题描述】:

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

在伪代码(使用 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();

【问题讨论】:

    标签: graphics rendering render vulkan


    【解决方案1】:

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

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

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

    所以队列将看到一个渲染通道开始,然后结束,然后下一个开始,然后结束。您问题中的代码不会“嵌套”渲染通道。

    唯一可能发生的渲染通道“嵌套”是您对同一个 CB 执行此操作。不,你不能嵌套它们。

    如果可以的话,这将毫无用处。

    如果您的“渲染到主目标”操作要求“渲染到屏幕外目标”完成,那么这与两个具有适当障碍/依赖关系的顺序渲染传递操作相同。如果两者都不依赖于另一个,那么这与两个顺序渲染传递操作相同,它们之间有 no 障碍/依赖关系。

    唯一可能有意义的地方是,如果您要渲染到“主要目标”一段时间,然后想要以使用“主要目标”结果的方式渲染到“屏幕外目标”然后想以使用“屏幕外目标”结果的方式返回“主要目标”。但这只是一个渲染通道,有 3 个使用不同附件的子通道,以及它们之间的适当依赖项/输入目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 2018-03-31
      • 2010-09-27
      相关资源
      最近更新 更多