实时光线追踪和实时全局光照都是光线弹射两次,实时光线追踪在一个像素上只采样一次,即只有一根光线穿过一个像素打到场景内(1SPP),在打到第一个地方叫primary hitpoint,然后从这点向光源连线,判断它是否在阴影内。然后就是从primary hitpoint弹射到另一个物体表面,这一点叫secondary hitpoint,再从这点连向光源判断是否在阴影内。
这里的光线从像素到场景内第一个交点时,用了光栅化来代替,因为光栅化就是一次光线的弹射。
但是由于是1SPP,所以会有非常高的噪声,所以实时光线追踪的主要技术就是降噪。
工业做法是滤波,其核心思想是:假设前一帧是做好滤波处理的,这里使用了motion vectors的概念,motion vectors能够找到当前帧某个点在上一帧的位置,然后使用上一帧所滤波好的结果。
The G-Buffers:Geometry buffer,可以很容易的获得像素对应深度、法向量、世界坐标,这是在屏幕空间下。
Back Projection:在当前这一帧某个像素所对应场景内的点,获得前一帧这个点所对应的像素。
有两种方法:第一种方法是用G-buffer,可以很容易的得到在某个点的空间坐标,如果物体是在运动,也需要算出前一帧物体上那个点的坐标,然后MVPE计算出在屏幕上的坐标,还有一个就是MVPE的逆变化算出空间坐标,然后再用MVPE计算出在屏幕上的坐标。当然G-buffer会更加容易。motion vector就是上一帧的空间坐标。
字母头上的 ~代表没有滤波,-代表还没有滤波,在得到motion vector后,用前一帧和当前帧的滤波做线性求和,就是当前帧最后的滤波结果。当前帧自己也会滤波,但再怎么滤波,由于是1SPP,效果都会非常差,所以上一帧的滤波结果占了大部分比例。但如果是运动中的物体,也会有问题。
但是会有一些问题,比如场景切换问题,这样上一帧就不能用到当前帧了。
当摄像机在往后运动,会有更多的场景进入视线范围内。这样的话前一帧就是空白的。
在下图中,左边是上一帧,右边是当前帧,箱子被推向左边,是在运动的。图中蓝色点在后面的一个白色物体上面,通过motion vector可计算出在上一帧的位置,但上一帧中这个位置却在箱子上,后面的白色物体被遮挡了。这是如果使用上一帧的滤波来处理就会发生问题。
如果忽略这问题,依然使用上一帧来放到下一帧中,上一帧占到90%左右,这时箱子的表面就会留到后面的白色物体上,也就是留下残影。
有两种调整方案:Clamping,以上面的例子,它是把上一帧的箱子向蓝色点拉近,然后再进行线性计算。
Detection,通过motion vector计算出当前帧位置和前一帧所在位置不是同一个物体时,就可以不用前一帧了,但这样会有高噪声的问题,因为只有当前帧的滤波了。