时间采样

走样 Aliasing 来自信号频率与采样不足。一个像素代表一块面积,仅在一个位置取值,可能无法准确表示边缘覆盖、细纹理或快速变化的着色;相机移动时这些不足还会变成闪烁。

时域抗锯齿 Temporal Anti-Aliasing,TAA 将样本分摊到多帧。每帧让投影产生小的子像素抖动 Subpixel Jitter,改变像素内部采样位置,再通过 MV 重投影历史并积累。

原分辨率与两倍输出网格上的跨帧子像素样本

上排不同颜色可理解为不同帧相位:左侧同一个输出像素内积累多个位置,右侧将相同样本放到更细的输出网格。下排只显示一个当前相位,右侧大量白格没有这一帧的直接样本,需要合法历史与空间重建提供信息。

静态场景、稳定光照和正确对应下,四个不同相位可提供比单帧更多的采样信息;它不保证动态场景中的每个输出像素始终拥有四份有效样本。相机切换、遮挡解除、透明物体与移动阴影仍有历史失效问题。

重投影应按所选约定处理投影抖动:若 MV 已包含两帧抖动的差异,就不要再补偿一次;若 MV 排除了抖动,历史坐标则要加入相应差值。持续采同一子像素位置再时间平均,能降低部分随机变化,却不能取得原本没有的空间相位。

覆盖与着色

超采样抗锯齿 Supersample Anti-Aliasing,SSAA 在更高采样密度下完整着色,再过滤回目标分辨率。若水平、竖直都扩大 rr 倍,像素数约增为 r2r^2;两倍线性分辨率意味着约四倍像素。有限 SSAA 仍有采样与过滤误差,但它同时增加几何覆盖和着色采样。

多重采样抗锯齿 Multisample Anti-Aliasing,MSAA 主要增加每像素的覆盖、深度等样本,尽量复用着色。常见配置中,同一个图元覆盖同一个像素的多个样本,共享一次片元着色结果;多个图元、逐样本着色或特定管线设置仍可能执行多次。

同一像素的四个MSAA样本记录不同图元的颜色与深度

样本 0,2,30,2,3 由粉色图元覆盖,样本 11 由蓝色图元覆盖,左表记录各自颜色和深度。粉色图元的三个样本可以共享一份着色,蓝色图元还需自己的着色,因此“每像素只着色一次”也不是无条件结论。

空间样本复用 Spatial Sample Reuse 还可以在相邻输出像素之间发生。

六个唯一样本位置通过共享边界组成两份四抽头结果

绿色位置共有六个,中间两个同时参与像素 11 和 22 的过滤,每个输出得到四份贡献,合计八个抽头,但只有六个唯一输入。共享降低重复获取样本的成本,输入之间的相关性并未消失,不能把它称为八个独立样本。

是否跨像素读取取决于采样布局与 Resolve 方式。例如早期 Quincunx Filtering 将本像素两个多采样值和邻像素的三个值一起用于五抽头过滤;这种实现区分“存储样本数”和“过滤抽头数”,并非所有 MSAA 都采用同一布局。多采样过滤扩展规范

Resolve 将各颜色样本按覆盖组合成像素结果,边缘可出现混合颜色而非非黑即白的阶梯。MSAA 对几何边界有效,但同一图元内的高频纹理、程序着色或高光不一定得到更多着色样本,不能将其视为所有着色走样的通用解。

图像抗锯齿

FXAA、Morphological Anti-Aliasing,MLAA 和 Enhanced Subpixel Morphological Anti-Aliasing,SMAA 都可以利用已生成图像中的边缘或形态线索,估计如何平滑阶梯边。它们的实现与扩展版本不同,课程的脉络不能理解成所有算法严格相互替代。

阶梯边缘经方向估计与覆盖混合变成较平滑的结果

面板 11 是离散黑白阶梯,22 根据邻域结构估计可能的连续边界,33 将形态边转为需要混合的区域,44 在相交像素中得到灰色覆盖。蓝线是边界估计,不是算法取得了原始几何的精确边界。

