笔记持续更新中
一、 导论:为什么实时 GI 如此艰难?
1.1 渲染方程:一切的起点
Kajiya 1986 年提出的渲染方程定义了所有 GI 技术必须近似的物理目标:
其中:
是从点 沿方向 出射的辐射度 是该点的自发光项 是 BRDF 是入射辐射度——这里是 GI 的难点:它本身又是某个其他点的
这意味着求解严格的
1.2 实时渲染的帧预算悖论
在 60 fps 下,每帧只有 16.67 ms。如果按照 1080p × 4 SPP 的路径追踪估算:
即使在 RTX 4090 上,也只能勉强支撑这个量级。整个行业的 GI 发展史,本质上就是在固定预算下,用各种巧妙的近似与时空复用,逼近无穷次弹射真值的过程。
二、 屏幕空间时代的妥协:SSGI
Screen Space Global Illumination 是最”廉价”的 GI 近似,同时也是最常被误用的技术之一。
上图展示了屏幕空间 GI 对接触遮蔽和短程漫反射的改善效果。
2.1 核心机制
在深度缓冲与颜色缓冲已有的前提下,对每个像素做屏幕空间 Ray March,把命中像素作为”代理光源”:
1 | |
2.2 屏幕空间综合症
- 摄像机视野外、被遮挡的几何体的间接光完全缺失
- 摄像机转动时,间接光发生剧烈跳变(Temporal Instability)
- 无法模拟多次反弹
💡SSGI
SSGI 在现代管线中的正确生态位是,而非主力 GI 方案。建议与 DDGI/Lumen 类低频间接光叠加,并强制要求管线已有充分的 TAA/TSR 颞部稳定。
三、 预计算时代的优雅数学:PRTGI
Precomputed Radiance Transfer GI 是 GPU 时代最具数学优雅性的 GI 方案,由 Peter-Pike Sloan 于 2002 年 SIGGRAPH 提出。

球谐函数(Spherical Harmonics)的前三阶共 9 个基函数。PRT 将光照的”传输关系”投影到这组基底上。
3.1 核心思想:存的是”关系”而非”光”
| Unity Light Probes(常规烘焙) | PRTGI | |
|---|---|---|
| 存储内容 | 某点最终的辐照度结果(已含光源信息) | 几何体对光的遮蔽与反弹关系(不含光源) |
| 光源动态性 | ❌ 必须静态 | ✅ 完全动态 |
| 几何体动态性 | 静态提供 GI / 动态接收 GI | ❌ 必须完全静态 |
PRT 运行时计算:
其中
3.2 SH 基函数交互可视化
下面这个组件实时渲染了 SH 前 3 阶(共 9 个基函数)的三维图像。每个基函数
共 9 个 RGB 系数 = 27 floats / 探针
球谐函数(Spherical Harmonics)前三阶基函数的空间分布可视化。
3.3 SH 在 Shader 中的实际重建代码
下面是在 c 中采样 9 系数 SH 重建漫反射辐照度的标准实现:
C
1 | |
3.4 工业落地:Enlighten 的兴衰
Unity 内置的 Enlighten Realtime GI 是最接近 PRT 思想的产品化实现:它在烘焙阶段把场景切分为簇(Clusters),预计算簇之间的辐射度传输矩阵(Form Factors),运行时允许动态光源驱动这个传输矩阵产生实时间接光。
但它在 Unity 中经历了”被废弃 → 因 SaaS 授权问题回归 → 在新管线中又被 APV 替代”的曲折历史,是 GI 工业化的一个典型缩影。
四、 体素时代的探索:VXGI / SVOGI
在 SSGI 与 PRT 之间,Voxel Cone Tracing 是一个不可忽视的里程碑。Cyril Crassin 2011 年提出,NVIDIA 在 2014 年通过 VXGI 推广,CryEngine 用其变种 SVOGI 在《孤岛危机 4》和《狩猎对决》中落地。

