
1. 项目概述为什么我们需要混合光照在Unity里做项目尤其是涉及到室内场景或者需要兼顾画面表现与运行性能的项目光照系统绝对是绕不开的核心环节。很多开发者特别是刚接触Unity光照的新手面对Lighting窗口里那几个混合光照模式——Baked Indirect、Shadowmask和Subtractive——常常会感到困惑。它们看起来都能“混合”实时和烘焙光照但具体区别是什么我的项目到底该选哪个我见过不少项目因为选错了混合光照模式导致要么在移动端上卡成幻灯片要么在PC上画面效果大打折扣动态物体的阴影和静态环境的光照完全脱节看起来非常“假”。这背后的原因就是对这几个模式的工作原理、性能开销和适用场景理解不够透彻。简单来说混合光照的核心目标就是在保证画面质量的前提下尽可能地“偷懒”——把那些不需要实时变化的光照信息提前计算好烘焙只让必要的部分比如动态物体的直接光照和阴影实时计算。Baked Indirect、Shadowmask和Subtractive就是Unity提供的三种不同的“偷懒”策略它们决定了哪些光照信息被烘焙哪些被实时计算以及如何将两者无缝融合。今天我就结合自己踩过的坑和项目经验把这三种模式掰开揉碎了讲清楚帮你做出最适合自己项目的选择。2. 混合光照模式核心原理深度拆解在深入对比之前我们必须先理解Unity中光照信息的构成。一束光打到物体表面会产生两种主要的光照贡献直接光照光线直接从光源到达表面形成的高光和清晰的阴影。间接光照光线在场景中物体表面之间多次反弹后到达表面形成柔和的漫反射和环境光。混合光照的本质就是对这两种光照信息进行“实时”与“烘焙”的重新分配与组合。2.1 Baked Indirect 模式只烘焙间接光Baked Indirect顾名思义就是“烘焙间接光”。这是三种模式中“烘焙”程度最低、实时计算保留最多的一种。工作原理烘焙部分场景中所有静态物体标记为Static接收到的间接光照会被烘焙到光照贴图Lightmap中。同时静态物体投射到其他静态物体上的阴影也会被烘焙。实时部分所有光源无论是静态、动态还是混合模式的直接光照都是实时计算的。这意味着高光、法线贴图效果、以及动态物体包括玩家、NPC的实时阴影都是完整的。混合光源对静态物体的直接光照阴影在运行时也是实时计算的。核心优势动态效果最佳因为直接光照是实时的所以动态物体能获得最准确的光照响应包括颜色、强度和阴影变化与场景融合自然。支持完整PBR物理着色的高光和反射等基于视角的效果完全保留。灵活性高在运行时可以修改光源的颜色、强度甚至位置虽然移动光源可能导致烘焙的间接光部分不匹配产生轻微瑕疵。核心劣势性能开销最大每一帧都需要为所有混合光源计算直接光照和实时阴影。如果场景中有多个混合光源Draw Call和GPU填充率压力会显著增加。阴影质量依赖实时阴影设置静态物体上的直接光照阴影质量受项目质量设置中“Shadow Distance”阴影距离和阴影分辨率的影响可能出现锯齿或“阴影裁剪”现象。实操心得Baked Indirect模式特别适合那些光源需要动态变化如昼夜循环、可开关的灯且对动态物体视觉效果要求极高的项目比如高品质的PC或主机游戏。如果你的场景不大光源不多用它准没错。2.2 Shadowmask 模式烘焙阴影实时融合Shadowmask模式是Baked Indirect的进阶版它试图解决Baked Indirect中实时阴影带来的性能问题尤其是在远处。工作原理烘焙部分除了烘焙间接光照它还会为每个静态表面烘焙一个额外的纹理——Shadowmask阴影遮罩。这个纹理记录了“这个表面点是否被某个静态光源的阴影所覆盖”的信息。实时部分直接光照仍然是实时计算的。关键创新——阴影融合在渲染时对于静态物体Unity会查询Shadowmask纹理。如果纹理显示该点处于阴影中则直接使用烘焙的阴影来自光照贴图如果不在阴影中则使用实时计算的直接光照。对于动态物体其阴影仍然通过实时阴影贴图投射。Shadowmask 又细分为两种子模式Shadowmask在“阴影距离”以内静态物体使用高质量的实时阴影在阴影距离以外静态物体切换到使用Shadowmask纹理提供的烘焙阴影。这实现了近处高质量、远处高性能的平衡。Distance Shadowmask这是默认且最常用的选项。无论距离远近静态物体都优先使用Shadowmask纹理的烘焙阴影。只有当Shadowmask纹理无法提供信息比如动态物体遮挡了静态光源时才会回退到实时阴影。这能最大程度节省性能。核心优势极佳的静态阴影性能由于静态物体的大部分阴影信息是预烘焙的极大地减少了实时阴影的计算量特别是对于远处物体和复杂场景。保持高质量直接光照直接光照的实时计算保证了动态物体和材质效果的视觉保真度。无缝的阴影过渡通过Shadowmask纹理烘焙阴影和实时阴影可以很好地融合避免出现明显的阴影接缝。核心劣势内存占用增加需要额外存储Shadowmask纹理增加了磁盘和运行时内存占用。烘焙时间更长因为需要计算并烘焙阴影遮罩信息。对动态遮挡处理有限如果动态物体完全挡住了某个静态光源Shadowmask无法动态更新该光源的阴影区域可能导致光照错误光源似乎“穿透”了动态物体。此时需要依赖回退的实时阴影但可能不够精确。注意事项使用Shadowmask模式时务必在Project Settings - Quality中合理设置Shadow Distance。对于Distance Shadowmask这个距离主要影响动态物体阴影的渲染距离和回退实时阴影的触发范围。设置得太小动态物体稍远就没阴影了设置得太大可能会不必要地启用实时阴影抵消性能优势。2.3 Subtractive 模式为性能极致妥协Subtractive相减模式是三种模式中“烘焙”程度最高、实时计算最少的一种可以理解为一种“低保真”但高性能的混合方案。工作原理烘焙部分烘焙所有东西——包括直接光照、间接光照以及静态光源产生的所有阴影。最终场景的静态部分看起来就像一张完全烘焙好的“背景图”。实时部分只保留一个最主要的平行光通常是Directional Light的实时计算。但这个实时计算非常“取巧”它不是正常计算光照而是从静态物体表面已烘焙的颜色中“减去”实时阴影应该变暗的部分。动态物体的直接光照和阴影则叠加在这个烘焙好的背景之上。核心优势运行时性能开销极低几乎所有的光照和阴影计算都在烘焙阶段完成运行时只需要处理一个简单光源的阴影计算对低端设备非常友好。美术效果统一静态场景的光照和阴影完全由烘焙结果决定效果稳定且可控。核心劣势视觉效果牺牲巨大光照动态性几乎为零除了那个主要的平行光其他光源在运行时无法改变。场景光照是“死”的。阴影质量粗糙实时阴影与烘焙阴影的融合方式生硬动态物体的阴影边缘可能很粗糙且容易与背景的烘焙阴影产生不协调感。不支持复杂光照效果高光、反射等基于实时光照方向的效果会丢失或严重失真。“双阴影”问题动态物体如果投射阴影到静态地面上你会看到两层阴影一层是动态物体实时计算的阴影另一层是地面原本烘焙的静态阴影。这两层阴影很难完美对齐视觉上很突兀。避坑指南除非你的项目目标平台是性能极其受限的旧款移动设备或WebGL并且场景光照非常简单比如一个固定的太阳光否则尽量不要使用Subtractive模式。它带来的视觉妥协在当今硬件条件下往往得不偿失。Unity官方手册也明确指出仅在其他模式无法使用时才将其作为备选。3. 三种模式性能与效果横向对比理解了原理我们来做一个直接的对比。这个表格可以帮你快速决策特性对比Baked IndirectShadowmask (Distance Shadowmask)Subtractive烘焙内容间接光照 静态物体间阴影间接光照 Shadowmask纹理阴影信息全部直接/间接光照与阴影实时计算所有光源的直接光照与阴影所有光源的直接光照动态物体阴影静态物体阴影按需回退仅一个平行光的简化阴影计算静态物体阴影质量依赖实时阴影设置近处高质量远处可能裁剪近处实时远处烘焙整体质量高且稳定完全烘焙质量固定但无动态变化动态物体融合度优秀光照与阴影完全实时融合自然优秀直接光照实时阴影通过Shadowmask融合较差容易产生“双阴影”光照不匹配运行时性能开销高每帧计算所有直接光和实时阴影中大幅减少静态阴影计算极低内存/存储开销低仅光照贴图中光照贴图 Shadowmask纹理低仅光照贴图烘焙时间较短较长需计算Shadowmask中等适用场景场景小、光源少、需要高度动态光照PC/主机大场景、多静态光源、需兼顾效果与性能开放世界、手游性能极端受限的轻量级项目低端手游、WebGL小游戏视觉保真度最高高低如何选择一个简单的决策流程问性能你的目标平台是高性能PC还是手机手机的话是中高端还是低端问场景你的场景是小型密室还是大型开放世界静态光源多吗问动态性光源需要变化吗动态物体和环境的交互重要吗根据答案要极致效果不怕性能-Baked Indirect要开放大世界效果和帧数我都要-Shadowmask (Distance Shadowmask)目标平台是古董机能跑起来就行-Subtractive并做好视觉妥协的心理准备4. 实战配置与核心参数详解知道选哪个了接下来就是怎么把它配好。配置不当再好的模式也出不来效果。4.1 基础设置标记静态与生成光照贴图无论用哪种模式第一步都是正确的静态标记和光照贴图生成。标记静态物体在Hierarchy中选中所有不会移动的物体地形、建筑、摆设在Inspector右上角勾选Static。这一步至关重要它决定了哪些物体会被纳入光照烘焙计算。配置Lighting窗口打开Window Rendering Lighting。Scene标签页确保场景被激活。Mixed Lighting部分展开后在Lighting Mode下拉菜单中选择你需要的模式Baked Indirect, Shadowmask, Subtractive。Lightmapping Settings这里控制烘焙质量。对于测试可以用Low或Medium最终发布前建议用High甚至Custom进行精细控制。关键参数Lightmap Resolution每单位面积的光照贴图像素数。值越高光照细节越精细但贴图越大烘焙越慢。室内场景通常需要30-120大型室外场景可以10-50。Lightmap Padding光照贴图之间预留的像素间隔防止纹理渗漏。一般保持默认即可。Compress Lightmaps压缩光照贴图以减少内存但会引入轻微色块。移动平台建议开启。4.2 光源设置模式与阴影每个光源的Inspector面板是控制其行为的关键。Mode模式对于希望参与混合光照的光源必须设置为Mixed。Shadow Type必须开启阴影Soft Shadows或Hard Shadows。对于Subtractive模式只有最主要的平行光需要开启实时阴影。Baked Shadow Angle / Radius对于Spotlight和Point Light这个参数控制烘焙阴影的模糊度。在Shadowmask模式下它影响的是烘焙到Shadowmask中的阴影边缘柔和度。4.3 Shadowmask 模式专属配置如果你选择了Shadowmask还需要关注这几个地方Quality Settings中的Shadow Distance这是Shadowmask子模式非Distance Shadowmask的切换阈值。在Edit Project Settings Quality中找到Shadows部分下的Shadow Distance。在这个距离内静态物体会使用实时阴影超出则使用烘焙的Shadowmask。合理设置这个值对平衡性能和质量至关重要。Lighting窗口中的 Shadowmask 模式选择在Lighting Mixed Lighting下选择Shadowmask后旁边会出现一个下拉菜单让你在Shadowmask和Distance Shadowmask之间选择。如无特殊需求强烈建议使用Distance Shadowmask它能提供最好的性能和效果平衡。烘焙后的检查烘焙完成后在Lighting窗口的Lightmaps标签页你不仅能看到光照贴图还能看到一张名为Shadowmask的纹理。这张图就是存储阴影信息的遮罩。你可以通过场景视图的Shaded模式下拉菜单选择Shadowmask来可视化它检查阴影信息是否正确烘焙。4.4 烘焙流程与监控生成光照探针对于动态物体它们无法从光照贴图获取光照信息需要依靠光照探针。在Lighting窗口的Light Probes部分点击Generate Lighting时会自动生成你也可以手动放置Light Probe Group。点击 Generate Lighting配置好所有参数后点击Lighting窗口底部的Generate Lighting按钮开始烘焙。这是一个耗时过程可以在Unity底部的状态栏看到进度。监控烘焙结果烘焙时注意观察Console窗口是否有错误或警告。烘焙完成后在场景中检查是否有漏光、阴影拉伸或光照不匹配的区域。常见问题通常与UV展开、静态物体标记或光照贴图分辨率有关。5. 常见问题、排查技巧与优化实录在实际项目中混合光照的坑一个接一个。这里我总结了一些最常见的问题和解决方法。5.1 光照或阴影出现接缝、不匹配这是混合光照最常见的问题动态物体的阴影和烘焙环境对不上。问题描述动态角色走到墙边其阴影与墙上烘焙的阴影错位或者颜色、明暗度不一致。排查与解决检查光源模式确保所有需要参与混合光照的静态光源其Mode都设置为Mixed而不是Realtime或Baked。一个错误模式的光源会破坏整个混合系统。检查Shadow Distance如果使用Shadowmask非Distance接缝可能出现在Shadow Distance的距离边界上。尝试调整Quality Settings中的Shadow Distance或者直接切换到Distance Shadowmask模式。检查光照探针动态物体的间接光照信息来自光照探针。确保场景中有足够密度和合理分布的光照探针组。角色在移动时如果跨越了两个光照差异巨大的探针之间可能会出现光照跳变。烘焙质量过低的光照贴图分辨率或过少的烘焙采样数可能导致阴影边缘模糊或位置不准确从而与清晰的实时阴影产生对比。尝试提高Lightmap Resolution和Lightmap设置中的Samples数量重新烘焙。5.2 烘焙后动态物体“发光”或颜色异常问题描述动态物体在场景中显得特别亮或颜色怪异与环境格格不入。排查与解决罪魁祸首通常是光照探针动态物体只从光照探针获取间接光照。如果探针放置的位置恰好是一个明亮区域比如靠近一个烘焙的发光体那么动态物体在那个位置就会过亮。手动调整Light Probe Group中探针的位置避开过亮或过暗的区域。检查材质确保动态物体使用的材质是支持光照探针的通常是标准着色器或URP/HDRP的Lit着色器。某些自定义Shader可能没有正确采样光照探针数据。Subtractive模式特有问题在Subtractive模式下动态物体的光照是叠加在已烘焙场景上的如果烘焙场景本身很暗动态物体可能需要额外的实时光源来补光但这又会带来性能开销和“双阴影”问题。这是该模式固有的缺陷很难完美解决。5.3 烘焙时间过长或光照贴图尺寸巨大问题描述点一下Generate Lighting等半天甚至几个小时或者生成的光照贴图占用几个GB的磁盘空间。排查与优化分块烘焙对于大型场景不要一次性烘焙整个场景。使用Unity的Lighting窗口中的Auto Generate选项并配合场景的Static物体分块管理。或者手动将场景分成多个小的Scene分别烘焙后再加载。优化光照贴图分辨率全局的Lightmap Resolution不要盲目设高。对于大面积的平坦地面或墙面可以降低分辨率对于细节丰富的角落、雕塑等可以通过给物体单独添加Lightmap Static参数或使用Lightmap Parameters资产来设置更高的分辨率。优化UV展开在导入模型时确保其第二套UVLightmap UV没有重叠且拉伸最小。糟糕的UV展开会迫使Unity提高分辨率来避免瑕疵导致贴图尺寸暴增。可以在模型导入设置中检查并生成更合理的Lightmap UV。减少光源数量每个Mixed光源都会显著增加烘焙的计算复杂度和时间。检查场景中是否有多余的、贡献度低的光源将其删除或改为Baked模式。5.4 平台相关的渲染问题问题描述在PC上运行正常发布到安卓/iOS后阴影消失、闪烁或出现奇怪图案。排查与解决检查图形API支持某些旧的移动设备GPU或图形API如OpenGL ES 2.0可能不完全支持Shadowmask所需的纹理查找功能。在Player Settings中尝试更改图形API顺序如优先使用Vulkan或Metal或检查Quality Settings中对应平台的阴影设置是否被降级。Shader兼容性确保项目使用的渲染管线Built-in, URP, HDRP以及Shader对目标平台有良好的支持。URP和HDRP对混合光照的支持可能和内置管线有细微差别需要查阅对应管线的文档。内存与压缩移动平台内存紧张。确保在Lighting设置中为移动平台启用了Compress Lightmaps。同时检查光照贴图的压缩格式在Lightmaps标签页选择贴图在Inspector中设置是否适合移动平台如使用ETC2或ASTC。5.5 性能分析与优化方向当你对效果满意后最后一步就是压榨性能。使用Frame Debugger打开Window Analysis Frame Debugger逐帧查看渲染过程。重点关注Render Shadows和Draw Calls的数量。过多的Shadow Cascades或过大的Shadow Map分辨率会显著增加Render Shadows的开销。分析GPU耗时使用Unity Profiler的GPU模块或第三方工具如RenderDoc定位渲染瓶颈。如果Shadow Drawing耗时很高考虑降低Quality Settings中的Shadow Resolution。减少Shadow Cascades数量通常2-3级足够。缩短Shadow Distance。对于非关键光源关闭阴影或使用Baked模式。针对Shadowmask的优化确保大部分静态阴影都通过Shadowmask纹理提供而不是回退到实时阴影。观察场景如果远处仍有大量实时阴影在渲染说明Shadow Distance可能设得太大或者有些静态物体的阴影信息没有正确烘焙到Shadowmask中检查其Static标记和光照贴图UV。混合光照是Unity渲染中一个强大但复杂的系统。没有一种模式是万能的最好的选择永远是基于项目需求、目标平台和团队美术资源的权衡。我的经验是对于大多数追求平衡的3D项目Shadowmask (Distance Shadowmask) 模式是起点和首选。它提供了优秀的性能与效果平衡。从它开始配置遇到具体问题如动态遮挡瑕疵时再考虑是否值得切换回Baked Indirect来换取完美动态性或者为了极端性能而忍痛接受Subtractive的视觉缺陷。多烘焙几次多在不同设备上测试你就能找到那个最适合你项目的“甜蜜点”。