Unity全局光照实战指南:从烘焙到实时GI,打造真实光影效果

发布时间:2026/7/14 9:51:59
Unity全局光照实战指南:从烘焙到实时GI,打造真实光影效果 1. 项目概述为什么Unity光照值得你投入时间如果你在Unity里做过项目尤其是那些对画面有点要求的肯定遇到过这样的场景场景摆好了模型导入了材质也调得七七八八但一打上光总觉得哪里不对劲——要么是阴影生硬得像纸片要么是暗部死黑一片要么就是物体之间缺乏“交流”各亮各的整个场景没有融为一体的感觉。这背后其实就是直接光照的局限性。它只计算光源直接照射到物体表面的效果而忽略了光在真实世界中会反弹、会漫射、会在物体之间相互影响的物理特性。“全局光照”就是为了解决这个问题而生的。它模拟的正是光在场景中多次反弹的过程也就是我们常说的间接光照。一个红色的沙发放在白墙边墙上会映出淡淡的红晕阳光从窗户斜射进来不仅照亮了地板还会把光线漫射到房间的各个角落让背光处不至于一片漆黑。这种微妙的光影互动正是场景看起来“真实”、“有氛围”的灵魂所在。Unity的全局光照系统特别是从烘焙到实时GI的完整工作流是每个想提升项目视觉品质的开发者必须掌握的硬核技能。它不仅仅是点亮场景更是一门关于如何用光来“作画”的艺术。无论是制作一款需要烘托沉浸感的独立游戏还是一个追求写实效果的建筑可视化项目理解并熟练运用这套光照系统都能让你的作品产生质的飞跃。接下来我就结合自己踩过的无数个坑带你从最基础的烘焙开始一步步深入到实时全局光照把Unity光照这摊子事彻底捋清楚。2. 核心概念拆解烘焙、实时与混合光照在动手操作之前我们必须先理清几个核心概念。Unity的光照系统主要围绕三种工作模式展开烘焙光照、实时全局光照和混合光照。选择哪种直接决定了你的项目视觉效果上限和运行时性能开销。2.1 烘焙光照一劳永逸的静态解决方案烘焙光照顾名思义就是把光照计算的结果“烤”进贴图里。这个过程发生在编辑阶段而不是游戏运行时。Unity的光照系统会模拟光线从光源发出在场景中反弹最终计算出每个静态物体表面的亮度和颜色并将这些信息存储在一张或多张称为“光照贴图”的纹理中。游戏运行时引擎只需要采样这些预计算好的贴图就能呈现出复杂的光影效果。它的核心优势非常明显性能极佳。因为所有复杂的间接光、软阴影、环境光遮蔽的计算都已经在开发阶段完成了运行时几乎零开销。这对于移动平台、VR或者大型开放世界场景中那些永远不会移动的物体如建筑、地形、大型道具来说是绝佳的选择。你能用极低的性能代价换来非常高质量、细节丰富的静态光影。注意烘焙光照只对标记为“Static”静态的物体生效。如果一个物体会移动、旋转或缩放它就不能被烘焙。试图烘焙动态物体会导致错误或者该物体根本不受烘焙光的影响。但劣势同样突出缺乏动态交互。一旦烘焙完成光照就固定了。你不能移动光源不能改变物体的材质颜色因为间接光颜色已经烘焙进贴图了甚至白天黑夜切换这种基础需求都无法实现。它塑造的是一个“凝固”的光影世界。2.2 实时全局光照动态世界的真实光影为了弥补烘焙光照的不足Unity引入了实时全局光照系统。在Unity 5.x时代这主要指的是基于Enlighten或Progressive Lightmapper的“预计算实时GI”。而从Unity 2019.3开始Enlighten已被弃用Progressive Lightmapper渐进光照贴图成为主流并且与GPU Lightmapper一起构成了我们现在常用的烘焙/预计算工具。这里需要区分一下我们常说的“实时GI”在Unity的现代工作流中更多指的是利用“光照探针”和“反射探针”来为动态物体提供间接光照和反射信息而复杂场景的静态间接光计算则交给了性能更优的烘焙Baked GI或混合模式。真正的“完全实时”全局光照是像Unity的Enlighten实时GI旧版或全新的DOTS/ECS基于物理的光线追踪方案它们能在运行时计算光的反弹。但这需要极其强大的硬件支持目前在中低端设备或复杂场景中尚不实用。因此当前项目中更常见的“实时感”来自于动态直接光 光照探针提供的间接光近似 屏幕空间全局光照等后处理技术。2.3 混合光照在静与动之间寻找平衡这是最常用、最灵活的模式。Unity允许你为每个光源设置三种模式Realtime实时、Baked烘焙和Mixed混合。Realtime实时光源完全动态每帧计算。影响所有物体静态和动态产生实时阴影。性能开销最大用于主角手电筒、爆炸闪光、可开关的灯等。Baked烘焙光源仅参与烘焙运行时不存在。它的光照信息全部烘焙到光照贴图中只影响静态物体。性能开销几乎为零。Mixed混合这是精髓所在。混合光源对静态物体的直接光和间接光都会进行烘焙所以静态物体有高质量的光照和阴影。但同时它本身在运行时依然存在会以较低质量例如没有间接光反弹计算的方式影响动态物体并为动态物体提供实时阴影。最典型的例子就是场景中的太阳光。静态的地面、墙壁接受了烘焙的太阳光和它产生的柔和阴影而一个动态的角色在场景中跑动时也能实时地从这个太阳光接收到光照和投射阴影。选择策略对于项目我的经验是“能烘焙就烘焙”。将主要的、不动的环境光如天光、室内基础照明用烘焙或混合模式处理。将少数必须动态的光源如车辆头灯、交互式台灯设为实时。这样能在视觉质量和性能之间取得最佳平衡。3. 实战流程从零构建一个带全局光照的场景理论说再多不如动手做一遍。我们以一个简单的室内角落为例走通从模型准备到最终烘焙的完整流程。3.1 第一步场景准备与静态标记首先搭建或导入你的场景。确保所有不会移动的物体——墙壁、地板、天花板、大型家具——都被正确标记为静态。在Hierarchy中选中这些物体。在Inspector窗口的右上角勾选“Static”复选框。Unity会弹出一个对话框询问是否同时影响子物体通常选择“Yes, change children”。关键步骤仅仅勾选Static是不够的。你需要进一步指定它参与哪些静态处理。点击Static标签旁边的小箭头会展开详细选项。对于需要接收烘焙光照的物体必须确保“Contribute GI”和“Lightmap Static”被勾选。“Contribute GI”意味着这个物体会参与全局光照计算既接收光也反弹光“Lightmap Static”意味着它会生成光照贴图。实操心得我习惯在项目初期就规划好静态区域。对于复杂的模块化资产可以为其创建一个父空物体将整个模块设为Static。这样管理和批量操作起来更方便。同时要警惕过度使用Static。如果一个物体虽然不动但它的材质颜色或自发光属性可能会在运行时改变那么将其完全静态化会导致这些变化无法影响全局光照因为间接光信息是预烘焙的。这时可能需要考虑使用光照探针来为其周围的动态物体提供光照或者将其设为动态物体。3.2 第二步光照环境与天空盒设置全局光照非常依赖环境光。我们首先设置天空盒这是场景最主要的环境光源。打开“Window” - “Rendering” - “Lighting”光照设置窗口。切换到“Environment”环境标签页。在“Environment Lighting”部分为“Source”选择“Skybox”。如果你没有自定义天空盒材质Unity会使用默认的。确保“Environment Reflections”的来源也是Skybox并且分辨率设置合理通常256或512对于初期测试足够。为什么这么做天空盒不仅提供了背景其颜色和亮度信息会被Unity的光照系统用作环境光来源影响场景中所有物体的基础亮度和反射。一个明亮的蓝天天空盒会给场景带来冷色调的填充光而一个黄昏的天空盒则会带来暖色调。3.3 第三步光源配置与模式选择现在我们来放置光源。假设这是一个有窗户的室内场景。主光源太阳/方向光从GameObject - Light - Directional Light创建一个方向光。将其旋转模拟阳光从窗户斜射入室内的角度。在Inspector中将其“Mode”设置为“Mixed”混合。这样它对静态物体的光照包括窗户投射到地板上的光影会被烘焙成高质量的效果同时对进入室内的动态角色也能提供实时照明和阴影。调整强度和颜色使其符合白天室内的感觉。补充光源如果室内角落太暗可以添加点光源或聚光灯作为补充。例如在书架上方加一个聚光灯。将这个光源的“Mode”设置为“Baked”烘焙。因为它只是用来装饰静态书架不需要照亮相机外的动态物体完全烘焙掉性能最好。勾选“Shadow Type”为“Soft Shadows”并在烘焙后获得非常柔和的阴影效果。参数详解在光源组件中有一个关键参数叫“Indirect Multiplier”间接光倍增。它控制这个光源产生的光在反弹后即间接光的强度。默认是1。如果你觉得墙壁之间光的反弹效果太弱可以适当调高这个值比如1.5或2但要注意不要过度否则会导致场景发“飘”失去体积感。3.4 第四步光照贴图与烘焙参数详解这是烘焙的核心设置环节全部在Lighting窗口的“Lightmapping Settings”中完成。Lightmapper光照贴图器推荐使用“Progressive GPU”如果你的显卡支持或“Progressive CPU”。Progressive模式允许你实时预览烘焙过程非常直观。GPU模式通常比CPU快一个数量级。Lightmap Resolution光照贴图分辨率单位是“texels per unit”每单位纹理像素。这个值越高光照贴图越清晰细节越多但贴图尺寸也越大。室内场景建议从20开始测试室外大场景可能用到5-10。可以先设一个值烘焙一小块区域看看阴影边缘是否锯齿严重。Lightmap Padding光照贴图间距同一张光照贴图会打包多个物体的光照信息。这个参数决定了它们之间的像素间隔防止采样时“ bleed ”渗色。通常保持默认的2-4即可。Lightmap Size光照贴图尺寸单张光照贴图的最大尺寸。2048是平衡性能和质量的常用值。非常复杂的场景可以考虑4096但会显著增加内存占用。Compression压缩建议开启可以大幅减少磁盘和内存占用对质量影响在可接受范围内。Ambient Occlusion环境光遮蔽务必勾选AO模拟物体交界和缝隙处因为不易被光线照射而产生的自然变暗效果是增加场景体积感和细节的神器。可以调整“Max Distance”影响范围和“Indirect Contribution”对间接光的影响强度。Lightmap Parameters光照贴图参数预设这是一个资产文件包含了一组高级烘焙设置。Unity提供了一些预设如“High”、“Low”。对于初学者可以从“High”开始。后期你可以创建自己的参数预设微调采样数、噪点阈值等。踩坑记录最常遇到的问题就是“Lightmap UV”错误。如果物体的第二套UV专用于光照贴图没有正确展开或存在重叠烘焙时就会出现难看的条纹或花斑。你可以在模型的导入设置Import Settings中勾选“Generate Lightmap UVs”让Unity自动生成一套。但自动生成的效果有时不理想对于重要的主体模型最好在3D建模软件中手动展开第二套UV确保其布局均匀、无拉伸、无重叠。3.5 第五步执行烘焙与结果分析设置好参数后点击Lighting窗口下方的“Generate Lighting”按钮或旧版的“Bake”按钮。如果使用Progressive模式你会看到一个实时更新的预览窗口。烘焙过程中注意观察直接光效果阳光透过窗户的形状是否清晰间接光反弹背光的墙面是否被照亮颜色反弹是否正确比如红沙发旁的墙是否有红晕阴影质量阴影边缘是生硬的还是柔和的AO效果是否明显烘焙完成后在Scene视图右上角将“Shading Mode”切换到“Baked Lightmap”可以单独查看生成的光照贴图效果。检查是否有明显的接缝、漏光或过暗的区域。常见问题与解决漏光Light Leak静态物体之间的缝隙处有光漏进来。这是因为它们的碰撞体或光照贴图UV边界太近。解决方法确保静态物体的几何体闭合适当增加模型的厚度或者在建模时就有意让物体之间略有穿插。阴影模糊或锯齿提高“Lightmap Resolution”值。检查光源的“Shadow Angle”对于方向光或“Shadow Radius”对于点光/聚光灯是否过大导致阴影过于柔和。烘焙时间过长首先尝试使用GPU Lightmapper。降低“Lightmap Resolution”和“Lightmap Size”。减少不必要的静态物体数量。调整光照贴图参数预设降低“Anti-aliasing Samples”等质量设置。4. 为动态物体注入灵魂光照探针与反射探针静态场景烘好了但我们的主角——一个动态的角色走进去会发现他/她/它和场景格格不入像是漂浮在场景之上。这是因为动态物体无法从烘焙的光照贴图中获取光照信息。这时就需要“光照探针”和“反射探针”来搭桥。4.1 光照探针捕捉空间中的“光场”你可以把光照探针理解为在场景空间中放置的一个个“采样点”。在烘焙时Unity会计算这些点上的光照信息颜色和强度。运行时动态物体移动到某个位置引擎会找到离它最近的几个探针通过三线性插值混合出该位置的光照信息然后应用到物体上。如何部署创建一个空物体添加“Light Probe Group”组件。在Scene视图中你可以看到一组黄色的点探针。使用组件面板的“Add Probe”按钮在场景中关键位置添加探针。重点区域包括光照变化剧烈的地方如明暗交界处、走廊、门口、角色主要活动路径。放置原则是“疏密有致”。在光照均匀的开阔地探针可以稀疏在光照复杂的角落、遮挡物附近探针需要密集。一个常见的错误是在整个场景均匀地撒满探针这既低效又可能造成插值错误。放置好后必须重新执行一次烘焙Generate Lighting光照探针的数据才会被计算和保存。实操心得光照探针插值的效果好坏很大程度上取决于探针的布局。确保动态物体可能到达的每一个位置都被足够多的探针所“包围”。特别是对于有垂直移动如跳跃的游戏需要在不同高度也布置探针组。你可以通过创建一个简单的测试球体将其设为动态然后在场景中移动它观察其受光变化是否平滑来验证探针布局的合理性。4.2 反射探针让动态物体也能“映照”世界反射探针的工作原理类似但它捕获的是其位置周围环境的立方体贴图用于模拟物体表面的反射效果。金属、玻璃等光滑材质尤其依赖它。如何部署创建“Reflection Probe”。调整其“Box Size”以覆盖需要反射的区域。类型Type通常选择“Baked”然后点击“Bake”按钮单独烘焙该探针。对于小范围、静态的环境这就够了。对于有动态物体如移动的汽车需要精确反射的场景可以使用“Realtime”类型的探针但性能开销巨大需谨慎使用。更常见的做法是使用多个烘焙的探针并根据物体位置进行混合。高级技巧你可以设置反射探针的“Importance”和“Blend Distance”。重要性高的探针会被优先采样。混合距离决定了从一个探针的影响区域过渡到另一个探针区域的平滑程度。5. 性能优化与常见问题排查一套好的光照方案必须在视觉和性能之间取得平衡。以下是一些关键的优化和排查点。5.1 性能开销分析工具Frame Debugger逐帧查看每个绘制调用可以看到光照贴图、光照探针等是如何被应用的。Profiler - Rendering重点关注“SetPass Calls”和“Batches”。使用光照贴图可以极大地减少Draw Call因为静态物体的光照信息被合并了。但光照贴图本身占用显存和内存。Lighting窗口 - Lightmaps这里列出了所有生成的光照贴图及其大小。检查是否有分辨率过高或利用率极低的贴图。5.2 常见问题速查表问题现象可能原因解决方案动态物体没有光照/全黑1. 动态物体未受任何实时光影响。2. 场景中没有布置光照探针或探针未烘焙。3. 动态物体的Shader不支持光照探针。1. 确保有至少一个Realtime或Mixed光源影响该区域。2. 创建并正确烘焙Light Probe Group。3. 使用支持Light Probe的标准Shader如Standard。光照贴图有闪烁或接缝1. 相邻物体的光照贴图UV在边缘处未对齐或采样到了其他物体的信息。2. Lightmap Padding值太小。1. 检查并优化模型的第二套UV确保UV岛之间有足够空隙。2. 适当增加Lightmap Padding值如从2调到4或8。烘焙后场景变暗或变亮1. 使用了HDR颜色/强度过高的光源但未启用HDR烘焙。2. 光照贴图的曝光Exposure设置不正确。1. 在Lighting窗口的“Environment”中尝试启用“HDR”烘焙。2. 检查Post-processing Volume中的Tonemapping效果或调整相机曝光。移动平台上光照效果丢失1. 使用了目标平台不支持的Shader特性。2. 光照贴图压缩格式不被支持。3. 实时阴影过载。1. 为移动平台使用更简化的Shader如Mobile/Standard。2. 在Player Settings中检查纹理压缩格式。3. 减少实时阴影距离和分辨率或改用烘焙阴影。间接光颜色不正确1. 物体材质的“Global Illumination”设置错误。2. 光源的“Indirect Multiplier”设置不当。1. 在材质Inspector的“Advanced Options”下确保“Global Illumination”模式正确通常为“Baked”或“Both”。2. 调整光源的间接光倍增系数避免过强或过弱。5.3 进阶优化策略分层烘焙对于超大型场景不要一次性烘焙所有内容。可以将场景分成多个部分分别烘焙光照贴图然后通过“Lighting Data Asset”进行加载和切换。这能大大减少单次烘焙的时间和内存压力。光照贴图图集确保光照贴图被高效打包。Unity会自动进行这项工作但你可以通过调整物体的“Scale In Lightmap”参数来影响其优先级。对于视觉上重要的大物体可以适当调高这个值如1.5让它占用更多光照贴图像素对于小物件或远处物体可以调低如0.5以节省空间。Shader优化自定义Shader时如果物体只需要简单的漫反射可以关闭不必要的特性如高光反射、法线贴图对GI的影响等。使用Shader变体剔除工具移除目标平台不需要的GI相关变体。光照系统的学习和调试是一个需要耐心和反复实践的过程。最开始可能会被各种问题困扰但每解决一个你对光如何塑造虚拟世界的理解就会加深一层。我个人最深的体会是不要追求一次就调出完美效果。遵循一个迭代流程基础布光 - 快速低质量烘焙 - 检查大关系明暗、色彩反弹- 调整光源和材质 - 提高质量二次烘焙 - 检查细节阴影、AO- 部署探针 - 最终烘焙。这个流程能帮你高效地定位问题而不是在漫长的烘焙等待后才发现基础设定就有误。最后多参考现实世界的照片训练自己的眼睛对微妙光影的敏感度这才是做出打动人心的光照效果的根本。