这类后处理开销较低,但输入本身已经缺少的纹理、高光与亚像素结构不能总被恢复。细线容易变淡,错误边缘判断也会抹糊纹理。与时间方法结合时仍需处理历史有效性。

属性边界

最终颜色可以混合,G-buffer 的深度、法线与 ID 具有不同语义。一个像素同时覆盖前景和背景,不能把两层深度平均为不存在的中间表面;把两个物体 ID 平均也不会得到一个有意义的新物体。

课程“G-buffer 不应抗锯齿”的限制针对这种普通颜色式平均。多采样属性、逐样本处理、Coverage-Aware Resolve 或保边读取仍可使用,只是需要保留归属信息。颜色 Resolve 与几何属性 Resolve 不应共用一条无条件平均规则。

时域降噪依赖这些属性判断对应关系,过早把边缘两侧的法线或位置混在一起,会影响重投影与保边滤波。TAA 对最终颜色的处理不能自动解决所有 G-buffer、多材质与透明度问题。

时域超分

超分辨率 Super Resolution 从较低分辨率信息恢复较高分辨率输出。时域超分 Temporal Super Resolution 利用跨帧不同采样相位和历史细节,比只放大一张低分辨率图有更多输入信息。

课程讨论的 Deep Learning Super Sampling,DLSS 2.0 接收低分辨率当前图像与 MV,利用此前高分辨率结果作 Temporal Feedback,再由训练好的网络重建当前高分辨率输出。公开的 2.0 说明使用卷积自编码器;不能将这一版本的网络结构推广为所有后续版本。NVIDIA 的 DLSS 2.0 说明

低分辨率像素覆盖多个高分辨率位置,当前只有一份或少量观察。历史有效时可带来更细信息;历史失效时,简单把历史夹到当前低分辨率邻域的颜色范围,并不能恢复每个高分辨率子像素的正确值。需要判断历史细节可信度,并结合当前样本与学习先验重建。

DLSS 1.0 与 2.0 是不同设计,早期版本也借助高质量参考图训练,不是毫无依据地生成。超分恢复的是当前帧空间细节,与生成时间上的中间帧、或单纯消除随机光照噪声,也应分开讨论。

细节与预算

540p经Bicubic放大到1080p的结果

540p经DLSS2.0重建到1080p的结果

原生1080p并使用TAA的结果

三幅是同一场景:树叶细枝、树皮与枪械上的结构可用于观察空间细节。Bicubic 只能从单帧邻像素插值,DLSS 2.0 还利用时域信息和学习映射,原生 TAA 也有自己的过滤影响。某处更锐利不直接代表完全恢复了真值;静帧、运动稳定性、不同模式与场景都应分别评估。

降分辨率节省的时间需要超过重建成本。以 6060 FPS 为例,一帧约 16.7 ms16.7\,\mathrm{ms};如果某重建过程本身耗 30 ms30\,\mathrm{ms},便已超过该目标帧预算。这是预算说明,不是 DLSS 的固定实测耗时。

其他路线包括 AMD FidelityFX Super Resolution,FSR 和学术 Neural Supersampling。版本必须分清:FSR 1 是不依赖历史或 MV 的空间放大,后来的 FSR 2 则采用时域信息;不能把某一版的机制归纳为整个产品系列。FSR 1 官方说明

延迟着色

延迟着色 Deferred Shading 先保存可见表面属性,之后再对这些表面做光照计算。动机是减少对最终被遮挡片元的昂贵着色,而非单纯减少三角形数量。

设产生的片元数为 NfN_f,最终可见样本数为 NvN_v,光源数为 KK。朴素地对所有片元遍历所有光源,量级为 O(NfK)O(N_fK);先确定可见性,再做光照,可以将主要光照部分缩至 O(NvK)O(N_vK)。现代 Forward 管线也可用 Early-Z 与深度预通减少过绘,这个式子是比较思路,不表示每个 Forward 实现都必然着色全部隐藏片元。