VXGI 把场景体素化进 3D 纹理,每帧从着色点向半球发射”圆锥”做追踪,圆锥沿途累积体素辐射度。
4.1 核心算法三步曲
- 场景体素化(Voxelization):通过几何着色器或 Compute Shader 把场景写入一个稀疏 3D 纹理(Sparse Voxel Octree, SVO),每个体素存储反照率、法线、自发光与不透明度。
- 辐射度注入(Light Injection):把直接光照结果”注入”对应体素,并生成多级 Mipmap,作为不同尺度间接光的近似。
- 锥追踪(Cone Tracing):从着色点向半球投射 ~6 个圆锥,每个圆锥沿途按距离从粗糙到精细 Mip 采样体素,等效于一次低成本的”模糊路径追踪”。
1 | |
4.2 优劣总结
优势: 全动态、单次反弹质量高、与几何复杂度解耦、不依赖硬件光追。
劣势: 体素分辨率受显存限制(典型 256³ 已占数百 MB),导致漏光与细节丢失;二次反弹需多 Pass 重新注入,成本陡增;在大世界场景中难以维护稀疏 SVO 的更新。
VXGI 的思想现在依然活跃:UE5 Lumen 的 Global Distance Field + Surface Cache 体系本质上是 VXGI 思路的现代演化版本,只是把”体素”换成了”距离场 + 卡表面缓存”。
五、 面元时代的工业实践:Surfel GI
Surfel-based Global Illumination(面元 GI)是 EA Frostbite 在 2018 GDC 推出、被 Massive 的 Snowdrop 引擎用在《阿凡达:潘多拉边境》等 3A 项目中的方案。

Surfel GI 把场景表面采样为大量持久化的圆盘”面元”,每个面元缓存自己的辐照度并跨帧累积,从根本上绕开了探针网格的漏光与密度问题。
5.1 核心数据结构:面元(Surfel)
每个面元是一个圆盘代理,存储:
- 世界空间位置
、法线 、半径 - 累积的多次反弹辐照度(球谐表示)
- 命中计数器(用于自适应分裂/合并)
1 | |
5.2 面元 GI vs 探针 GI 的本质区别
- 规则空间网格 → 空间冗余
- 探针不感知几何 → 薄壁漏光
- 密度由网格决定 → 大世界爆炸
- 仅存在于可见表面上 → 0 空间浪费
- 面元贴合几何 → 天然遮挡感知
- 自适应密度 → 大世界友好
5.3 时间复用:Frostbite 的”持久化辐照度”
Surfel GI 的真正威力来自时间累积:每帧只需对一小部分面元发射光线(通常是数千条/帧),结果以指数滑动平均的方式合并进面元缓存。这意味着——
整个场景的 GI 可以在 1~2 秒内逐步收敛到接近 Path Tracing 的质量,但每帧只花费几毫秒。
这套思路深刻影响了后来的 UE5 Lumen Surface Cache,二者在哲学上是同一脉的”屏幕空间外的持久缓存”。
六、 RTX 时代的破局者:DDGI
Dynamic Diffuse Global Illumination 是基于硬件光追的主流落地方案,由 Morgan McGuire 团队提出并被 NVIDIA RTXGI SDK 产品化。

DDGI 在场景中分布探针网格,每帧从探针发射实时光线,捕获动态间接光照。
6.1 核心数据结构:八面体映射
每个 DDGI 探针存储两张**低分辨率八面体(Octahedral)**纹理:辐照度(8×8)和深度矩(16×16)。八面体映射把整个球面无奇异点地展开到一个正方形 UV 空间,是探针数据的关键编解码:
1 | |
6.2 防漏光魔法:Chebyshev 不等式
DDGI 最巧妙的设计在于用 深度 + 深度平方 的两阶矩配合 Chebyshev 不等式给出软可见性概率——这是它优于传统三线性插值探针的核心:
1 | |
6.3 探针网格 + 漏光交互演示
下面这个交互组件用 Canvas 模拟了一个 2D 房间:拖动光源可以看到探针每帧捕获的辐照度变化,勾选 Chebyshev 测试可以观察到薄墙漏光被消除的过程:
观察提示: 关闭 Chebyshev 后,把光源拖到 Room A,可以看到 Room B 内的探针错误地”亮起来”——这就是著名的探针漏光问题。开启 Chebyshev 后,探针会根据自己记录的最近墙壁深度矩信息,软性地拒绝穿墙能量。
6.4 局限性
| 痛点 | 说明 |
|---|---|
| 薄壁漏光 | 墙体厚度小于探针间距时,Chebyshev 测试也会失效。生产中常用 Probe Backface Hit Threshold 强制裁剪 |
| 大世界爆炸 | 8×8×8 的均匀网格在 1km × 1km 场景中需要数百万探针。RTXGI 推出了 Volume 分级方案缓解 |
| 更新带宽 | 每帧每探针发射 64 |
七、 迈向完全路径追踪的桥梁:ReSTIR GI
Reservoir-based Spatiotemporal Importance Resampling for GI(Ouyang et al., EGSR 2021)是目前通向实时路径追踪最重要的算法突破。

