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

时间:2019-08-07 15:00:21

标签: c++ vulkan

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

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

还有其他方法吗?

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

我尝试查看SaschaWillems的示例,我认为他正在使用double renderpass方法,但我想知道是否还有另一种方法。

1 个答案:

答案 0 :(得分:0)

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

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

对于交换链帧缓冲区,在首次创建交换链时为每个交换链映像创建一个,然后在每个帧上使用与该帧的交换链映像匹配的帧缓冲区。尽量避免始终破坏和重新创建对象;而是缓存和重用它们-它们是不同的对象是为了使您可以在许多用途上摊销创建成本。 (创建单个子通道渲染通道应该很便宜,但是在至少一种架构上,创建帧缓冲区的成本很高,而在某些体系结构上,多个子通道渲染通道也可能很昂贵。)

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