一、全局光照在做什么
之前学过的 Phong/PBR 光照模型都是局部光照——每个像素只考虑它自己直接接收到光源的光。但在真实世界中:
阳光 → 打在地板上 → 反射黄色光 → 照亮白墙(白墙变成暖色)阳光 → 穿过红色窗帘 → 整个房间偏红GI(Global Illumination)模拟的就是——光线弹射。 太阳直射光只是第一跳,第二跳、第三跳的光线弹射让场景明亮且充满环境色。没有 GI 的画面最明显的问题就是”阴影死黑”——在阴影里的物体完全看不到,而现实中因为有墙面、地面的反弹光,阴影里的物体只是暗一点点。
二、Lightmap——离线烘焙的静态 GI
1 思路
不实时算反弹光。在打包时把场景的所有间接光照预先算好,烤(Bake)到一张纹理上:
场景的每个静态物体 → 展开 UV(Lightmap UV,不同于纹理 UV) → 光追(Path Tracing,模拟数千次弹射) → 把结果烤到 Lightmap 纹理运行时:Sample Lightmap → 直接加间接光照结果,零额外计算开销2 优劣
| 优点 | 缺点 |
|---|---|
| 运行时几乎零开销 | 只对静态物体有效——动的物体没有 GI |
| 质量极高(可以追踪几千次弹射) | Lightmap 数据量巨大(1080p 全场景可能上百 MB) |
| 一次烘焙,永久复用 | 场景改动就要重新烘焙(迭代慢) |
| 适合手游——算力不够但内存相对宽裕 | 动态光源无法参与 GI |
Lightmap 至今仍然是移动端 GI 的标配方案。
三、Lumen——UE5 的实时 GI
1 设计目标
Lumen 要在没有硬件光追的设备上提供实时 GI——并做到 60fps。它的方案是用一系列近似替代精确计算。
2 三步走
Step 1: Surface Cache → 把每个网格体的表面属性(BaseColor、Normal)缓存到虚拟纹理页面里 → 这样后续不用反复采样 GBuffer
Step 2: 快速光线步进 → Lumen 不做三角形级别的光追(太慢) → 用 SDF(Signed Distance Fields)或 Mesh Distance Fields 做光线步进 → SDF 存的是"离最近的表面有多远"——光线步进可以从这个信息大步跳跃
Step 3: Radiance Cache(辐亮度缓存) → 在场景中稀疏地采样(Probes) → 对每个 Probe 累积弹射后的光照信息 → 渲染时从最近的 Probes 插值3 SDF 光线步进:不用三角形怎么做光追
传统 RT:沿着光线方向,一步步找三角形相交SDF 步进: 查询"当前位置离最近的表面多远"(SDF 值 d) → 沿着光线方向前进 d(因为 d 距离内不可能碰到任何表面,大步跳!) → 继续查询 SDF 值 → 继续前进 → 当 d < 阈值时 → 命中表面SDF 光追一个大场景可能只需 20-30 步,而逐像素遍历三角形可能需要成千上万步。
4 Lumen 的两个模式
| Software Ray Tracing(默认) | Hardware Ray Tracing | |
|---|---|---|
| 做光追的数据结构 | SDF / Mesh Distance Fields | BVH(真正的三角形) |
| 精度 | 较低(SDF 有近似误差) | 高(真正的三角形求交) |
| 性能 | 快 | 需要 RT 卡(RTX/AMD RT) |
| 反射质量 | 较模糊 | 清晰 |
| 适用的场景 | 所有设备(DX11 也能跑) | 高端 PC/次世代主机 |
UE5 在这两个模式间可以动态切换——反射用 SDF 模糊近似,需要精确镜面反射时切到 HW RT。
四、Screen Space GI
Lumen 还有个备用方案:屏幕空间追踪(Screen Space Trace)。
对渲染目标上的每个像素: → 在屏幕空间做光线步进(沿着深度缓冲做 March) → 如果光线在屏幕里碰到物体(看深度变化)→ 读取那一点的颜色作为反弹光 → 如果光线走出了屏幕边缘 → 回退到 SDF 追踪或放弃Screen Space 的问题是——光线走出屏幕就断了。 你脚下的地面,经常有一半在屏幕外——Screen Space GI 处理不了这种情况。Lumen 的 Screen Space Trace 只作为补充,主体靠 SDF 追踪。
五、三种 GI 方案的对比
| Lightmap | Lumen (SDF) | Lumen (HW RT) | 传统 Path Tracing | |
|---|---|---|---|---|
| 实时性 | 完全烘焙 | 实时 | 实时 | 离线(每帧几十秒) |
| 动态物体 | 不支持 | 支持 | 支持 | 支持 |
| 动态光源 | 不支持 | 支持 | 支持 | 支持 |
| 质量 | 极高(离线) | 中等(近似) | 高 | 极高(Ground Truth) |
| 硬件要求 | 极低 | 中等 | RT 卡 | 无(离线) |
| 适用场景 | 手游、静态场景 | 全平台实时 GI | 高端 PC/主机 | 电影 VFX、烘焙 |
Lumen 的价值在于把 GI 从”高端 PC 特权”变成了”所有平台都可用”。
六、Lumen 在开放世界场景里
一个小型室内房间的间接光照其实不一定需要 Lumen——范围小、光源固定,Lightmap 或 SSGI 可能就够了。但在开放世界城镇、地下城和动态昼夜场景里,如果能用 Lumen 做实时反射和软阴影,湿润地面、金属护甲和洞穴墙面的材质表现会明显提升。
这也是 UE5 的一个设计哲学——默认开 Lumen,让小型项目免费获得高质量 GI。关了(Project Settings → Rendering → Dynamic Global Illumination Method → None)也能跑,回到传统的 Lightmap + SkyLight。
七、总结
| 概念 | 一句话 |
|---|---|
| GI | 不只直射光,还有弹射光——阴影不黑、白墙偏暖 |
| Lightmap | 离线烘焙间接光照到纹理——运行时零开销,但只对静态有效 |
| SDF | 存”离最近表面的距离”——光线步进可以大步跳跃 |
| Surface Cache | 把网格表面属性缓存到虚拟纹理——避免反复采样 GBuffer |
| Radiance Cache | 场景中稀疏 Probe → 累积弹射光照 → 渲染时插值 |
| Lumen 双模式 | SDF 追踪(软光追,全平台)+ HW RT(硬光追,高端平台) |
Lumen 的本质是用多层近似(SDF 步进 + Surface Cache + Radiance Cache + Screen Space Trace)替代精确的三角形光追——牺牲一点点质量,换取巨大的性能提升。理解了这套”近似链”,你才理解现代实时 GI 的设计核心。