左侧为 1 SPP 原始路径追踪(大量噪点),右侧为 ReSTIR GI 复用时空邻域样本后的结果(接近收敛)。
7.1 核心概念:蓄水池采样
传统路径追踪每像素只有 1~4 SPP,噪点严重。ReSTIR 的关键观察是:
相邻像素的”好样本”对你也是高质量样本——只要做一次重要性重采样校正。
每个像素维护一个蓄水池(Reservoir),里面装着当前最优的样本及其权重
- Initial Sampling —— 每像素追踪少量初始路径(通常 1 SPP)
- Spatial Reuse —— 从邻近像素的 Reservoir 中借用样本,加权合并
- Temporal Reuse —— 从上一帧的 Reservoir 中复用未失效的历史样本
1 | |
经过空间 + 时间复用后,单帧内的等效 SPP 可放大 100 倍以上,几乎无视频路径追踪的代价开辟了一条实时落地的捷径。
7.2 Ghosting 与 Boiling 的工程挑战
⚠️ 时空复用的代价
当几何或光源剧烈变化(爆炸、瞬移、武器切换),历史 Reservoir 数据失效,单帧来不及刷新就出现:
- Ghosting(残影) —— 光源关闭后画面残留幽灵般的间接光
- Boiling(沸腾) —— 高方差区域产生跳变的“沸腾”噪点
常见对策: 基于运动矢量的 Reservoir 重投影 + 历史长度限制(通常 M_max = 20~30)+ 专用降噪器(NRD / OptiX Denoiser)。
八、 工业界双雄:引擎级 GI 管线深度对比
8.1 Unreal Engine 5:Lumen 的混合哲学