课堂用“两次光栅化”解释:第一遍仅写最近深度,第二遍只让与该深度匹配的表面执行昂贵着色。投影、剔除、透明裁剪与深度比较需保持一致,否则第二遍会产生不匹配。

常见 G-buffer Deferred 则是 Geometry Pass 同时写深度、法线、反照率、粗糙度等属性,再由 Lighting Pass 读取可见属性计算光照;并不必须将整场景重复光栅化两次。Depth Prepass 可以额外加入,是否值得取决于几何、着色和过绘成本。

代价包括 G-buffer 的存储与带宽、多材质表达、透明层处理和多采样属性。透明物体需要背后内容,单层可见属性不足以直接套同一个流程,因此常与 Forward 等管线结合。TAA 可缓和颜色走样,但不能替代所有属性 Resolve 和材质边界处理。

分块光照

分块着色 Tiled Shading 将屏幕划为例如 32×3232\times32 像素的 Tile,为每块保存可能影响它的光源列表,像素只遍历所在块的候选光源。

二维屏幕Tile对应的视锥柱及候选光源数量

圆圈是光源影响体的截面,细长区域是 Tile 沿深度展开的范围;顶部数字表示可能影响该 Tile 的光源数。视锥外且不与该范围相交的光源可以排除。

点光源的平方反比衰减并不会在某半径之外严格归零。实现常按贡献阈值或美术范围构造有限影响体;例如最大辐照度近似 I/r2I/r^2,低于阈值 Emin⁡E_{\min} 时可忽略,对应 rmax⁡≈I/Emin⁡r_{\max}\approx\sqrt{I/E_{\min}}。这是一项误差预算,硬截止还可能需平滑过渡。

列表测试应保守,避免排掉仍可能贡献的光。Tiled Deferred 与 Tiled Forward 都可使用这一思想;“分块”是光源筛选方式,不是 Deferred 的同义词。

若每个 Tile 平均有 K‾t\overline K_t 个候选,主要着色量级近似 O(NvK‾t)O(N_v\overline K_t),但还要计算光源体与 Tile 相交、列表生成、存储和同步。光源几乎覆盖全屏时,收益会降低。

深度分簇

一个 Tile 可能同时看到近墙与很远的背景,深度范围很宽。近光源和远光源都会进入同一列表,虽然每个具体表面只需要其中一部分。

分簇着色 Clustered Shading 再按深度等空间信息划分视锥,将二维 Tile 扩成三维单元 Cluster,每个单元保存自己的光源列表。

沿深度进一步划分后每个Cluster的候选光源减少

同一条视锥柱中的远近格子不再共用一份列表,图中许多格子只保留约两个光源。数字是这个示意场景的结果,不代表 Cluster 一定只有两个候选。

深度区间可用均匀或对数分割,具体划分影响近处细节和列表大小;研究中的聚类还可以结合位置或法线等可见样本属性,不只有固定深度切片。当前像素根据深度定位所属单元,再遍历其列表。

1
2
3
4
5
6
7
8
9
10
// 将可见性、属性与灯光列表构造分开。
renderGeometryIntoGBuffer()
constructTileOrClusterLightLists()
for each pixel p with a valid visible surface:
surface = readGBuffer(p)
cell = findCell(p, surface.depth)
lighting[p] = 0
for light in lightList[cell]:
lighting[p] += evaluateDirectLightWithVisibility(surface, light)
// 透明物体、间接照明与后处理按所选管线另行组织。

候选数量降为 K‾c\overline K_c 时,主要光照部分约为 O(NvK‾c)O(N_v\overline K_c)。更细分簇也增加单元数与列表成本,需要检查列表溢出、极大光源和空簇等情况,不能仅看每像素循环变短。

级联覆盖

