02 - 时间上的复用方法
本文将简要介绍RTRT在时间上的降噪/复用技术Motion Vectors
,以及其存在的问题和缓解方法。
Motion Vector
工业界采用 时间上的滤波方法(Temporal),使用递归思维,在滤波当前帧时认为上一帧永远已经滤波好了。它使用Motion Vector
去寻找“上一时刻”的场景,以复用其结果,这样相当于用很大的SPP做光追。
获取场景信息
可以从几何缓冲区(G-Buffer)中获取屏幕空间当前帧的许多信息,如深度、世界坐标、法线等。
Ps:G-Buffer中的信息是最真实正确的信息,即使出现走样也不要做抗锯齿,否则信息就会无效。
求Motion Vector
可以使用 Back Projection 方法求Motion Vector
:对于当前帧i
的像素点x
,如果上一帧i-1
的场景中有这个像素点x'
,那么就能将x'
的结果 时间上复用 到x
上。
Back Projection方法的思路如下:
- 获取当前帧像素点
x
的世界坐标s
。如果有G-Buffer就直接获取相关信息,没有的话需要进行逆MVP变换()。 - 获取上一帧像素点
x'
的世界坐标s'
。定义变换,有 ,那么 s'
可由求得。 - 获取上一帧像素点
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)