学习 UE Lumen:动态全局光照的实现原理(概览)
0. Lumen 在解决什么问题
Lumen 是虚幻引擎 5 中的动态全局光照(GI)与反射方案,目标是在可交互帧率下,让间接光、天空光、自发光与反射随场景与光源变化而更新,而不依赖预烘焙 Lightmap。
和离线烘焙相比,它的代价是:近似、有噪声、有分辨率与距离上的折中;和纯路径追踪相比,它的特点是:高度工程化——用多种加速结构与缓存把“多反弹光照”压进毫秒级预算。
1. 整体心智模型:不是一条管线名字,而是一套系统
可以把 Lumen 理解成三层协作:
- 场景表示(Scene Representation)
用距离场、高度场、表面缓存等近似几何与材质,供光线/锥体查询“往哪走、打到什么颜色”。 - 光照求解(Lighting Solve / Gather)
在屏幕空间与 world space 里做最终汇聚(Final Gather)、**辐射缓存(Radiance Cache)**等,把多 bounce 的间接光折合成可采样的结果。 - 与主渲染整合
结果喂给延迟/前向材质系统,并与阴影、Nanite、虚拟阴影贴图(VSM)等协同。
官方文档与白皮书里常强调的:Lumen 是混合多种技术的系统,不同平台、不同质量档位会走不同子路径(软件追踪 vs 硬件光追等)。
2. 关键数据结构(理解原理的抓手)
2.1 网格距离场(Mesh Distance Fields, MDF)
- 每个静态网格可生成有符号距离场(近似),表示到表面的最短距离。
- 优点:GPU 上锥体追踪(Cone Tracing)或球体追踪成本低,适合粗粒度遮挡与 GI 探针式查询。
- 局限:依赖网格质量与分辨率;细小几何、薄墙、复杂镂空可能漏光或穿模,需要调 World Settings / 资产设置或换表示。
2.2 高度场与场景表示(Heightfields / Lumen Scene)
Lumen 需要一份可快速查询的“简化场景”:除距离场外,还有与地形、实例化相关的表示(具体组合随版本与设置变化)。直觉上:用比完整三角形网格更粗的体积/表面近似,换追踪速度。
2.3 Surface Cache(表面缓存 / Card)
间接光需要知道“表面长什么样、反什么颜色”。Lumen 用表面缓存把物体表面划成卡片(Cards)上的 texel,缓存反照率、法线、发射等信息,供 GI 与反射采样。
- 为什么重要:没有稳定的表面参数,间接光只能糊成一片或闪烁。
- 常见现象:新物体、缩放很大的物体、法线很硬的拐角,可能出现漏更新或接缝——往往与 Card 覆盖、更新频率、分辨率有关。
2.4 Radiance Cache(辐射缓存)
在空间中放置低分辨率的辐射体素/探针式缓存,存储入射辐射的大致分布,用于加速多 bounce 或远距离间接光,减少每像素全路径的开销。
3. GI 的大致路径:从相机到“间接光颜色”
典型一帧里(概念顺序,非严格源码调用栈):
- 可见性 + 主光:太阳/点光等先通过阴影与直接光照贡献。
- 屏幕空间信息:当前帧 GBuffer 提供深度、法线、材质。
- Lumen Final Gather:对需要 GI 的像素,向半球方向发射锥体/射线,在 Surface Cache + 距离场/高度场 上查询命中与辐射。
- 时间累积与空间滤波:用历史帧与邻域滤波压噪声(因此快速运动或切场景时可能出现拖影或短暂不稳定)。
- 与反射、天空光合并:反射可走单独追踪路径,但同样依赖类似的场景表示与缓存。
要点:Lumen 的 GI 是在近似几何 + 缓存辐射上做查询,而不是对每像素做完整路径追踪。
4. Lumen Reflections(反射)在做什么
反射与 GI 共享大量基础设施(场景表示、缓存),但目标不同:镜面/光泽方向上的可见性与颜色。
- 粗糙反射:更依赖锥体宽度、滤波与缓存分辨率。
- 锐利反射:对几何近似误差更敏感,容易出现穿帮或模糊。
- 硬件光追(若启用):可用 RT 改善反射与部分 GI 质量,代价是 GPU 成本与平台支持。
在工程上常看到:GI 用软件路径可接受,反射开硬件 RT 换质量,或全软件以保帧率——这是典型的质量/性能权衡。
5. 软件追踪 vs 硬件光线追踪
| 维度 | 软件路径(距离场等) | 硬件 RT |
|---|---|---|
| 几何保真 | 近似,薄墙/细节易出问题 | 更接近真实网格 |
| 平台 | 面广 | 需支持 RT 的 GPU |
| 成本 | 主要吃计算与带宽 | RT 单元 + BVH 等 |
| 调参 | 距离场精度、Lumen 场景细节 | 质量档位、混合模式 |
Epic 的设计哲学是:默认在多数机器上可玩,再向高端硬件渐进增强。
6. 和 Lightmass、传统 RTGI 的关系
- Lightmass:烘焙 GI,质量高、完全静态,与 Lumen 目标不同。
- Screen Space GI / SSR:信息来自屏幕,背后缺失会穿帮;Lumen 用 world space 表示补洞,但仍是近似。
- 纯路径追踪:理论干净,实时全分辨率多 bounce 不现实;Lumen 用缓存 + 低频空间结构换实时。
7. 实践中容易踩的坑(原理层面的解释)
- 漏光 / 室内天光过强:距离场解析度不够、门/窗太薄、World 里 Lumen 场景细节过低。
- 间接光闪烁:表面缓存更新跟不上动画网格、Nanite/非 Nanite 切换、时间滤波与运动矢量不一致。
- 反射糊、拖影:反射分辨率、历史累积、粗糙度与追踪步长的折中。
- 性能尖峰:反射质量、Radiance Cache 更新范围、硬件 RT 开关、大场景卡片数量。
调参时建议:先锁定是“几何表示问题”还是“缓存/分辨率问题”,再动对应那一类设置,避免全盘拉高 Quality。
8. 推荐学习顺序
- 官方文档:Lumen 技术指南(中英文档会随版本更新,以你使用的 UE 版本为准)。
- 白皮书与演讲:搜索 Unreal Engine Lumen SIGGRAPH 或 Lumen Technical Overview,看数据结构与帧流程图示。
- 引擎内验证:开 Lumen Visualize(可视化模式)观察 Surface Cache、Radiance、Tracing 等通道,把文档里的名词和画面一一对应。
- 结合你已有的渲染管线笔记(如光栅化、延迟着色),对比 “GBuffer → 光照积分” 在 Lumen 里多了哪些离线/近似步骤。
9. 小结
- Lumen = 近似场景表示(距离场/高度场/表面缓存) + 辐射与最终汇聚 + 时间/空间滤波,在实时约束下模拟动态 GI 与反射。
- 学原理时不必死记每一个 Pass 名称,而应掌握:光从哪来、存在哪、怎么查、误差从哪来。
- 版本差异大,以当前 UE 小版本的官方文档与可视化调试为准。
若你希望我在这篇后面补一节「与项目相关的调参清单」(例如室内关卡、开放世界、VR 帧预算),可以说明你的目标平台与 UE 版本号,我可以按场景单独整理一版。
