混合光照模式深度解析:Baked / Mixed / Realtime 三种模式的技术边界与组合策略
三光照模式技术本质 · Mixed 子模式(Subtractive / Baked Indirect / Shadowmask)精细选型 · 独立游戏最常见混用错误与修复
在 Unity 的光照系统中,每个光源都可以设置为三种模式之一:Baked(仅烘焙)、Mixed(混合)、Realtime(实时)。这个看似简单的三选一,却是开发者产生困惑最多的地方——不是因为概念难以理解,而是因为「实时」「烘焙」「混合」这三个词在实际工程中的行为边界远比名字暗示的复杂。
本文的写作目标是:从运行时数据来源、动态物体响应能力、阴影生成机制三个维度,建立混合光照的完整决策模型。无论你正在配置第一个场景还是重构一个已有光照系统,都能在这里找到你需要的架构依据。
三种模式的技术本质:运行时数据从哪里来
理解三种模式差异的最直接方式,是问一个核心问题:这个光源对静态物体和动态物体的光照信息分别来自哪里?
| 光照模式 | 静态物体光照来源 | 动态物体光照来源 | 静态物体阴影 | 动态物体阴影 |
|---|---|---|---|---|
| Baked | Lightmap(烘焙贴图) | Light Probe(光照探针插值) | 已写入 Lightmap | 不投射(或由 Shadowmask 替代) |
| Mixed | Lightmap + 运行时数据(模式不同) | Light Probe + 运行时数据 | 视子模式而定 | 视子模式而定 |
| Realtime | 运行时实时渲染 | 运行时实时渲染 | Shadow Map(需占 GPU Pass) | Shadow Map |
关键认知:Baked 光源在运行时不存在「光源计算」——光照信息已在烘焙阶段被固化到 Lightmap 中。这意味着 Baked 光源的 GPU 开销为零,但也意味着它无法响应动态变化。Realtime 光源则每帧重新计算,开销最大但最灵活。Mixed 光源试图两种好处兼得,而正是这种「兼得」的努力,带来了最大的复杂性。
Mixed 光照模式的三条路径:Subtractive · Baked Indirect · Shadowmask
Mixed 模式并非一个单一行为,而是包含三个子模式。在 Unity 的 Lighting Settings 中选择不同的 Mixed Lighting Mode,直接影响同一组 Mixed 光源的运行时表现。
Subtractive 模式:最轻量,但牺牲最多
历史最悠久、性能最友好、但画质最受限的模式。其工作逻辑是:静态物体的直接光照和阴影都被烘焙到 Lightmap 中,动态物体由 Light Probe 接收间接光照,但直接光照效果被「减法」近似——从 Lightmap 中减去静态阴影后再叠加动态物体的实时阴影。
这种减法近似的核心缺陷是:动态物体无法在静态表面上投射完整的直接光照阴影。具体表现为动态角色脚下的阴影区域会「双倍暗」——Lightmap 中的静态阴影和实时阴影叠加在一起,产生不自然的黑色区域。
适用场景:几乎不包含动态光源的室内场景,或动态物体极少的环境。当地板上没有复杂的动态物体阴影投射需求时,Subtractive 是最「免费」的选择。
Baked Indirect 模式:平衡之道
这是目前 Unity 推荐作为默认 Mixed 模式的选项。它的工作逻辑是:直接光照和阴影由运行时实时计算(与 Realtime 类似),只有间接光照(反射光、颜色溢出)被烘焙到 Lightmap 中。
Baked Indirect 的优点在于,静态物体和动态物体在直接光照表现上完全一致,没有 Subtractive 中的双倍暗问题。动态物体可以在静态表面上投射正确的实时阴影。缺点在于,间接光照信息固化在 Lightmap 中无法实时响应变化——如果光源被关闭或颜色变化,间接光照不会随之更新。
适用场景:这是大多数独立游戏项目的推荐默认模式。在有动态物体和动态光源的环境中,Baked Indirect 在品质和性能之间提供了最佳的平衡。
Shadowmask 模式:画质最高,负担也最高
Shadowmask 模式的目标是在保持烘焙间接光照的同时,为远处物体提供高质量的阴影。其工作机制是:在烘焙时额外生成一张 Shadowmask 贴图,记录静态物体之间的阴影信息。在运行时,近距离物体使用实时 Shadow Map,远距离物体回退到 Shadowmask 中存储的烘焙阴影信息。
Shadowmask 让开发者可以大幅增加 Shadow Distance 而无需担心实时阴影的 GPU 开销——当物体远离摄像机时,自动切换到 Shadowmask 提供的「近似正确」阴影。代价是 Shadowmask 需要额外的贴图内存(每张 Lightmap 需要配套一张 Shadowmask 贴图,尺寸相同)。在内存敏感的项目中,这是一个需要纳入预算的开支。
适用场景:开放世界和大型室外场景,远距离物体的阴影一致性是视觉品质的核心。如果项目已经使用了 Directional Lightmap(方向性光照贴图),Shadowmask 的内存开销会再次翻倍,需要仔细评估。
三个子模式的快速选型决策树
不必记住上述所有技术细节。在 Unity 编辑器中打开 Lighting Settings 时,按以下顺序快速决策:
- 场景中是否有大量动态物体需要在静态表面上投射正确阴影?→「是」则排除 Subtractive。
- 场景中是否有远距离视野,且实时阴影的距离设置不足以覆盖?→「是」则考虑 Shadowmask。
- 以上两个需求都不强烈,或这是你第一次尝试 Mixed Lighting?→「是」则选择 Baked Indirect。
独立游戏中最常见的混用错误与修复
结合社区反馈和工程经验,以下三种错误模式在独立游戏中反复出现:
错误一:所有光源设置为 Realtime。这是新手最容易犯的错误——将场景中的 10+ 个 Point Light 全部设为 Realtime,然后困惑于帧率急剧下降。修复路径简单直接:将不涉及动态交互的室内环境光源(台灯、壁灯、氛围补光)改为 Baked 或 Mixed,只保留需要与动态物体交互的角色光源为 Realtime。
错误二:Mixed 光源下的阴影行为不一致。使用了 Shadowmask 模式但发现部分物体在远距离不投射阴影。这是因为 Shadowmask 需要物体也参与 Shadowmask 贴图的烘焙——确保所有需要远距离阴影的静态物体的 Static 标志包含「Contribute GI」选项。
错误三:Baked 光源下动态角色整体过暗。这是因为场景中的间接光照来自 Baked 光源的 Lightmap,但动态角色只接收 Light Probe 的数据。如果一个场景的间接光照主要由 Baked 光源贡献,而 Light Probe 的放置密度不足以捕捉间接光的空间变化,动态角色的光照信息就会丢失大量细节。修复方法:在角色活动区域密集放置 Light Probe,方向性 Light Probe 可更好地保留间接光的方向性信息。
三种模式混用的性能叠加问题
一个常见的误解是:场景中同时存在 Baked、Mixed 和 Realtime 光源,它们的性能开销是各自独立、互不影响的。实际上,Unity 的光照 Pass 方案会为场景中所有光源生成统一的渲染方案——即使只有一盏 Realtime 光源,也可能导致整个场景使用 Forward Rendering 的多 Pass 路径。
推荐的混用原则是:
- 以 Mixed 为主光源(场景中 80% 的光源)
- Baked 用于明确不需要交互的环境补光(15%)
- Realtime 仅限于玩家可交互或动态的角色光源(5%)
这个比例不是硬性规则,而是工程经验——当 Realtime 光源超过总量 10% 时,其「边界效应」开始显现,Shader 变体数量增加,Draw Call 上升。在做出光照架构决策时,始终将光源的「交互必要性」作为首要判断依据:这个光源是否需要响应游戏中的动态事件?如果不需要,它就是 Baked 的候选者。