Games202 Real-time Ray Tracing
Real-time Ray Tracing
无论是软阴影还是全局光照,光线追踪都很容易做,唯一的缺点就是速度太慢了,所以如何把光线追踪做到实时人们进行了大量的研究
SPP:
sample per pixel,spp,它代表一个光路的样本。
第一条是视角看过去的光线(未画出),这个可以用光栅化方法做,速度更快
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 性能稳定