
1. 项目概述为什么VR项目必须死磕烘焙光照如果你正在用Unity开发VR项目并且被性能问题折磨得焦头烂额那这篇文章就是为你准备的。我经历过太多VR项目从原型到上线性能瓶颈十有八九都出在光照上。实时光照虽然灵活但在VR里特别是移动端VR如PICO、Quest或需要稳定高帧率的PC VR项目里它就是个“帧率杀手”。烘焙光照Baked Lighting几乎是所有追求高品质、高性能VR体验的项目的必选项。它把复杂的光照计算提前“烘焙”成一张张纹理Lightmap运行时直接读取GPU压力骤降帧率自然就稳了。但Unity的Lighting Settings窗口参数多如牛毛每个下拉菜单、每个滑块背后都影响着最终的画面效果、烘焙时间和包体大小。参数调不好要么画面假得像纸片要么烘焙一晚上结果全是噪点要么Lightmap大到能把显存撑爆。今天我就结合自己趟过的坑把Lighting Settings里关于烘焙光照的每一个参数掰开揉碎了讲清楚特别是那些在VR项目中需要特别注意的优化点。我们的目标很明确用最低的性能开销换取最真实、最稳定的光照效果。2. Lighting Settings 全景解析与VR优化总纲打开Window Rendering Lighting Settings你会看到这个掌管场景光照命脉的核心窗口。它主要分为三个标签页Scene场景全局设置、Realtime Lightmaps实时光照贴图已废弃和Baked Lightmaps烘焙光照贴图。对于烘焙光照我们绝大部分工作都在Scene和Baked Lightmaps这两个标签页里。在深入每个参数之前我们必须建立一个核心认知烘焙光照的本质是空间换时间质量换性能。它把光与物体相互作用产生的漫反射、高光部分、阴影等信息预计算成纹理贴在模型UV2通道上。这意味着静态物体场景中不会移动的物体建筑、地面必须标记为Static或至少勾选Contribute GI才能被烘焙。UV2通道模型需要有展开良好、不重叠的第二个UV集UV2用于存储光照贴图。重叠会导致烘焙错误。不可动态改变烘焙后光源位置、颜色、强度以及静态物体的位置、旋转、缩放如果发生变化光照不会实时更新需要重新烘焙。对于VR项目我们在这套交换中要追求极致的性价比在可接受的视觉质量下尽可能减少光照贴图的大小和数量以节省内存和带宽这是保证帧率稳定的关键。2.1 Scene标签页环境与全局设置这是所有光照计算的起点设置了光照的“舞台背景”和全局规则。2.1.1 Environment环境这部分定义了场景的“天空”和基础环境光。Skybox Material天空盒材质这是场景的背景。对于烘焙天空盒是重要的间接光源。一个明亮的天空盒会让整个场景更亮。在VR中为了性能我们通常使用Procedural Skybox程序化天空盒或简单的Gradient Skybox渐变天空盒它们比使用6面体纹理的Cubemap Skybox更省资源。如果项目是室内场景甚至可以直接设为None用纯色或自定义环境光。VR优化心得避免使用超高分辨率的HDR天空盒纹理。如果必须用确保它被正确压缩如BC7格式并且尺寸合理如2048x2048对于VR全景天空盒已经足够大。Sun Source太阳源当你使用Procedural Skybox时这个选项用于指定场景中的哪个方向光Directional Light代表太阳。这个“太阳”的方向会影响天空盒的渐变和程序化计算的环境光方向。通常我们会把主方向光拖拽到这里。如果设为NoneUnity会默认将场景中最亮的方向光当作太阳。Environment Lighting环境光照Source源决定环境光颜色的来源。Skybox从天空盒材质采样获取环境光颜色。这是最真实、效果最好的选项光照信息丰富。Gradient可以分别设置天空、地平线、地面的颜色形成渐变。比纯色丰富比天空盒性能稍好。Color使用单一纯色。这是性能最优的选择但会损失空间感和真实性。对于风格化或性能极度敏感的VR场景可以考虑。Intensity Multiplier强度倍增控制环境光的整体亮度。默认1.0。在烘焙场景中适当调高如1.2-1.5可以提亮阴影死角但过高会使场景缺乏对比显得“平”。Ambient Mode环境光模式这是关键设置它决定了环境光如何参与全局光照GI计算。Realtime已废弃。忽略。Baked烘焙光照项目必选。这意味着环境光无论是来自Skybox、Gradient还是Color的信息会被烘焙到光照贴图中。运行时零开销。为什么选Baked在VR中我们需要所有光照信息都是静态的、预计算的。选择Baked模式环境光对静态物体的贡献就被固化在Lightmap里了运行时不再计算完美符合我们的优化目标。Environment Reflections环境反射Source源物体表面反射的内容来自哪里。Skybox反射天空盒。真实但可能有性能开销。Custom使用指定的Cubemap立方体贴图作为反射源。这是VR项目的推荐做法。你可以烘焙一个或使用一个低分辨率的Cubemap作为全局反射源所有物体的反射探针Reflection Probe都可以引用它或者直接使用这个全局设置节省反射探针的开销。Resolution分辨率当Source为Skybox时这个Cubemap的生成分辨率。调低它对于大多数VR场景64或128已经足够256是高质量上限。记住这是一个全局的、粗略的反射源不需要高清。Compression压缩选择是否压缩反射Cubemap。保持Auto或选择Compressed。压缩纹理能显著减少内存占用。Intensity Multiplier强度倍增反射的亮度。通常保持1.0根据美术效果微调。Bounces反弹次数定义光线在反射表面之间弹射的次数。增加次数能让反射更丰富例如两个镜子互相照但会急剧增加烘焙计算量。对于VR通常设为1就足够了。因为我们的反射源本身可能就是烘焙的、近似的结果多次反弹的视觉收益很低但性能成本很高。2.1.2 Mixed Lighting混合光照这部分决定了那些标记为Mixed混合模式的光源如何工作。混合光源是VR场景中实现动态与静态光照结合的关键比如一个静态场景中玩家手持的手电筒。Baked Global Illumination烘焙全局光照必须勾选。这是我们进行光照烘焙的总开关。勾选后场景中标记为Baked和Mixed的光源才会参与光照贴图的生成。Lighting Mode光照模式这是混合光照的核心行为控制器。它决定了Mixed光源的实时阴影和间接光如何与烘焙光照结合。Baked Indirect最常用、最推荐给新手的模式。光源的直接光照亮物体和阴影是实时的但间接光光线反弹是烘焙的。这意味着移动的Mixed光源可以实时投射阴影并且其颜色会影响周围物体但由它引起的“环境变亮”效果是预先烘焙好的。性能与效果平衡得很好。Subtractive一种较老的简化模式。在烘焙时它会计算出一个“阴影遮罩”。运行时Mixed光源的实时阴影会简单地与这个烘焙的阴影区域进行叠加/削减。它不适用于HDRP且在复杂光照下效果较差不推荐用于追求质量的VR项目。Shadowmask高级模式效果最好但设置更复杂。它烘焙了静态物体之间的阴影信息到一张额外的Shadowmask纹理中。运行时Mixed光源的实时阴影会与这张烘焙的阴影mask结合。这能实现静态物体与静态物体之间拥有完美的烘焙阴影而动态物体如角色又能从Mixed光源获得实时阴影且两者融合自然。URP不支持此模式如果你的项目是Built-in管线或HDRP并且需要高质量动态阴影可以考虑。VR模式选择决策树场景中几乎没有动态物体需要从Mixed光源接收高质量阴影 - 优先考虑将所有动态光照设为Realtime静态光照Baked简化设置。有少量动态物体如玩家、交互物品需要Mixed光源的实时阴影 - 使用Baked Indirect简单可靠。需要动态物体与静态场景的阴影完美融合如角色走在烘焙的树荫下 - 使用Shadowmask需Built-in/HDRP管线。Realtime Shadow Color实时阴影颜色仅在Lighting Mode为Subtractive时可见。用于调整实时阴影的颜色以匹配烘焙阴影的色调。既然不推荐Subtractive这个参数可以忽略。2.1.3 Lightmapping Settings光照贴图设置这里是烘焙质量和性能的主战场。Unity提供了不同的“光照计算器”Lightmapper我们主要关注Progressive CPU和Progressive GPU。Lightmapper光照计算器Progressive CPU (渐进CPU)使用CPU进行计算稳定兼容性最好但速度慢。适合没有强大GPU的机器或者最终出包前的“最终质量”烘焙。Progressive GPU (渐进GPU)强烈推荐在开发阶段使用。利用GPU进行光线追踪计算速度比CPU快一个数量级。但需要兼容的GPUNVIDIA Maxwell架构以上AMD GCN 2nd Gen以上Intel Skylake以上。在VR开发中快速迭代是关键GPU Lightmapper能极大提升效率。注意Enlighten是旧系统已废弃不要使用。Direct Samples直接光采样数控制从每个着色点发射出去追踪直接光照光源直接照射的光线数量。值越高直接光照区域的噪点越少质量越高时间越长。对于VR项目由于屏幕分辨率相对较低可以适当降低。开发阶段可以设为64-256最终烘焙时根据质量要求提高到512-1024。Indirect Samples间接光采样数控制间接光光线反弹的采样数。这是影响烘焙时间和间接光平滑度的最关键参数。间接光通常比直接光更“脏”噪点多。同样开发阶段可以设低如64-128最终烘焙时提高256-512。过高的值如1024会导致烘焙时间呈指数增长需谨慎。Environment Samples环境采样数控制从环境天空盒等采样的光线数量。影响环境光照的精度。通常可以设为Indirect Samples的一半或相等。Lightmap Resolution光照贴图像素密度单位是“每单位世界空间像素数”。这是最重要的性能/质量权衡参数。设为10意味着Unity会尝试为世界空间中的每1米x1米区域分配10x10个光照贴图像素。如何设定根据物体大小和重要性。一面巨大的墙可能只需要5-10而一个精致的雕塑可能需要30-50。在Lighting窗口的Baked Lightmaps标签页你可以看到场景的光照贴图图表不同颜色代表不同分辨率区域。目标是让重要区域有足够分辨率同时控制总图集数量。VR优化黄金法则从低开始如5-10逐步增加。总光照贴图大小所有图集加起来是硬性性能指标。在移动端VR上单个场景的总光照贴图内存最好控制在50MB以下压缩后。过高的分辨率是显存和包体大小的主要杀手。Lightmap Padding光照贴图间距同一张光照贴图图集中不同物体UV块之间的间隔像素。防止纹理采样时“渗色”。通常保持默认2-4即可。如果烘焙后出现边缘黑线或光晕可以适当增加。Lightmap Size光照贴图尺寸单张光照贴图图集的最大尺寸如1024, 2048, 4096。Unity会尝试将多个物体的光照信息打包进一张或多张这个尺寸的图集中。策略使用较大的尺寸如2048可以减少图集数量但可能会浪费空间如果物体很少。使用较小的尺寸如1024可能产生更多图集但打包更紧凑。目标是用最少的图集数量装下所有物体因为每个图集都有固定的GPU提交开销。对于复杂VR场景2048是一个不错的平衡点。Compress Lightmaps压缩光照贴图务必勾选。使用纹理压缩通常是BC7/HDR格式可以将光照贴图文件大小减少到原来的1/4甚至更少对运行时内存占用有巨大好处。压缩会带来轻微的精度损失但在VR的屏幕分辨率下几乎不可见。Ambient Occlusion环境光遮蔽AOMax DistanceAO效果影响的最大距离。值越大物体缝隙和角落的阴影越“长”、越深。根据场景尺度设置一般设为场景单位尺度的0.5-2倍。Indirect ContributionAO对间接光照的影响强度。通常保持1.0。Direct ContributionAO对直接光照的影响强度。谨慎调整设为大于0的值会让直接光照下的角落也变暗可能显得不自然通常设为0或一个很小的值如0.1-0.2。AO是提升画面立体感和真实感的利器但会增加烘焙计算量。开启它并适当调整Max Distance能让物体交接处更扎实。Final Gather最终聚集一种提升间接光照质量的技术能减少漏光和噪点但会显著增加烘焙时间。对于追求极致质量的PC VR项目可以在最终烘焙时开启。对于移动VR或快速迭代可以关闭。Directional Mode方向模式Non-Directional不记录光线方向信息只记录亮度。生成的Lightmap更小。Directional记录主要光线的方向。这允许在法线贴图等细节上应用更准确的光照即法线贴图能对烘焙光做出反应效果更真实但Lightmap大小会翻倍。VR选择如果场景大量使用法线贴图来表现细节且性能预算充足选择Directional。如果性能吃紧或者物体表面比较平滑Non-Directional是更安全的选择。你可以通过对比两者在VR头盔中的效果和性能开销来做决定。2.1.4 Other Settings其他设置这里是一些全局渲染效果开关。Fog雾效在VR中开启雾效可以增加景深感但会带来额外的像素着色器开销。如果使用建议使用Exponential或Exponential Squared模式它们比Linear模式看起来更自然。Density值不要设得太高以免过度遮挡画面。Halo光晕和Flare耀斑这些是镜头特效。在VR项目中通常建议完全关闭。因为VR渲染的是双眼视图这些基于屏幕空间的2D特效会破坏沉浸感且其渲染方式可能与VR不兼容。Spot Cookie聚光灯Cookie用于聚光灯投影图案。按需使用对性能影响不大。2.1.5 底部的关键按钮Auto Generate自动生成开发阶段强烈建议关闭。勾选后Unity会在你编辑场景时自动重新烘焙光照这会导致编辑器卡顿打断你的工作流。我们更倾向于手动控制烘焙时机。Generate Lighting生成光照关闭Auto Generate后点击这个按钮开始手动烘焙。2.2 Baked Lightmaps标签页结果查看与管理烘焙完成后这里会显示生成的所有光照贴图图集列表。你可以在这里查看每张光照贴图的分辨率和内存占用。点击某张图集在Inspector中查看其详细信息甚至单独调整其压缩格式例如对最重要的图集使用更高质量的压缩。检查是否有物体因为UV2重叠或分辨率设置不当而导致光照信息被错误烘焙。3. VR项目烘焙光照优化实战流程理论说完了我们来走一遍一个VR场景从零开始的光照烘焙优化流程。3.1 前期准备场景与资产设置标记静态物体选中所有不会移动的物体墙壁、地板、家具在Inspector右上角勾选Static。或者至少勾选Contribute GI参与全局光照。检查模型UV2导入重要的静态模型后在模型导入设置中确保Generate Lightmap UVs是勾选的。这会让Unity自动生成一个用于光照贴图的第二套UV。在Model标签页下预览生成的UV2确保没有严重的重叠或拉伸。光源设置主方向光模拟太阳/主要环境光模式设为Mixed或Baked。如果是Mixed根据3.1.2节的决策树选择Lighting Mode。室内补光点光源、聚光灯如果光源本身是静态的一律设为Baked。如果是玩家可交互的如台灯开关设为Mixed。所有Realtime光源除非是必须完全动态的光源如爆炸火光、闪烁的警报灯否则在VR项目中应尽量减少甚至归零。每个实时光源都是性能负担。3.2 烘焙参数初调与快速迭代选择Lightmapper在Lightmapping Settings中选择Progressive GPU如果你的显卡支持。设置低质量预设将Direct Samples、Indirect Samples、Environment Samples都设为较低值如32, 64, 32。将Lightmap Resolution设为一个保守值例如10。首次烘焙点击Generate Lighting。由于参数设得低这次烘焙会非常快可能几秒到几分钟。评估结果在Scene视图中切换到Baked Global Illumination预览模式查看光照和阴影的大致分布。戴上VR头盔在目标设备上运行首要关注帧率。使用Unity Profiler或XR插件提供的性能工具查看GPU和Render Texture内存。检查画面是否有严重的噪点阴影是否太黑或太假AO效果是否合适迭代调整如果帧率不达标首先检查Baked Lightmaps标签页的总纹理大小。如果过大降低Lightmap Resolution这是最有效的手段。其次确保Compress Lightmaps已开启。考虑将Directional Mode改为Non-Directional。如果噪点多逐步提高Indirect Samples对间接光噪点最有效和Direct Samples。每次提高一个档次如64-128然后重新烘焙局部区域可以使用Lighting窗口中的Baked Lightmaps标签页下的Texel Validity视图配合Bake按钮进行局部烘焙。如果阴影/光照不真实检查光源的Indirect Multiplier间接光倍增是否合理通常0.8-1.2。调整Ambient Intensity。检查是否开启了Ambient Occlusion并调整其Max Distance。3.3 最终高质量烘焙当画面质量和性能达到一个满意的平衡点后进行最终烘焙。切换到Progressive CPUGPU Lightmapper虽然快但在处理复杂场景和高质量设置时CPU Lightmapper有时结果更稳定、噪点更少。将Lightmapper改为Progressive CPU。提高采样数将Direct Samples、Indirect Samples提高到目标质量水平例如512, 1024。注意这会极大增加烘焙时间可能需要数小时甚至更久。建议在晚上或非工作时间进行。调整光照贴图分辨率根据之前迭代的结果微调不同物体的光照贴图像素密度。可以在物体的Mesh Renderer组件的Lighting部分覆盖全局的Lightmap Resolution为重要的视觉焦点物体如主角面前的桌子、关键道具设置更高的密度。开始最终烘焙点击Generate Lighting然后去喝杯咖啡或者睡一觉。烘焙后检查再次在VR设备上运行确保帧率稳定。仔细检查场景角落、物体交接处是否有光照泄漏Light Leak或阴影错误。检查光照贴图图集是否被高效利用有没有大量空白空间。如果有可以尝试调整Lightmap Padding或物体的UV2缩放。4. 常见问题、疑难杂症与排查技巧即使按照流程操作烘焙过程中还是会遇到各种妖魔鬼怪。下面是我总结的“排坑手册”。4.1 烘焙后物体变黑或发光Lightmap UV问题症状烘焙后某些物体完全黑色、纯白或出现奇怪的条纹。原因99%是模型的第二套UVLightmap UV有问题比如重叠、翻转或超出[0,1]范围。排查在Scene视图的Shaded模式下选择UV Overlap显示模式。重叠的UV会显示为红色。选中出问题的模型在导入设置Import Settings中检查Generate Lightmap UVs是否勾选。尝试调整Pack Margin打包间隔为一个更大的值如0.05。如果问题依旧可能需要美术在3D建模软件中手动展开一套干净的UV2。4.2 光照贴图内存爆炸症状Baked Lightmaps标签页显示总大小几百MB游戏运行时显存占用过高导致卡顿或崩溃。解决降低全局Lightmap Resolution这是最直接的方法。分块烘焙对于超大型场景不要试图一次性烘焙所有内容。将场景分成多个部分例如按房间或区域分别烘焙并加载。这需要程序上的场景管理支持。使用光照探针Light Probes替代对于大量细小、形状规则的静态物体如一堆石头、草丛可以考虑不将它们标记为Static而是用密集的光照探针网格来提供光照信息。这能节省大量的光照贴图空间。检查纹理压缩确保Compress Lightmaps已开启。在Baked Lightmaps列表中选择单个图集可以在Inspector中强制将其压缩格式改为BC7高质量或BC1低质量如果颜色变化不大。4.3 烘焙时间过长症状点下烘焙按钮等了一个小时进度条才走10%。优化使用GPU Lightmapper进行迭代在调整参数和检查效果阶段坚持用Progressive GPU。降低采样数和分辨率迭代阶段就用最低可接受的设置。关闭Final Gather除非最终出包否则关闭它。优化场景减少不必要的多边形数量合并静态网格Mesh Combining确保光源影响范围Range不要设置得过大。局部烘焙只修改了场景的一小部分使用Baked Lightmaps标签页下的Texel Validity视图显示为红色区域然后点击Bake按钮只烘焙失效红色的区域。4.4 动态物体与烘焙场景接缝明显症状玩家角色或其他动态物体在烘焙好的场景中移动时感觉“浮”在上面颜色和亮度与场景不融合。解决放置光照探针Light Probes这是解决此问题的标准答案。在场景中静态物体的周围尤其是走廊、门口、明暗交界处放置一个光照探针组Light Probe Group。Unity会在烘焙时计算这些探针位置的光照信息颜色、强度。运行时动态物体会根据其位置从最近的几个探针插值获取光照信息从而实现与烘焙环境的无缝融合。调整反射探针确保动态物体所在的区域有合适的反射探针Reflection Probe可以是烘焙的也可以是实时的以匹配环境反射。4.5 在VR设备上出现闪烁或抖动Z-fighting / 精度问题症状在VR头盔中物体边缘或阴影边缘出现细微的闪烁。原因可能是由于光照贴图的精度与几何体深度缓冲Z-Buffer精度冲突导致在VR双眼渲染中更容易被察觉。排查检查是否有两个面片几乎完全重合例如地板和地毯。调整其中一个的位置哪怕只是0.001个单位。尝试调整摄像机的Near Clip Plane近裁剪面到一个更小的值如0.01但不要太小以免产生深度精度问题。在Player Settings的XR设置中确保Single Pass Instanced单通道实例化渲染模式被启用。这是VR性能的最佳实践有时也能改善渲染稳定性。光照烘焙不是一蹴而就的魔法而是一个需要耐心调试的工艺过程。尤其是在VR项目中你始终要在视觉保真度和性能帧率之间走钢丝。我的经验是建立一个快速的迭代循环调参 - 快速GPU烘焙 - VR设备实测 - 分析Profiler数据。记住参数没有绝对的最佳值只有最适合你当前项目目标和目标硬件的最优解。从本文提供的基准值开始大胆尝试细致观察你一定能驯服Unity的Lighting Settings为你的VR世界打造出既美丽又流畅的光影。