1568 字
8 分钟
全局光照——从 Lightmap 到 Lumen

一、全局光照在做什么#

之前学过的 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 FieldsBVH(真正的三角形)
精度较低(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 方案的对比#

LightmapLumen (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 的设计核心。

全局光照——从 Lightmap 到 Lumen
https://www.m4doka.xyz/posts/cg/cg-12-lumen-gi/
作者
m4doka
发布于
2026-04-05
许可协议
CC BY-NC-SA 4.0