八 实时渲染中常用的工业界技术¶
本课程为闫令琪老师的 GAMES202-高质量实时渲染
此为个人的课堂笔记,如有疏漏,请多指正
1 抗锯齿(反走样)Anti-Aliasing (AA)¶
走样 Aliasing 的根本原因在于光栅化过程中对于每个像素的采样数不足。因此最终极的解决方案就是使用更多的采样数,也就是超采样 Supersampling
在介绍抗锯齿技术前需要注意的一点:对于 G-buffer 内的信息绝对不可以进行反走样,因为其并不是走样,而是深度、法线等信息就是可能呈“锯齿状”的
1)超采样抗锯齿 Supersample Anti-Aliasing (SSAA)¶
SSAA 是一种特别直观暴力的解决方案,其直接将场景以数倍的分辨率进行采样和渲染,然后再降采样到当前所需的分辨率上。但是其会带来很显著的采样开销,放大多少倍的分辨率就会增加多少倍的性能消耗,导致明显的掉帧现象
2)多重采样抗锯齿 Multisample Anti-Aliasing (MSAA)¶
MSAA 是在 SSAA 的基础上进行的改进。其对于同一个几何体 primitive 中的所有采样点只会做一个平均的 shading,而不像 SSAA 每一个采样点都会进行着色。以下图为例,对于 0、2、3 这三个位于同一个 primitive 的采样点,其只会综合平均计算一次中间绿色 A点 的着色,对于 1 这个位于另一个 primitive 的采样点单独做一次着色,这样 shading 的次数就从 SSAA 的 4次 降低到了 2次:

此外,MSAA 还会在空间上复用跨越多个像素的采样点信息。以下图为例,通过复用中间两个绿色采样点,使得以 6次 实际采样得到了 8个 采样点结果:

3)时间域抗锯齿 Temporal Anti-Aliasing (TAA)¶
RTRT 中的时间域降噪算法里的思想就来源于 TAA,其主要就是在时间域上通过跨越渲染帧进行采样来复用采样点。TAA 使用的是 Jittered Sampling 的方法去复用上一帧的采样点。以下图为例,在第一帧将采样点分布在像素的左上角、第二帧右上角、第三帧右下角、第四帧左下角,然后每一帧进行 shading 的时候,对于每一个像素都复用其本帧、上一帧、上上帧和上上上帧的采样结果,将其平均的结果输出。这样就在不增加性能消耗的前提下,实现了一个 4倍 的采样

上述过程是在静止状态下进行的,如果画面是运动的,则参考在时间域降噪算法中的 motion vector 的思想,将其在图像中应用即可
4)增强型子像素形态学抗锯齿 Enhanced Subpixel Morphological Anti-Aliasing (SMAA)¶
SMAA 是基于图像的抗锯齿解决方案,先渲染出有锯齿的图像,然后通过图像处理的方法将锯齿给提取出来并替换成没有锯齿的图。其是从 FXAA 优化到 MLAA (Morphological AA) 再优化到目前的 SMAA 的,实现速度特别快。其核心思想是对有锯齿的图像模拟其可能的理想无锯齿图像,然后根据无锯齿图像的边界来对原本的有锯齿图像的像素按照百分比进行着色:

5)时间域超分辨率 Temporal Super Resolution¶
Super Resolution 也就是 Super Sampling,核心就是将低分辨率的图像转变为高分辨率的图像,主要应用的技术就是深度学习超采样技术 DLSS
(1)DLSS 1.0¶
只有当前帧的图像信息,没有其他额外信息,因此转换分辨率全靠深度学习硬猜(通过学习一些常见的场景及其物体边缘),最终实现效果并不好
(2)DLSS 2.0¶
在 DLSS 1.0 的基础上,将时间域的信息也加入了计算,其核心其实就是对于 TAA 的应用
但是由于 DLSS 最终是需要实现提升分辨率这个目标,每一次 Temporal 的采样都必须确保是 clear 的才能应用到一个更高的分辨率上,即每个像素点所应用的采样值其实只有一个,不能再对 Temporal Failure 进行 Clamp 处理,避免出现模糊的问题(在 TAA 中可以允许 Failure 是因为它增加采样数之后还是会降采样到当前分辨率上,每个像素最后是一个平均值,并不会因为一个采样点的 Failure 的 Clamp 而出现大问题)

因此,DLSS 2.0 就是要根据上一帧和这一帧的采样信息,通过深度学习网络输出一个质量高可信任的 Temporal 采样信息的复用方案:

