跳转至

6 Practical Industrial Solutions

6.1 Temporal Anti-Aliasing (TAA)

时间抗锯齿(TAA)通过在多帧之间分布或复用采样点,利用时间维度弥补单帧采样不足的问题。

这里采样点的选取并不是随机的,而是固定选取的。

TAA 虽然每一帧只取了一个采样点,但是相当于实现了 SSAA

至于当场景发生变动的情况,还是引入 Motion Vector 来完成像素的对应,还有出现相应问题的时候适当地做 clamp,这一部分的处理与上一节中Temporal accumulation 的处理是类似的。

MSAA vs SSAA

SSAA(超级采样)是最直接有效的方法——通过渲染更高分辨率图像再下采样来获得平滑边缘,但计算成本极高;

而MSAA(多重采样)则在性能上做了优化:一个primitive 只着色一次,然后对像素内的多个采样点进行几何覆盖性判断,从而得到着色结果

当前较好的基于图像的反走样方法是 SMAA (Enhanced subpixel morphological AA),由 FXAA 和 MLAA (Morphological AA) 发展而来。

G-buffer

G-buffer(几何缓冲区)中存储的原始几何数据(如深度、法线、物体ID等)必须保持“锐利”和“精确”,绝对不能直接应用模糊类的抗锯齿算法(如FXAA、高斯模糊等)

如果对 G-buffer 做了 anti-aliasing,会造成以下错误:

  • 深度值(Depth)模糊 = 阴影和遮挡错误,因为深度值代表精确的距离。在物体边缘,深度值应该发生突变(从近到远)。如果模糊了深度,边缘处的深度值会变成“中间值”(例如一半在近处物体,一半在远处背景)。光照计算时,光线会误判表面位置,导致阴影漂浮或错误的自遮挡。

  • 法线(Normal)模糊 = 光照计算失真。法线决定光线如何反射。在硬表面边缘,法线方向是截然不同的。:如果混合了两个不同朝向的法线,得到的新法线指向一个“不存在”的方向。

错误不胜枚举~

6.2 DLSS

DLSS(深度学习超级采样)是一种基于时序信息的超分辨率技术,直观地理解就是增加分辨率的一种方式

  • 早期版本(DLSS 1.0)依赖神经网络“凭空猜测”高分辨率像素,效果不稳定;
  • 而 DLSS 2.0 则转向更可靠的方法——它本质上是“另一种 TAA 式应用”,通过在时间维度上复用多帧采样数据,结合运动矢量与历史帧信息,智能重建更高清晰度的画面。

DLSS 2.0 的核心挑战在于:当时间重投影失败时(如物体快速运动或遮挡变化),传统 TAA 所用的“钳制”(clamping)策略不再适用——因为超分辨率需要为每个更小的目标像素生成清晰、独立的值,而非简单混合邻域。因此,其关键技术突破是 smarter 地利用时序信息

DLSS 在 540p 上的应用得到的结果甚至比原先 1080p 的效果还要好

6.3 Deferred Shading

我们可以观察到,在光栅化过程中有很多着色是无效的,因为会被更靠近屏幕物体所挡住。所以为什么我们不选择先进行深度测试,得到可见的那部分片段,然后再进行着色呢?这就是所谓 Deferred Shading 的思想。

具体实现细节可以参考 延迟着色法 - LearnOpenGL CN

延迟着色法可以说是一个纯优化的方法,所以其能够被广泛的采用。要说其唯一的缺陷就是很难做反走样。因为着色相关的信息都是存在 G-buffer 中的,由 6.1 节我们可以知道 G-buffer 是不可以 anti-aliasing 的。一个可行的解决方案是 TAA,利用时间域累积和历史帧信息来平滑画面。


我们知道光源对远距离的物体的着色影响很小,那么紧接着上述的思想,是否可以对多光源场景下的一些无效光源也进行筛选呢?

Tiled Shading(分块着色) 是一种将屏幕空间划分为固定大小的二维网格(Tile,如 16x16 像素)的光照优化技术。它首先分析每个光源影响的屏幕区域,将其关联到对应的 Tile 列表中;随后,每个 Tile 仅对其列表内的光源进行着色计算。这种方法有效避免了传统延迟着色中对全屏所有光源的无效遍历,显著降低了多光源场景下的带宽压力和计算冗余,尤其适合光源分布不均的场景,但其二维划分未考虑深度信息,可能导致远处重叠光源仍被重复计算。

Clustered Shading(集群着色) 是 Tiled Shading 的三维进化版,它将视锥体在屏幕 XY 轴分块的基础上,进一步沿 Z 轴(深度方向)划分为多个层级(Cluster),形成三维网格。通过利用深度缓冲区信息,它能更精准地剔除那些虽然在屏幕投影上重叠、但在深度上互不影响的光源(例如近处光源不会干扰远处物体的计算)。这种三维剔除机制大幅减少了每个像素需要处理的光源数量,不仅支持成千上万个动态光源,还解决了 Tiled Shading 在深度复杂场景中的过度计算问题,成为现代高端游戏引擎(如 Unreal Engine 5)处理复杂光照的主流方案。

6.4 Level of Detail Solutions

细节层次(Level of Detail, LoD)是实时渲染中的关键优化技术,其核心思想是根据物体与摄像机的距离或屏幕占比,动态选择合适精度的模型或纹理版本——正如纹理 MIPMAP 通过预生成多级分辨率贴图来避免过采样,LoD 也为几何体提供多个简化版本,在远处使用低模以减少顶点处理和着色开销。

LoD 方案的核心挑战在于不同层级间的平滑过渡。通常需在边界区域采用重叠与混合策略;以几何 LoD 为例,系统预先生成多个三角面数递减的简化模型,根据物体到摄像机的距离动态切换合适版本,而由此产生的视觉跳跃伪影可交由 TAA(时序抗锯齿)通过帧间插值缓解

Unreal Engine 5 中 Nanite 技术的基础理念,不过 Nanite 更进一步,实现了基于微多边形和流式加载的无限细节渲染,远超传统离散 LoD 的范畴。

6.5 Global Illumination Solutions

在这门课中,我们学习了非常多的关于全局光照的解决方案,但是现实是没有单一技术能完美适配所有场景,除了实时光线追踪外,其余方法均有局限。而实时光线追踪在当前过于昂贵,在工业界常常使用混合的方式(例如先用屏幕空间光线追踪(SSR)做快速近似,失败时再切换至更精确但耗时的硬件或软件光线追踪。)

软件光线追踪常结合多种技术:

  • 对近处物体用高质量 SDF
  • 全场用低质量 SDF
  • 强方向光用 RSM
  • ...

硬件光线追踪则可不依赖原始高模,改用低多边形代理几何体加速计算

这些技术最终在 Unreal Engine 5 中融合为 Lumen

评论区

对你有帮助的话请给我个赞和 star => GitHub stars
欢迎跟我探讨!!!