Vulkan:从屏幕外缓冲区呈现给交换链



我正在尝试在 Vulkan 中制作延迟渲染器,所以我需要将延迟渲染帧缓冲区中的结果图像呈现到屏幕上,但我不知道具体如何。

我的想法是: 在帧缓冲的末尾添加从交换链获取的图像,并添加一个子通道以向其渲染最终结果。 但是,我应该创建帧缓冲区的多个副本(每个交换链图像一个副本(,还是删除帧缓冲区和渲染通道并在将最后一个图像设置为交换链的图像时每帧重新创建它们。

还有其他方法可以做到吗?

我是否应该制作另一组管道、渲染通道和帧缓冲区以将结果复制到交换链的图像中?

我尝试查看SaschaWillems的例子,我认为他正在做双重渲染通道方法,但我想知道是否有另一种方法可以做到这一点。

如果您想考虑额外的副本,有多种选择,但假设您想将最终图像直接渲染到交换链中,图像,有两个基本选项。

首先,如果您不想使用多个子通道,则在每个帧上,您将为每个通道使用一个帧缓冲。最终的帧缓冲将使用该帧的交换链图像作为其颜色附件。对于每个帧缓冲区,您将使用不同的渲染通道,因为帧缓冲区附件计数/格式/等可能会有所不同。您可以预先创建所有渲染通道和非交换链帧缓冲区,并在每个帧上重用它们。

对于交换链帧缓冲区,请在首次创建交换链时为每个交换链图像创建一个,然后在每个帧上使用与该帧的交换链图像匹配的帧缓冲区。尽量避免一直破坏和重新创建对象;相反,缓存和重用它们 - 它们是不同对象的原因是允许您在多种用途中摊销创建成本。(单子通道渲染通道的创建成本应该很低,但在至少一个体系结构上,创建帧缓冲区的成本很高,并且在某些体系结构上,多子通道渲染通道的成本也很高。

其次,如果您想将整个事情作为具有多个子通道的单个渲染通道来利用某些 GPU 上的平铺内存,则过程非常相似。您将有一个渲染通道,但每个子通道对应于第一个选项中的一个渲染通道,并且将使用类似的附件。因为您只有一个渲染通道,所以每帧也只有一个帧缓冲区。但是,由于最终的子通道将写入交换链图像,因此每个交换链图像都需要一个单独的帧缓冲对象;所有这些帧缓冲器都将是相同的,除了交换链图像附件。

最新更新