【问题标题】:Vulkan swap chain, can we reuse the same render pass for every frame?Vulkan 交换链,我们可以为每一帧重用相同的渲染通道吗?
【发布时间】:2022-11-11 18:02:30
【问题描述】:

我的问题在标题中。

交换链需要多个图像,我理解为什么,因此拥有相同的图像视图数量似乎是合乎逻辑的,因为它们就像指向这些图像的指针。最后,我理解了为什么它需要多个帧缓冲区,因为您将图像视图附加到这些缓冲区。

但是,帧缓冲区需要一个渲染通道句柄。但是渲染通道中的图像或图像视图没有直接链接,它仅描述渲染将完成的内容。

那么图形管道只需要一个渲染通道句柄。最后,vkCmdBeginRenderPass() 函数分别指定它将使用哪个帧缓冲区和哪个渲染通道。

那么为什么有时我会在交换链中看到多个渲染通道?它强制每个帧都有一个完全相同的图形管道。

【问题讨论】:

  • "那么为什么有时我会在交换链中看到多个渲染通道?” 有问题的代码试图完成什么?此外,渲染通道与交换链无关,那么“在交换链内”是什么意思?
  • 我的意思是,如果你愿意,你可以为整个程序重复使用相同的渲染通道。我无法评论您“有时会看到”的事情。特别是如果我也没有看到它们。同样正如上面评论的那样,渲染通道并不是“在交换链中”的东西,所以我不知道这意味着什么。
  • 我认为我在我的脑海中保持了渲染通道和交换链或渲染目标之间的密切关系。它必须来自基本教程,其中所有 vulkan 代码都放在同一个地方,这让我有些困惑。但另一方面,我认为我取得了进步,因为我在理解渲染过程方面确实遇到了问题。
  • “在交换链内”是指构建交换链的代码。
  • OK,应该可以解耦了。与交换链无关,是最容易与所有事物解耦的对象之一。如果我们说的是基础教程,它基本上可以是一个在程序启动时创建并且永远不会改变的常量对象。

标签: rendering vulkan framebuffer


【解决方案1】:

是的,您可以在每一帧重复使用相同的渲染通道(对于大多数应用程序,我建议您这样做)。 您可能需要多个渲染通道,例如,如果您想将后处理效果应用于渲染图像,但它们仍将被重用,在这种情况下,它会像这样工作,每一帧:

Begin renderpass 1.
    Draw some thing(s).
End renderpass 1.
Begin renderpass 2.
    Draw some thing(s), possibly using attachments from 1st pass.
End renderpass 2.
Present to screen.
Repeat for next frame.

【讨论】:

    猜你喜欢
    • 2022-01-26
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 2018-04-22
    相关资源
    最近更新 更多