细节层次 Level of Detail,LOD 按所需屏幕精度选择表示。Texture mip 已使用这一思路,阴影和体积光照也可以在近处保留细尺度、远处扩大覆盖。

级联阴影贴图 Cascaded Shadow Maps,CSM 将相机视锥按深度分段,分别建立光源投影与阴影图。每张图即使用相同纹素数,覆盖较小的近处区域时也有更细的世界空间分辨率。

相机近远区域使用不同范围的光源投影

黑线为相机视锥,红线覆盖较近段,蓝线覆盖更远、更大的范围。图中的灯泡表示投影方向的照明;选择级联依据接收点在相机视锥中的位置,不是仅按点到光源的距离。光源投影深度仍须包含可能向这段接收区域投影的遮挡物,不能只保留相机当前看见的几何。

Cascaded LPV 则在相机附近放细网格,远处使用覆盖更大的粗网格。

相机附近细LPV网格与远处粗网格的层级覆盖

小方框内格子更密,较大的方框覆盖更远范围,橙色表示相机朝向与观察区域。它管理的是三维光照查询的空间分辨率,和 CSM 管理光源深度纹理不是同一数据。

层级交界需要重叠与 Blending。对已经求得的同一可见度或照明量,可在过渡带用 s=(1−λ)sa+λsbs=(1-\lambda)s_a+\lambda s_b 混合,λ\lambda 随位置平滑变化;不能直接平均不同投影空间的原始深度。不同层的偏移、滤波与方向坐标也应一致。

相机微移还可能使投影纹素不断改变,引起阴影闪烁。稳定投影范围、适当对齐纹素与平滑层级过渡可以减轻问题,但级联不自动解决全部 Shadow Map 走样。Cascade 是分区多尺度组织的一种方式,不能把它与所有 LOD 用法等同。

几何层级

几何也可以预先建立不同精度的网格,按距离和投影误差选择,或在不同区域独立选择细节。较远对象占据少量像素,保留全部微小三角形往往没有可见收益。

更合适的目标是控制屏幕误差。若简化误差在近似平行成像平面方向上的长度为 ee、视图深度为 dd、画面高 HH 像素、竖直视场角为 θ\theta,该距离的视口高度约为 2dtan⁡(θ/2)2d\tan(\theta/2),因此

epixels≈eH2dtan⁡(θ/2).e_{\rm pixels}\approx\frac{eH}{2d\tan(\theta/2)}.

这一近似说明距离、分辨率和视场角都会影响 LOD。一般三维误差还包含沿深度方向的变化,应使用投影 Jacobian 或保守误差界评估。将三角形做到像素量级是细节控制的直觉,不必要求每个三角形都小于一像素;一个大而平整的面也可用较大三角形准确表示。

切换网格会产生 Popping,相邻区域选择不同层级还可能产生裂缝。过渡网格、协调边界、Geomorph 或渐进混合可分别处理这些问题;TAA 有时缓和可见跳变,不能保证填平裂缝或消除所有跳变。

大型系统还要解决流式加载、缓存与带宽、不可见块的裁剪剔除,以及几何如何编码。Geometry Texture 在这里指用纹理存几何数据,与给模型贴普通颜色图不同。课程以早期 Nanite 作为更复杂的分块、多级几何案例,本节的传统 LOD 机制并不构成完整 Nanite 实现。

混合光照

屏幕空间方法便宜,但缺少背面与离屏信息;体积、探针和 SDF 可以覆盖更多空间,却各有分辨率与表示误差;完整场景光线查询仍受射线、着色和重建预算限制。实用 GI 管线因而常采用 Hybrid Global Illumination,让不同表示负责适合的区域或路径。

一种思路是先使用 SSR,在屏幕路径可靠时复用当前结果;离屏、隐藏表面或没有有效命中时,再查询软件或硬件表示。软件查询可以近处用较精细的对象 SDF、远处用较粗的场景 SDF;强方向光或局部灯可以用 RSM 获取反弹贡献。SDF 查询的安全步长仍受距离估计条件限制,粗表示不能保证细几何完整。

