当实时渲染器(例如3D游戏)出现运动模糊时,通常如何实现?

我想我已经听说过需要为每个像素设置运动矢量的情况,但是我不确定并且不确定如何使用。

#1 楼

有几种使用的技术。

一种不再实际使用的简单但有限的后处理方法包括使用当前帧和前一帧的视图投影矩阵来重建像素的世界空间位置。使用这两个值,您可以计算一个像素处的速度并进行相应的模糊处理,并沿着速度矢量采样所需的样本数量(越多的样本采样模糊度,但代价也越高)。

不幸的是,此方法仅考虑摄像机的运动,因此如果您的动态场景中物体快速移动,则该方法不够准确。

正如您所提到的,其他更现代的技术也使用了速度缓冲。

可以在基本管道中的递延管线中创建该速度缓冲,从而使用世界范围内的坐标变换每个顶点前一帧的视图投影矩阵,然后使用两个帧的屏幕空间位置在像素着色器中计算速度矢量。
使用此速度缓冲区,您可以在后处理步骤中跨每个像素采样像素速度方向,就像上述方法I一样。很明显,您将获得的运动模糊不只是相机。但是,您会在内存(需要保留额外的缓冲区)和时间(每像素渲染其他信息)方面产生开销。

McGuire等人特别喜欢一种基于速度缓冲的技术。 IIRC,与虚幻引擎4和其他许多游戏中的某些变体一起使用。



摘自[McGuire等。 2012]

他们将场景划分为多个图块,并假设每个图块具有主导速度。然后,从完整的res速度缓冲区开始,他们为每个图块定位更高幅度的速度矢量,从而生成速度缓冲区的下采样版本,其中1像素= 1个图块。
使用此缓冲区,在另一遍中,他们可以生成一个缓冲区,该缓冲区为每个像素/平铺存储邻域像素之间的主导速度。
请注意,图块的大小基于最大模糊半径。

使用这些缓冲区,然后在邻近主导速度方向上进行收集步骤采样,因为这是每个样本模糊的最合理的方向(正如我所说,图块大小是最大模糊半径)。用于模糊的权重考虑了完整的res速度和深度信息。请注意,本文针对三种不同情况(模糊不清,模糊不清和模糊不清)提出了三种不同的加权。

该方法的另一个重要优点是,如果附近的主导速度小于某个阈值,则可以提前退出。

评论


$ \ begingroup $
链接borken,这里是新的链接:developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch27.html
$ \ endgroup $
– Imskull
19年1月30日在7:52