作为技术美术,我们常常在Unity的照明系统前纠结:烘焙光照的高性能与实时光照的灵活性似乎总是鱼与熊掌,尤其是在移动端开发时,性能更是悬在头顶的达摩克利斯之剑。你遇到的“烘焙光照性能好但失去动态,实时光照灵活但移动端消耗巨大”的困境,是许多同行都曾面临的挑战。
但别担心,我们并非只能二选一。通过巧妙地融合烘焙与实时光照,完全可以设计出一套既能享受烘焙高效渲染,又能兼顾日夜循环和角色动态照明的方案。这其中的秘诀,就在于混合照明(Hybrid Lighting)策略。
理解烘焙与实时的核心优势与局限
在探讨解决方案之前,我们先快速回顾一下两种照明模式:
烘焙光照 (Baked Lighting)
- 优势: 将光照信息(如直接光、间接光、阴影)预计算并存储在光照贴图(Lightmap)中。运行时性能开销极低,画面效果稳定且往往更细腻,尤其擅长表现复杂漫反射和软阴影。非常适合静态场景。
- 局限: 一旦烘焙完成,光照信息就是固定的,无法响应光源、物体或时间的变化。场景中的动态物体(如角色)需要额外的处理才能融入烘焙环境。
实时光照 (Real-time Lighting)
- 优势: 能够模拟光照的实时变化,支持动态光源、运动物体投射动态阴影、日夜循环等。提供了极高的灵活性。
- 局限: 计算量大,尤其是高质量的实时阴影和全局光照,对GPU性能消耗巨大。在移动端这种资源受限的平台上,极易造成帧率下降和电池消耗。
混合照明:两全其美的智慧融合
我们的目标是:让静态环境享受烘焙带来的性能红利和视觉细节,同时用少量、关键的实时光照来提供必要的动态感。
核心思路是:用烘焙光照处理静态背景的复杂间接光和阴影,用Light Probes(光照探头)让动态物体融入环境,再辅以一个或两个必要的实时光源来驱动日夜循环或关键动态光照。
下面是具体的实现步骤和关键技术:
1. 静态场景的烘焙基石
- 环境光照 (Environmental Lighting): 将场景中的静态环境光(如天空盒反射)烘焙到光照贴图中。确保你的场景中所有标记为“Static”的几何体都被正确烘焙。
- 基础间接光与阴影: 将大部分间接光照和复杂的静态阴影通过烘焙生成。使用Unity的Progressive GPU/CPU Lightmapper进行烘焙,根据需要调整光照贴图分辨率,平衡质量与显存占用。
- 光源模式设置: 对于场景中的主要光源,如果它是静态的,可以将其模式设置为
Baked。如果希望它在日夜循环中有所表现,但大部分光照仍来自烘焙,则可以考虑Mixed模式。
2. 动态物体的光照桥梁:光照探头 (Light Probes)
这是实现动态角色和物体融入烘焙环境的关键。
- 工作原理: 光照探头会在场景中捕捉周围的烘焙光照信息(主要是间接光),当动态物体经过这些探头时,会自动插值这些光照数据,让它们看起来像被场景的间接光照亮了一样。
- 部署策略: 在你的场景中,尤其是在角色会经过的区域,以及光源变化明显的区域(例如室内外过渡、光源下方等),密集地放置光照探头。通常,探头的密度需要根据场景复杂度和动态物体移动速度来调整,确保探头能够覆盖到所有动态物体可能存在的位置,并提供足够平滑的过渡。
- 对角色的影响: 角色自身将不再需要额外的实时间接光计算,而是通过光照探头获得周围环境的间接光信息。这极大地降低了角色的渲染开销,同时让角色在不同光照区域之间移动时,颜色和亮度过渡自然。
3. 实现日夜循环的动态核心:一个实时方向光
对于日夜循环,我们只需要一个主要的实时方向光。
- 设置为实时模式: 将代表太阳/月亮的方向光设置为
Realtime模式。这是唯一需要进行实时计算的全局光源。 - 性能优化:
- 实时阴影: 实时方向光的阴影是性能大户。在移动端,务必谨慎设置阴影质量(Shadow Resolution)和距离(Shadow Distance)。可以考虑使用PCF Soft Shadows以获得更好的软阴影效果,但要权衡性能。对于不需要精确阴影的远景,可以关闭阴影。
- 级联阴影贴图 (Cascaded Shadow Maps): 限制级联数量(例如2-3个)以优化性能,并调整级联距离,确保近景阴影足够精细,远景阴影则可以适当模糊或裁剪。
- 与烘焙的协同: 当实时方向光改变时,它会实时照亮场景中的所有物体(包括静态和动态)。静态物体会在此基础上叠加烘焙光照(如果光照模式设置为
Mixed),而动态物体则会通过光照探头获取的间接光与实时方向光的直接光叠加。 - 天空盒更新: 配合日夜循环,别忘了实时更新天空盒(Skybox),使其颜色和亮度与方向光的变化保持一致,增强沉浸感。
4. 反射探头 (Reflection Probes) 的辅助作用
- 用于反射: 反射探头可以捕捉场景的反射信息,并将其应用到有反射材质的物体上。对于一些需要反射的材质(例如水面、金属),可以放置反射探头以提供静态或实时的反射效果。
- 模式选择: 可以选择
Baked模式用于静态场景的反射,或者Realtime模式用于需要动态反射变化的区域,但后者开销较大。在移动端,通常会优先使用Baked或Custom(手动更新)。
总结与移动端优化建议
通过上述混合策略,你的静态场景大部分光照开销都被烘焙解决了,而日夜循环和角色光照的动态需求则由一个高效的实时方向光和光照探头承担。
进一步的移动端优化建议:
- 减少Draw Calls: 尽量合并网格(Mesh Batching)、使用图集(Atlas),减少渲染批次。
- 优化Shader: 避免复杂的着色器计算,使用简单的着色模型。URP(Universal Render Pipeline)或HDRP(High Definition Render Pipeline)为移动端提供了更好的优化选项和定制化能力。
- LOD (Level of Detail): 为远处的物体设置更低的LOD,减少几何体和材质的渲染复杂度。
- 遮挡剔除 (Occlusion Culling): 烘焙静态物体的遮挡数据,确保摄像机视线外的物体不被渲染。
- 限制实时光源数量: 尽可能减少场景中的实时点光源或聚光源,如果必须使用,将其
Render Mode设置为Important而不是Not Important,或只影响特定层级。
这种混合方法并非万能药,但它提供了一个坚实的基础,让你能够在移动端有限的性能预算内,尽可能地兼顾视觉效果和动态需求。实践中需要不断测试和调整,找到最适合你项目需求的平衡点。大胆尝试吧,你一定能找到最佳的解决方案!