Real-time Ray Tracing

无论是软阴影还是全局光照,光线追踪都很容易做,唯一的缺点就是速度太慢了,所以如何把光线追踪做到实时人们进行了大量的研究

SPP:

sample per pixelspp,它代表一个光路的样本。

第一条是视角看过去的光线(未画出),这个可以用光栅化方法做,速度更快

Denoising:

那么我们上面提到了 1 spp,现代的硬件已经允许我们去做 1 spp 的路径追踪了,但是我们之前介绍过路径追踪,如果 spp 只有 1 的话,那么得出的结果是有严重的噪声的。所以 RTRT 的关键技术其实就是降噪

Temporal accumulation / filtering

首先我们是假设画面变化是连续的而没有突变,帧和帧之间有一定的连续性,其次我们认为当前帧的前一帧是已经被滤波好了的,也就是一个递归的思想,这是 Temporal filtering 的一个基本思路。

Motion vector

Motion vector:对应上一帧和当前帧任意一个点的对应位置,上一帧已经滤波好了的画面可以拿到当前帧复用

G-Buffer

屏幕空间上储存的一系列信息,如深度图,法线图,世界坐标,基础色 (kd) 等等。也就是我们渲染的过程中可以免费得到的一些信息,也就是生成储存它们不需要太大的开销

Back Projection

通常在 G-Buffer 里已经有了,如果没有也可以通过 MVPE 矩阵逆变换去找到某个点的世界坐标。

再通过 T 的逆变换知道上一帧的世界坐标,然后再计算上一帧的屏幕坐标,从而得到 Motion Vector

Temporal Accum. / Denoising

先把当前帧降噪,再结合上一帧降噪(上一帧贡献更大)

Temporal Failure

  • 切换场景
  • 倒退着走或者移动某个障碍物(视角中内容变多,会有新的信息显示在屏幕中)

产生拖影(Lagging)

对于地面而言是不动的,只有光和阴影在动,我们只有物体的 motion vector 而没有阴影的

同理对于 Glossy Reflected Image 的 motion vector 也不知道

Adjustments to Temp. Failure

Temporal Clamping And Detection

Clamping:调整 α 的值,使得当前帧的贡献更大一些

Detection:假设我们Motion vector找对应物体的ID不同,我们就不去采用上一帧的信息。而如果检测不能用,我们就需要调整 blending 中 α 的值了,让本帧的贡献更高一些

这两种方法会造成噪声增加

Filter

高斯滤波

空域滤波

双边滤波

Bilateral Filtering

高斯滤波会模糊图片,双边滤波在细节处减少高斯滤波的权重或1不使用。

但是不好区分高频的到底是噪声还是边界

联合双边滤波

Joint Bilateral Filtering

通过 G-buffer 中的免费信息(这是没有噪声的)来做判断

  • A-B:深度不一样,不考虑之间的贡献
  • B-C:法线不一样,不考虑之间的贡献
  • D-E:颜色不一样,不考虑之间的贡献

Large Filters

方法一:为了减小开销,将 n * n 的滤波核变成两次滤波一次 横向 1 * n,一次纵向 n * 1

方法二:

Outlier Removal

在 filter 之前做

对一个像素周围一圈范围内进行计算,以 7x7 为例那就是计算 7x7 个像素值的均值μ方差σ,并且我们认为这里面的所有像素的值都应该在 [μ-kσ,μ+kσ] 范围内。自然其中如果有像素超过了这个范围,我们就认为这是一个 Outlier

Clamp:

假设 μ=0σ=0.1,那么范围就是 -0.1~0.1,此时假设有一个像素的值为 10 就把它 Clamp 到 0.1,如果是 -1 就把它变成 -0.1。这样我们就在滤波之前把 Outlier 去掉了

SVGF

Spatiotemporal Variance-Guided Filtering

深度:深度中 ▽ 项是考虑到 A 和 B 深度不一样。但其在同一平面上,在法线方向的深度是差不多的,所以需要这一项来平衡。σz 是一个参数,控制衰减的强度,而 ϵ 是为了防止分母为0的情况加上的一个小的常数。

法线:与布林冯模型的高光相同的,从0截断,并且加上一个指数σz控制衰减速度

颜色:两点的颜色灰度差异可以判断两点之间没有贡献,但是如果 B 点恰巧在白色的噪点上,那么 A,B 将会被误认为是有贡献,这时候就需要 B 点的方差来进一步判断此时 B 点的颜色是真的颜色值还是噪点了

计算方差:首先在一切开始之前先计算一次该点的方差,比如 7x7 范围内的,之后我们还可以通过 temporal,通过在时间上的累计计算平滑的方差,最后在使用之前我们再取一个小范围比如 3x3 做平均,最后作为颜色差异滤波核的分母根号项

即当 B 标准差比较大,就不太愿意相信这两个点有颜色差异

RAE

利用神经网络

SVGF vs. RAE

SVGF 更快、质量更高,但是都有残影

RAE 对于高 SPP 性能稳定