光照探针 Light Probes 在若干三维位置记录方向照明,着色点从附近探针插值查询。Dynamic Diffuse Global Illumination,DDGI 的方向是动态更新漫反射照明探针;探针之间的遮挡、分辨率和插值都影响漏光与响应速度。它保存的是光照记录,与固定场景 PRT 保存传输响应不同。

硬件光线也可以查询简化的 Proxy 几何,或用于更新探针,而不必为每个屏幕像素追踪完整的全部路径。课堂提及的 RTXGI 属于硬件光线与探针结合的例子;使用简化代理仍需评估薄结构、遮挡与反射形状的误差。

同一份间接项如果有屏幕与 fallback 两种估计,可按置信度 s∈[0,1]s\in[0,1] 过渡:

Lhybrid=sLscreen+(1−s)Lfallback.L_{\rm hybrid}=sL_{\rm screen}+(1-s)L_{\rm fallback}.

两者需代表相同信号范围、单位和颜色域。若分别负责漫反射与镜面等不同分量,则按材质与路径范围组合;不能将两份完整 GI 无条件相加,重复计入同一份能量。切换的边界、时间响应和历史也要相容。

1
2
3
4
5
6
7
8
9
10
11
// 同一类间接贡献的分级查询,不代表某个封闭引擎的完整实现。
screenResult = queryScreenSpacePath()
if screenResult.isReliable:
indirect = screenResult.value
else:
tracedResult = querySceneRepresentationWithinBudget()
if tracedResult.isReliable:
indirect = tracedResult.value
else:
indirect = queryAppropriateProbeOrEnvironment()
blendTransitionUsingConsistentConfidenceAndSignalDefinitions()

课件在 UE5 Early Access 时用这些组合推测 Lumen 的可能路线。该图的用途是说明分级、混合与 fallback,不应记成 Lumen 的官方完整架构,也不能将某个课件版本中的组合视为所有现代引擎的固定配置。

其他专题

还有一些问题需要独立的表示与传输方法,前面的近似不能直接替代它们:

  • 透明与 Order-Independent Transparency,OIT:多个透明层如何按深度和透射关系组合,不能只保留最近表面的一份 G-buffer。
  • 粒子 Particle Rendering、景深 Depth of Field 与 运动模糊 Motion Blur:分别涉及大量小图元、有限孔径和时间范围内成像。后处理近似与随机主射线效果具有不同输入和误差。
  • 随机种子与蓝噪声 Blue Noise:采样模式的空间、时间相关性影响条带、闪烁和噪声分布;改变种子并不自动改变估计量的正确性。蓝噪声模式抑制低频聚集,减少明显的低频团块。
  • Foveated Rendering:按注视区域的视觉需求分配采样与着色精度,需要处理区域切换和时间稳定。
  • SDF 的表面纹理参数化、光照探针的放置和更新:空间表示之外还需要材质坐标、方向数据与可见性组织。
  • ReSTIR 与 Neural Radiance Caching:前者通过加权选取代表样本进行时空复用,后者学习光照场作为查询或缓存;各有采样权重、更新与误差条件,不能当成普通模糊滤镜。
  • Many-Light 与 Lightcuts:处理大量光源及其贡献聚合,除了减少列表长度,还需要控制光照近似误差。
  • 参与介质 Participating Media、次表面散射 Subsurface Scattering 与毛发外观:光在体积或材质内部吸收、散射,或与纤维结构交互。BSSRDF 描述不同表面位置之间的传输;Screen-Space Subsurface Scattering,SSSSS 只是其中一种屏幕近似,不能代替完整体积传输。

这些专题没有在本套主线中展开完整算法。它们分别改变可见性、采样、材质或重建所需的数据;实现时要重新确认输入、传输量和近似条件,不能仅因最终都产生一张图像就互换方法。