Games202-6 Real-time Ray-Tracing
a). Introduction
Real-time Ray-Tracing vs. Ray-Tracing:
Real-time Ray-Tracing == 1/few sample per pixel(SPP)
Key technology: Denoising(降噪)
一个光路样本(1 SPP path tracing):
第一步是Rasterization,而不是Ray的原因: 从摄影机发出经过各个像素的光线,即等同于进行一次光栅化,找到Primary hitpoint
第一步如做光线求交,则为光线投射(Ray Casting)。而光线投射和光栅化没有本质区别(都是渲染一点的DI,只不过相当于深度测试被光线求交替代了)
Ray Casting. 注意和光线追踪的区别,Ray Casting基本只求交一次,而不迭代追踪 ↩
- 传统的降噪方式不是效果不好,就是太慢或不靠谱
b). Temporal denoising(时域降噪)
Key idea:
- 复用前面已经降噪过的一帧;
- 使用motion vector来找到先前的位置;
- 本质上是提高采样率;
b.1). G-Buffer
b.2). Back Projection
- Key idea:不同帧之间相同的点,意味着有着相同的世界位置(如不移动)或模型空间位置;
How:
- 如果世界坐标 $s$ 存在于G-Buffer中,即可直接使用;
- 否则,$s = M^{-1}V^{-1}P^{-1}E^{-1}x$ ($E$ 为视口变换,即NDF到Viewport/Screen)
- 运动(Motion)情况已知,$s’ = T^{-1} s$,$s’$ 为运动前的位置,$T$ 为运动的矩阵
- 在 $i-1$ 帧,$s$ 对应的屏幕空间位置为 $x’=P’V’M’s’$
b.3). issues
Failure case 1: 切换场景
- burn-in period(即需要一定时间积累降噪质量足够好的帧,如UE中的burn-in)
Failure case 2: walking backwards in a hallway
- screen space issue(当前帧出现上一帧屏幕外的信息)
Failure case 3: suddenly appearing background
disocclusion(上一帧被遮挡的物体,当前帧未被遮挡)
可能造成拖尾(lagging)
b.4). Adjustments to Temp. Failure
Clamping
- Clamp上一帧的信息,使其接近当前帧。即Clamp $C^{(i-1)}$
Detection(即不符合要求时,不使用Temp. denoising)
- Use e.g. object ID to detect temporal failure(ID通道)
- 调整$\alpha$,上一帧不可靠时,调高$\alpha$
- Problem:重新引入更多噪声;
- 可能需要增强空域降噪;
b.5). More Temporal Failure
Detaching/lagging shadows(阴影拖尾)
Temporal failure can also happen in shading
如反射滞后;
c). Implementation(实现)
eg. Gaussian filter
- 滤波核可以不归一化,但对于结果需要归一化;
c.1). Bilateral filtering(双边滤波)
观察:
- 高斯模糊会将边界模糊,但我们需要保留边界;
- 边界 = 颜色差异大
目的:
模糊同时保留边界;
当像素$j$ 和像素$i$ 颜色差异大时,$j$贡献变少(权重变小)
- 像素$a$ 位置为$(i,j)$,像素$b$ 位置为$(k,l)$;
- $I(i,j)$ 表示$(i,j)$位置的像素值;
- $\sigma$ 控制对应项的作用范围,其值越大,对应项的局部影响范围就越大,分子变化影响越小
- 类似于两个不同形式的高斯核相乘(指数相加),即两个标准(距离,颜色),2 metrics
- 可以根据需求调整,如较为看重color dist. 对weight的影响,就可以将第二项的2 调为 1;
c.2). Joint Bilateral filtering(联合双边滤波)
观察:
- Gaussian filtering: 1 metric (distance)
- Bilateral filtering: 2 metrics (position dist. & color dist.)
- 因此,我们可以考虑更多的标准(metric),丰富滤波核,进行滤波(Key idea)
定义:Joint Bilateral filtering是一系列考虑更多标准的滤波方法。
Note:
c.2.1). Example
c.2). Large Filters
对于大的滤波核,性能开销会非常大(e.g. 64x64)
Solution 1: Separate Passes
- 将NxN大小的2D高斯核,拆分为 1xN 和 Nx1 的1D高斯核。通过两个Pass进行滤波;(注意: 并不是所有滤波核都可拆分)
原因:
2D高斯核的形式是可拆分的,如下:
- 理论上,双边滤波/联合双边滤波是不可拆分的(实现上,只要滤波核不特别大,如超过32x32,就可采用拆分方法)
Solution 2: Progressively Growing Sizes(逐步增加尺寸)
介绍: 逐Pass增加filter (间隙的)size,类似空洞卷积。第一次间隙为0,第二次间隙为1……
原因:
逐步增加尺寸: 逐步减小信号的最高频率;
增加采样间隙: 降低采样频率,频谱搬移距离逐渐减小;
- 逻辑: 减少信号高频部分,并增大采样间隙(频谱搬移,将信号左边界搬移到有边界),使得不会产生信号混叠;
d). Outlier Removal(and temporal clamping)
d.1). Introduction
Outlier: 场景中一些特别亮的噪声,即萤火虫噪声;
- 出现原因: 蒙特卡洛积分时,由于采样率不足,会出现特别亮和特别暗的点;
无法用滤波解决,滤波后仍会存在,甚至从一点变为亮的色块(blocky)
解决方法: Outlier removal(clamp)
Outlier removal:
- 应用时间: 滤波之前(但会打破能量守恒,如不想打破就得提高采样率)
d.2). 实现
- $\mu$: 均值
- $\sigma$: 标准差
- 即将各个点Clamp到一定范围内(如担心光源被clamp掉,可以先不Render光源。Outlier removal之后再加上光源)
之前提到的Temporal Clamping同理:
- 将上一帧Clamp向(经过空域降噪)这一帧
e). SVGF(Spatiotemporal Variance-Guided Filtering)
- 降噪效果好,但仍然有拖影、反射滞后等问题;
- 在Overblue和更多的noise之间,选择了Overblur
e.1). SVGF — Joint Bilateral Filtering
e.1.1). Depth
- A、B在同平面深度却差异很大,使得互相之间贡献少。因此,在分母中引入梯度$\nabla z(p)$ ,该梯度为深度在对应点法线方向的变化率(注意:梯度为向量,其方向为法线方向;)。
- 当平面几乎垂直于屏幕时,$\nabla z(p)$ 变大,使得深度差异对权重的影响变小;
e.1.2). Normal
- 应使用几何法线,而不使用经过法线扰动的Normal
e.1.3). Luminance(grayscale color value)
使用亮度值;
Variance:
Step1: 计算空域中7x7的方差;
Step2: 通过motion vectors在时域上平均(类似时域降噪);
- Step3: 对平均后的结果再在空域上3x3的范围内平均;
- 即,spatial filter —> temporal filter —> spatial filter
f). RAE(Recurrent AutoEncoder)
- 一种结构,对Monte carlo路径追踪得到的结果进行reconstruction-对RTRT做滤波。
- 后期处理,把noise的图变clean。
- 使用G-buffers
- 神经网络会自动将temporal的结果累积起来