光照与烘焙
自动关联目录:光照与烘焙
覆盖说明:本篇合并了原方案里的
光照与烘焙与反射与 GI两篇——核心内容已在 Lumen 与 后处理与体积 中覆盖,本篇只做决策与代价层面的横向对比,不重复写。
1. 定位
光照方案的选择是 UE 项目里最早、也最难改的一个决定:它决定了资产制作流程、运行时成本、以及能不能热更。
一句话定位:**先在"烘焙"和"动态(Lumen)"之间做选择,再谈具体参数。**这个选择一旦做错,后期返工量极大。
2. 三种可动性(Mobility)
| 可动性 | 直接光 | 阴影 | 间接光 | 运行时成本 |
|---|---|---|---|---|
| Static | 烘焙进 lightmap | 烘焙 | 烘焙 | 几乎为零 |
| Stationary | 动态 | 动态(传统路径) | 烘焙 | 中等 |
| Movable | 动态 | 动态 | 动态(Lumen 或没有) | 最高 |
关键变化(已核实,见 VSM):启用虚拟阴影贴图后,Stationary 光源的直接光与阴影按动态计算(等同 Movable),只有间接漫反射仍来自烘焙 lightmap。
另一个关键事实(见 Lumen):启用 Lumen 后,Static 光源完全不可用——它们整个存在 lightmap 里,而 Lumen 会禁用预计算静态光照贡献并隐藏所有光照贴图。
3. 方案对比
全局光照
| 方案 | 质量 | 运行时成本 | 是否需要烘焙 | 适用场景 |
|---|---|---|---|---|
| 烘焙(Lightmass / GPU Lightmass) | 静态场景很好 | 几乎为零 | 是 | 移动端、固定光照、性能预算紧 |
| Lumen GI | 全动态、无限反弹 | 固定 GPU 开销 | 否 | 次世代主机与高端桌面,需要动态光照 |
| SSGI | 一般 | 低 | 否(但官方建议与烘焙叠加) | 作为烘焙的补充 |
| Ray Tracing GI | 高 | 高 | 否 | 已弃用 |
反射
| 方案 | 特点 | 成本 |
|---|---|---|
| Reflection Capture | 放置式,静态,便宜 | 低(烘焙后) |
| Lumen Reflections | 全动态、全粗糙度范围 | 中—高 |
| SSR | 屏幕空间,画面外信息丢失 | 低 |
| Ray Tracing Reflections | 质量最高 | 已弃用 |
阴影
| 方案 | 适用 |
|---|---|
| 烘焙阴影 | Static 光,运行时免费 |
| 传统 CSM / 逐物体阴影 | 不用 Nanite 的项目(Nanite 不支持 pre-shadow 与 inset shadow) |
| 虚拟阴影贴图 | 用 Nanite 就必须用它或全 Movable 光(见 VSM) |
| Distance Field Shadows | 方向光的远距离阴影,与 VSM 并行用于非 Nanite 几何 |
| 光追阴影 | 质量最高,优先级高于 VSM |
4. 烘焙的代价(常被低估)
| 代价 | 说明 |
|---|---|
| 烘焙时间 | 大场景以小时计;GPU Lightmass 能显著加速 |
| 包体 | 光照贴图是实打实的资源体积 |
| 内存 | 光照贴图常驻 |
| 迭代速度 | 改一盏灯要重新烘焙,美术反馈周期变长 |
| 不能动态变化 | 昼夜循环、可破坏光照都做不了 |
| 与 Nanite 的关系 | 官方建议:不用 Lightmass 烘焙 GI 时关闭 Generate Lightmap UVs(省时间也省一套 UV) |
关掉静态光照的额外收益(见 Lumen):Allow Static Lighting 关闭后省掉一部分 shader permutation,并且允许 Material Ambient Occlusion 与 Lumen GI 一起工作。
5. 参数与控制台变量
| 设置 / CVar | 作用 |
|---|---|
Allow Static Lighting(项目设置) | 关闭可省 permutation 并启用 Material AO |
Force No Precomputed Lighting(World Settings) | 移除已有 lightmap(需重建光照并保存关卡) |
Generate Lightmap UVs(导入) | 不用烘焙 GI 时应关闭 |
Lighting Quality(构建) | Preview / Medium / High / Production |
r.Lightmass.* / GPU Lightmass 设置 | 烘焙质量与速度 |
r.SSGI.* | SSGI 质量 |
r.DistanceFieldAO.* | DFAO(Lumen 会取代它) |
stat lightmap / Lightmap Density 视图 | 光照贴图密度检查 |
r.Shadow.* | 阴影相关(VSM 系列见 VSM) |
6. 代价与权衡
| 选择 | 收益 | 代价 | 什么时候不该用 |
|---|---|---|---|
| 烘焙 | 运行时免费、移动端唯一现实选择 | 烘焙时间、包体、不能动态 | 需要昼夜循环/可破坏环境时不可行 |
| Lumen | 免烘焙、全动态 | 固定 GPU 成本,且互斥于静态光照 | 低端平台、移动端 |
| SSGI | 便宜 | 只能看到屏幕内,需与烘焙叠加 | 单独使用会有明显缺信息 |
| Reflection Capture | 便宜 | 静态、位置敏感,反射内容是"环境"不是"当前画面" | 需要反射动态物体时不行 |
| SSR | 便宜 | 画面外全丢 | 反射画面外内容时不可用 |
| 光追 GI / 反射 | 质量最高 | 官方已弃用 | 新项目不应基于它设计 |
7. 踩坑与排查
| 坑 | 现象 | 怎么验证 |
|---|---|---|
| 开了 Lumen 后烘焙光没了 | 全变暗 | 设计如此(见 Lumen);要保留烘焙就只用 Lumen Reflections |
| Stationary 光的阴影行为变了 | 切 VSM 后 | VSM 下 Stationary 直接光按动态算,只有间接是烘焙的 |
| 用了 Nanite 但阴影不对 | 阴影缺失 | Nanite 不支持 pre-shadow / inset shadow → 必须用 VSM 或 Movable 光 |
| 光照贴图还在占包体 | 关了 Lumen 但没清 | 需要 Force No Precomputed Lighting + 重建 + 保存 |
| 烘焙极慢 | 项目大 | 用 GPU Lightmass;检查 Lightmap Density 是否过高 |
| 反射里看不到画面外 | 用了 SSR | 换 Lumen 或加 Reflection Capture |
| 包体异常 | 光照贴图大 | 降 Lightmap 分辨率、减少 lightmap 物体 |
| 开了 Lumen 但 Material AO 无效 | 不生效 | 需要先关 Allow Static Lighting 腾出 GBuffer 空间 |
| 导入 Nanite 网格特别慢 | 导入耗时长 | 不用烘焙 GI 就关 Generate Lightmap UVs |
8. 排查顺序
1. 先确认选的是哪条路线:烘焙 还是 Lumen?
└─ 这个决定错了,后面所有调参都是白费
2. 烘焙线:Lightmap Density → 烘焙质量 → 包体/内存
3. Lumen 线:走 [Lumen](/add078a2.html)
4. 阴影问题:
├─ 用了 Nanite?→ 必须 VSM 或 Movable
└─ 没用 Nanite?→ 传统路径或 VSM(见 VSM 篇的适用性判断)
5. 反射问题:先判断是不是"画面外信息缺失"→ 是就换方案参考
- Lumen(动态 GI 与反射的完整说明)
- 虚拟阴影贴图(阴影方案与 Nanite 的强制关系)
- Nanite(平台与特性限制)
- 后处理与体积(GI/反射方法在 Post Process Volume 里的选择)
- Cook 与打包流程(烘焙与打包)
许可协议:CC BY
作者:Davids
本文链接:https://hustjjd.github.io/d926057d.html
更新于:2026年10月10日