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(降噪)

    RTRT00

一个光路样本(1 SPP path tracing):

RTRT01

  • 第一步是Rasterization,而不是Ray的原因: 从摄影机发出经过各个像素的光线,即等同于进行一次光栅化,找到Primary hitpoint

    • 第一步如做光线求交,则为光线投射(Ray Casting)。而光线投射和光栅化没有本质区别(都是渲染一点的DI,只不过相当于深度测试被光线求交替代了)

      光线投射

      Ray Casting. 注意和光线追踪的区别,Ray Casting基本只求交一次,而不迭代追踪

RTRT02

  • 传统的降噪方式不是效果不好,就是太慢或不靠谱

b). Temporal denoising(时域降噪)

Denoising01

Key idea:

  • 复用前面已经降噪过的一帧
  • 使用motion vector来找到先前的位置;
  • 本质上是提高采样率;

b.1). G-Buffer

G-Buffer01

b.2). Back Projection

BackProj01

  • 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’$

BackProj03

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)

      TemporalFailure01

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(阴影拖尾)

    Failure01

  • Temporal failure can also happen in shading

    • 如反射滞后;

      Failure02

c). Implementation(实现)

eg. Gaussian filter

Implementation01

  • 滤波核可以不归一化,但对于结果需要归一化;

c.1). Bilateral filtering(双边滤波)

观察:

  • 高斯模糊会将边界模糊,但我们需要保留边界;
  • 边界 = 颜色差异大

目的:

  • 模糊同时保留边界;

  • 当像素$j$ 和像素$i$ 颜色差异大时,$j$贡献变少(权重变小)

    BilateralFiltering01

    • 像素$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是一系列考虑更多标准的滤波方法。

JointBilateralFiltering01

Note:

JointBilateralFiltering02


c.2.1). Example

JointBilateralFiltering_Example01

c.2). Large Filters

对于大的滤波核,性能开销会非常大(e.g. 64x64)

Solution 1: Separate Passes

Large_Solution01

Large_Solution02

  • 将NxN大小的2D高斯核,拆分为 1xN 和 Nx1 的1D高斯核。通过两个Pass进行滤波;(注意: 并不是所有滤波核都可拆分)

原因:

2D高斯核的形式是可拆分的,如下:

Large_Solution03

  • 理论上,双边滤波/联合双边滤波是不可拆分的(实现上,只要滤波核不特别大,如超过32x32,就可采用拆分方法)

Solution 2: Progressively Growing Sizes(逐步增加尺寸)

介绍: 逐Pass增加filter (间隙的)size,类似空洞卷积。第一次间隙为0,第二次间隙为1……

ATW01


原因:

ATW02

  • 逐步增加尺寸: 逐步减小信号的最高频率;

  • 增加采样间隙: 降低采样频率,频谱搬移距离逐渐减小;

    频谱搬移

  • 逻辑: 减少信号高频部分,并增大采样间隙(频谱搬移,将信号左边界搬移到有边界),使得不会产生信号混叠;

d). Outlier Removal(and temporal clamping)

d.1). Introduction

Outlier: 场景中一些特别亮的噪声,即萤火虫噪声;

  • 出现原因: 蒙特卡洛积分时,由于采样率不足,会出现特别亮和特别暗的点;
  • 无法用滤波解决,滤波后仍会存在,甚至从一点变为亮的色块(blocky

  • 解决方法: Outlier removal(clamp)

    OutlierRemoval01

Outlier removal:

  • 应用时间: 滤波之前(但会打破能量守恒,如不想打破就得提高采样率)

d.2). 实现

OutlierRemoval02

  • $\mu$: 均值
  • $\sigma$: 标准差
  • 即将各个点Clamp到一定范围内(如担心光源被clamp掉,可以先不Render光源。Outlier removal之后再加上光源)

之前提到的Temporal Clamping同理:

OutlierRemoval03

  • 将上一帧Clamp向(经过空域降噪)这一帧

e). SVGF(Spatiotemporal Variance-Guided Filtering)

SVGF01

  • 降噪效果好,但仍然有拖影、反射滞后等问题;
  • 在Overblue和更多的noise之间,选择了Overblur

e.1). SVGF — Joint Bilateral Filtering

e.1.1). Depth

SVGF_Depth

  • A、B在同平面深度却差异很大,使得互相之间贡献少。因此,在分母中引入梯度$\nabla z(p)$ ,该梯度为深度在对应点法线方向的变化率(注意:梯度为向量,其方向为法线方向;)。
    • 当平面几乎垂直于屏幕时,$\nabla z(p)$ 变大,使得深度差异对权重的影响变小;

e.1.2). Normal

SVGF_Normal

  • 应使用几何法线,而不使用经过法线扰动的Normal

e.1.3). Luminance(grayscale color value)

SVGF_Color

  • 使用亮度值;

  • 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的结果累积起来

RAE

RAE02

g). Comparison

Comparison