Lumen 的核心是多层光追源 + 表面缓存的混合系统:
Lumen 调试视图实战
UE5 提供了一套强大的 r.Lumen.* Debug 视图,对 TA 排查问题至关重要:
| 调试视图 | 排查问题 |
|---|---|
| ShowFlag.VisualizeLumenScene | 查看 SDF/Surface Cache 是否覆盖目标几何,缺失会导致黑斑 |
| r.Lumen.Visualize.CardPlacement 1 | 显示 Surface Cache Card 分布,过密区域意味着多余开销 |
| r.Lumen.Visualize 2 (Reflections) | 反射的命中分布;噪点严重通常意味着该处需要更高 RT 预算 |
| stat GPU + LumenScene | Lumen Scene Update 占用 ms,PS5 上的预算约为 1.5~2.5 ms |
典型性能预算(PS5/Xbox Series X,1080p 内部分辨率,Quality 档):
| 步骤 | 耗时 |
|---|---|
| LumenSceneUpdate | ~ 1.8 ms |
| LumenScreenProbeGather | ~ 2.4 ms |
| LumenReflections | ~ 1.6 ms |
| Total Lumen | ~ 5.8 ms (35% of 16.67ms budget) |
8.2 Unity:从 Light Probes 到 APV
![]()
Unity 当前主推的 Adaptive Probe Volumes (APV) 在 HDRP 与 URP 中已成为推荐方案。它放弃了手动摆放 Light Probe,改用:
- 基于 Brick 的八叉树分级 —— 几何复杂区域自动加密,开阔区域稀疏
- 流式加载 —— 大世界场景按需加载 Brick
- Sky Occlusion —— 烘焙阶段计算每点对天空的可见性,运行时动态天光直接驱动间接光(这是 PRT 思想的延续)
APV 调试视图实战
| 调试视图 | 排查问题 |
|---|---|
| Probe Volume → Display Probes | 直接看探针位置与系数颜色,漏光最常见原因是 Brick 跨墙 |
| Probe Validity | 显示无效探针(位于几何内部),Dilation Threshold 调节自动有效化 |
| Sampling Debug → Sampling Position | 给定一个像素,可视化它从哪 8 个探针做三线性插值 |
| Reflection Probes Debug | 验证 Reflection Probes 与 APV 的混合是否平滑 |
APV 与 Lumen 的本质差异:
| 维度 | Unity APV | UE5 Lumen |
|---|---|---|
| 数据形态 | Brick 网格 + SH 系数 | Surface Cache(贴图空间) |
| 运行时光照 | 天光驱动 SH 重建(无 RT) | 每帧 RT/SDF 追踪更新 |
| 动态几何 | ❌ Brick 烘焙时固定 | ✅ MDF 完全动态 |
| 移动端可用 | ✅ URP 有适配版本 | ❌ 需主机/PC 算力 |
| 主要适用场景 | 大世界、移动端、动态天光 | 写实 3A、室内复杂光照 |
💡注:
- Unity APV (Adaptive Probe Volumes) 更倾向于一种“高性能、半动态”的方案,本质上是光照探针的进化版,非常适合移动端大世界。
- UE5 Lumen 则是真正的“全动态”全局光照,对硬件性能要求极高,更适合追求极致画面效果的 PC 或主机平台。
九、 项目 GI 方案快速决策
十、 总结与未来展望
10.1 技术演进的内在逻辑
回顾整条进化轴,可以看到一条清晰的工程哲学迁移:
从”信息越多越好”(PRT/VXGI 存所有传输关系),到”复用越聪明越好”(Surfel/ReSTIR 用时空缓存逼近真值)。
每一代 GI 方案都是在”预计算精度 vs 运行时灵活性 vs 硬件成本”的三角形中,找到当前硬件代际下的最优平衡。
10.2 下一代:Neural Radiance Caching
NVIDIA 在 2021 年提出的 Neural Radiance Caching (NRC) 把 GI 缓存的形态推到了新的高度:用一个小型在线训练的 MLP 替代 Surfel/Probe 缓存,在场景中的每个着色点查询神经网络得到无偏的辐射度估计。
关键特征:
- 在线训练:每帧用少量路径追踪样本反向传播更新 MLP 权重
- 自适应:网络容量自动分配给高频区域
- 首次让纯神经网络在实时光追中战胜了显式缓存方案
这指向了一个有趣的未来:GI 的下一阶段可能不再是”算法”而是”小模型”,每个游戏运行时都在背地里训练自己的辐射度网络。
DDGI 原理 | “Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields” — Majercik, McGuire et al., JCGT 2019
ReSTIR GI 论文 | “ReSTIR GI: Path Resampling for Real-Time Path Tracing” — Ouyang et al., EGSR 2021
ReSTIR DI 原始论文 | “Spatiotemporal reservoir resampling for real-time ray tracing with dynamic direct lighting” — Bitterli et al., SIGGRAPH 2020
PRT 原始论文 | “Precomputed Radiance Transfer for Real-Time Rendering in Dynamic, Low-Frequency Lighting Environments” — Sloan et al., SIGGRAPH 2002
Surfel GI | “Global Illumination Based on Surfels” — EA Frostbite, GDC 2018
VXGI / SVOGI | “Interactive Indirect Illumination Using Voxel Cone Tracing” — Crassin et al., 2011
Neural Radiance Caching | “Real-time Neural Radiance Caching for Path Tracing” — Müller et al., SIGGRAPH 2021
NVIDIA RTXGI SDK | github.com/NVIDIAGameWorks/RTXGI
Unity APV 文档 | Unity Docs > Adaptive Probe Volumes
UE5 Lumen 技术文档 | dev.epicgames.com/documentation/lumen-global-illumination