06 Real-Time Ray-Tracing

1. Tempora

  • 1 SPP 包含如下四条光线。但是一个像素只用1spp会噪声很严重。
  • 因此RTRT的主要目的是降噪,即滤波。

1.1 时间复用Tempora

  • G-Buffer几何缓冲区:记录屏幕空间的信息;在光栅化的时候顺便得到。
  • Back Projection

    首先,拿到当前帧像素的世界坐标,可以从G-buffer中拿到,否则可以通过逆MVPE变化得到。然后,通过记录的坐标变化矩阵T,得到上一帧对应的世界坐标。然后经过epvm变换得到上一帧的屏幕空间坐标。相应的就得到了motion vector。
  • Denosing:首先,当前帧做一次空间降噪,当然效果不会很好;然后,将当前帧降噪后的像素与上一帧的对应的没有噪声的像素做一次线性插值,即时间降噪。一般的,平衡系数\(\alpha\)取0.1-0.2,即当前帧只占据了最多20%的贡献,主力在于上一帧。

1.2 Temporal Failure

(1) 问题1:几何

  • burn-in period:切换场景或者镜头之后,需要一段时间来预热。
  • screen space issue:当倒退走的时候,会不断出现新的信息,这些点在上一帧没有对应信息
  • disocclusion:当遮挡关系发生变化时,会出现新的信息,此外,旧的信息有部分被遮挡;会造成拖尾。

(2) 方法1

如果上一帧对应的像素颜色与当前帧的颜色差异很大,通过增大当前帧的空间滤波效果,来减小这个影响,当然,会造成噪声比较明显。

  • Clamping:在当前noisy帧的该像素周围取7x7范围,得到均值与标准差,然后确定一个合理的范围,如果上一帧的颜色超出这一个范围,则相信当前帧的统计学结果,对上一帧的像素颜色做clamp。
  • Detecting

(3) 问题2:阴影

光源移动而物体不移动时,则shadow point的motion vecctor不会计入光源变化信息,即0,所以阴影会有拖尾。

2. Spatial Filter

  • 低通滤波器:问题一,高频也可能含有信息;问题二。低频也可能有噪声

2.1 Gaussian Filter

  • 周围的pixel对该像素的贡献逐渐减小。
  • 对于任意像素,定义其权重和与加权值和;然后对于像素i周围的像素j以及自身,根据ij距离计算高斯值,即j的贡献权重;然后将加权贡献值加到总加权值和上,并将贡献加权加到权重和上;最后做归一化,可以保证filter之后的能量不会明显变化,为此就不需要考虑滤波核是否归一化。此外,gauss的变化是无限远有值的,一般的取\(3\sigma\)。如果权重和为零,即没有贡献,则该像素的值为零。此外,该过程可以是多通道的,即加权值是多通道的,而quantitie权值和是单通道的(只与距离有关)。

2.2 Bilateral filtering 双边滤波

  • gaussian filter会去除高频信息,那么就会把边界给模糊。
  • 将颜色变化剧烈地方视作边界,然后将其贡献变少。如下,左边是对距离距离的gaussian kernal,右边是对颜色距离的gaussian kernal。

    效果如下。
  • 但是噪声本来就变化剧烈,因此会与边界混淆。

2.3 Cross/Joint Bilateral filtering 联合双边滤波

  • 使用不止颜色的多种特征进行双边滤波
  • 比如法线、空间位置、深度、albedo等信息,即G-buffer,很容易能够拿到。
  • 颜色本身有噪声,但是G-buffer没有噪声。
  • 不必要使用高斯,只要该函数随着距离减小就可以。即便是高斯,也没有必要严格遵守其公式。
  • 从双边滤波的公式可见,不同的高斯项是在指数上相加,即对应分布相乘;联合双边滤波的各个特征的分布就是相乘的;不同的特征有自己的高斯分布,主要由各自的\(\sigma\)决定,该参数的大小影响该特征的贡献。对于每一个高斯分布,可以不必要分布很窄很严格,可以给出一个宽松的分布,然后获得一个比较好的组合效果。

2.4 Large Filter

  • 当filter很大时,即kernal比较大,相应的计算量就会增加

(1) Separate Passes

  • 先做水平模糊,再做竖直模糊。因此将nxn计算变成2n计算。
  • 这样做是因为2D的高斯核是可拆分的。进一步的,当高斯可拆分就可以将二维卷积变成两步一维卷积。
  • 但是,双边滤波与联合双边滤波就不可以拆分了。然而实际引用中,当filter不是非常大时还是可以拆分的。

(2) Progressively Growing Sizes

  • A-trous Wavelet:对于任何一个像素,每次都做相同尺寸的filter5x5,然后每次间隔翻倍,即第i次的间隔是\(2^i\)。那么,第五次就可以实现64x64的filter,而每个像素计算量只需要25x5。
  • 逐步增加间隔而不是直接使用大的间隔,是因为对高频滤波成分逐步滤除。
  • 此外,直接对大间隔做采样会造成走样。相应的,进行低通滤波之后,频带就会减小,对采样频率的要求会降低,在下一次采样频率减小一倍之后频带就不易发生混叠。
  • 实际上,采用联合双边滤波之后,会保留部分高频成分,在下一次处理后会有问题。

2.5 Outlier Removal

  • 使用蒙特卡洛方法可能会有很亮的点outlier,即值很大,那么filter之后该亮点会扩散到周围。
  • 因此需要在滤波之前处理outlier,当然这会使得能量不守恒,但是这是RTRT需要的。
  • Outlier detection:使用7x7计算均值与方差,认为大多数像素的范围应该处于均值加减标准差倍数的范围内,k取1-3,如果不在范围内则是太亮或者太暗。
  • 如果超过范围,则将该像素的值clamp到这个范围,按照超出方式给定上界或者下界。
  • 光源本身也可能会被removal掉,所以可以将光源的rendering在其他进行之后进行。

3. SVGF(Spatialtemporal Variance-Guided Filtering)

3.1 Three Factors

(1) depth

  • 这是一个指数衰减的分布,而非高斯,其中\(\epsilon\)是一个小值用于避免除以零,\(\sigma _z\)用于控制衰减速度。A与B在同一面上,但是深度差距很大,会被判断为不应该有大的贡献。但是他们在法线上的深度差异不大,因此考察他们在其中一个点的深度梯度(一般处于切平面上)上投影位置对应的深度差异,并将原本的深度除以这个深度,如果他们在同一个平面上,那么显然这两点的连线矢量与其中一点的深度梯度矢量相同,则其内积是最大的,相应的将原来的深度进行了最大程度的衰减,而对于不在同一平面的深度其内积相应的是比较小的,那么衰减就会更小,此时的大深度才是预期的应当发挥作用的大深度。

(2) Normal

  • 对法线取内积,相当于计算cosine,相应的给出指数,为了能够加快cosine衰减;当然还要做0下界。
  • 如果使用法线贴图,那么变化就会很大,就会使得判断出现问题,所以不用。

(3) Luminance

  • 由于噪声,会使得color特征存在问题。因此,对颜色差异除以滤波中心点的标准差,即如果差异很大,即noisy,则不相信周围的点的颜色差异。
  • 一般的先做一次spacial,再做temporal,然后再做一次spacial。

3.2 Failure Case

  • 无法解决阴影拖尾

4. RAE(Recurrent AutoEncoder) 递归自编码器


  • 没有使用MotionVector,所以不存在相应的问题。
  • 问题会有很多

来源

Games202

posted @ 2023-05-02 20:41  ETHERovo  阅读(32)  评论(0编辑  收藏  举报