2 延迟渲染 Deferred Shading¶
延迟渲染的目标是让 shading 过程所需的时间变少,效率变高。其主要思想是将 shading 的过程拆分到两个 Pass 中,利用第一个 Pass 记录的深度信息来在第二个 Pass 中只渲染那些最终会出现在屏幕上的片元,避免在那些会被覆盖上的片元上浪费渲染时间
- 第一个 Pass 只进行光栅化,得到片元 fragment 后不进行 shading,只记录其深度信息,对深度缓存进行更新
- 第二个 Pass 正常进行整个渲染流程,由于深度缓存中已经记录了最终会渲染到屏幕上的片元,因此只会对唯一通过了深度测试的那个 fragment 进行 shading
上述过程能够节省时间的前提事实是:光栅化 rasterizing 的速度比着色 shading 的速度要快得多
通过延迟渲染,可以将原先 O(#fragment * #light) 的时间复杂度降低到 O(#visible fragment * #light)
延迟渲染存在的问题:
由于所有片元深度信息只会在的第一个 Pass 中保留,到了第二个 Pass 中进行光照着色阶段时,由于片元深度、位置等信息的缺失,无法确定片元的几何边缘,从而导致 MSAA 的超采样过程无法执行(如果强制执行的话,其实就是不需要考虑片元位置信息的 SSAA 了)。因此,延迟渲染是不支持 MSAA 的,详细分析可以参考以下这篇文章:延迟渲染与MSAA的那些事 - 知乎 (zhihu.com)
不过,TAA 并不受此限制,所以由于现在 TAA 的广泛使用,延迟渲染的抗锯齿已经不是大问题了
3 Tiled Shading & Clustered Shading¶
1)Tiled Shading¶
Tiled Shading 是基于延迟渲染的思想,将屏幕分割成若干的小块,每一个小块进行单独的渲染流程,从而降低每个小块需要考虑的光源的数量。如果对裁剪空间进行俯视角观察,就可以发现每一个小块是一个长条状空间,每一个长条状空间可能会和部分光源有交集(因为光源的光照往往是一个有范围的衰减值):

通过 Tiled Shading 可以将延迟渲染原本 O(#visible fragment * #light) 的时间复杂度降低到 O(#visible fragment * avg #light per tile)
2)Clustered Shading¶
Clustered Shading 是在 Tiled Shading 的基础上再将已经切分出的长条状空间再切分成块状空间,进一步降低每一个小块需要考虑的光源数量:

通过 Clustered Shading 可以将延迟渲染原本 O(#visible fragment * avg #light per tile) 的时间复杂度降低到 O(#visible fragment * avg #light per cluster)
4 Level of Detail Solution (LOD)¶
渲染 3D 模型时,受限于计算性能,需要兼顾渲染效率和渲染质量。比如当模型在远处时,渲染质量的好坏对观感的影响比较小,因此可以降低渲染精度,减少计算性能消耗。这就涉及到使用网格简化算法来在不同情况下生成不同细节层次 (Level Of Detail, LOD) 的模型。大部分情况下,被减少的视角效果不会被注意到,因为对于非常远的物体或者快速移动的物体的影响是非常小的。例如纹理的 MipMap 就是典型的 LOD Solution
LOD 的核心就是在计算过程中能够快速准确的找出一个正确的 level 运算以简化计算量(工业界称这种利用 LOD 的思路为 cascaded 思路)
以 Shadow Map 的 MipMap 为例,离摄像头越远的物体越可以使用精度更低的 Shadow Map 来生成阴影。在实际应用中,往往是生成少量几个不同分辨率的 Shadow Map,同时为了平滑过渡避免精度的突变,可以将两个相邻的 Shadow Map 重叠起来并取插值进行 Blend:

在 LPV 中也可以使用 LOD 的思想,在 Light Propagation 的过程中对三维网格块进行精度不同的层级的区分,离摄像机越远的地方使用精度更低的三维网格块

LOD 的使用最关键的问题在于转换 Trasition 时如何平滑过渡,一般是通过重叠和 Blend 临近区域的信息来实现。而如果是几何模型使用的 LOD 导致过渡时的 Poping artifacts,则可以直接交给 TAA 进行抗锯齿处理而不需要额外操作
5 全局光照解决方案 Global Illumination Solutions¶
由于想要真正实现完美的全局光照目前只能靠实时光线追踪,但是受限于硬件性能不可能采取此方案。因此工业界选择的是将多种全局光照的技术结合起来使用
例如可以使用 Software Ray-Tracing:
- 首先使用高质量的 SDF 来对近处的着色点进行光追*
- 而对于场景远处的着色点则使用低质量的 SDF 进行光追*
- 对于场景中一些特别强的方向光源或者点光源使用 RSM 算法计算间接光照*
- 再结合使用 Dynamic Diffuse GI (DDGI) 技术
再结合 Hardware Ray-Tracing:
- 由于间接光照并需要特别高的精度,可以不使用场景原始的几何,而是使用低精度的几何代替来加速 Ray-Tracing*
- 还有利用 Probes 的技术 (RTXGI)
上述标 * 的方案结合在一起就是当前 UE5 的 Lumen 实现的基本原理
写在最后的话:
十分感谢GAMES平台,十分感谢闫令琪老师(巨佬)的无私教导,十分感谢网上各位大佬的总结和分享,那不然我都不敢想自己的图形学学习之路会有多么崎岖(考虑到现在过了一遍202仍然一头雾水啥也不会的情况)
希望大家在图形学之路上互帮互助,共同进步
由于本人才疏学浅,本系列笔记肯定有很多错误,麻烦大家帮忙指出
2023年7月 ziao德