02 - 时间上的复用方法

本文将简要介绍RTRT在时间上的降噪/复用技术Motion Vectors,以及其存在的问题和缓解方法。

Motion Vector

工业界采用 时间上的滤波方法(Temporal),使用递归思维,在滤波当前帧时认为上一帧永远已经滤波好了。它使用Motion Vector去寻找“上一时刻”的场景,以复用其结果,这样相当于用很大的SPP做光追。

Motion Vector

获取场景信息

可以从几何缓冲区(G-Buffer)中获取屏幕空间当前帧的许多信息,如深度、世界坐标、法线等。

Ps:G-Buffer中的信息是最真实正确的信息,即使出现走样也不要做抗锯齿,否则信息就会无效。

求Motion Vector

可以使用 Back Projection 方法求Motion Vector:对于当前帧i的像素点x,如果上一帧i-1的场景中有这个像素点x',那么就能将x'的结果 时间上复用x上。

Back Projection方法的思路如下:

  1. 获取当前帧像素点x的世界坐标s。如果有G-Buffer就直接获取相关信息,没有的话需要进行逆MVP变换()。
  2. 获取上一帧像素点x'的世界坐标s'。定义变换,有,那么s'可由求得。
  3. 获取上一帧像素点x'是视口变换的逆变换)。

降噪

求得Motion Vector后,就能对结果进行降噪了。最简单的方式是 线性混合

  • 。对于当前帧,先自己降噪一下(空间上的降噪方法,下篇文章会提)。
  • 。使用线性混合方法,将当前帧和上一帧的结果混合起来。其中,即有80%~90%的贡献来自上一帧的结果。

可以发现降噪后的效果确实不错。

存在的问题

Motion Vector这一方法有时候是不可用的,例如:

  • 瞬间切换的场景:会出现 预热问题(burn-in period),瞬间切换的场景导致几乎无法复用上一帧的内容。

  • 信息逐渐增多的场景:如在走廊倒着走,这是屏幕空间内&外的信息缺失问题(screen space issue)

  • 突然出现的背景物:如物体在移动时它背后的背景物突然 不被遮挡(disocclusion)。如果强行应用Motion Vector,会出现 残影(Lagging)现象。

  • Detached阴影问题:着色时的静态物阴影问题,光源移动时阴影会出现问题。

  • 延迟反射:对于Glossy材质的物体,其他物体移动时,反射在该物体上的“物体”会延迟移动。

解决思路

从上面的降噪公式出发:

  • Clamping:对上一帧结果进行“拉近”操作,让其接近当前帧结果,然后才做线性混合操作。有关clamp()的操作范围,可取当前帧像素周围一定像素的均值和方差,然后映射到之间。
  • Detection:利用可渲染物体ID去寻找时间复用不可用的情况。如果发现的话就调节公式的为0~1,并且增大空间上的复用。不过这样有可能重新引入噪声。

参考资料

  • GAMES202: 高质量实时渲染 (ucsb.edu)