
1. 全局光照为什么是PBR渲染的最后一公里很多人做PBR材质对比的时候注意力全放在金属度、粗糙度、法线贴图这些表面参数上觉得只要材质调对了效果就到位了。但实际项目里你会发现一个很尴尬的现象同一个材质球放在Unity URP里看着还行搬到HDRP里突然变得塑料感很重再丢进UE4里又完全是另一种味道。问题往往不在材质本身而在全局光照Global Illumination简称GI这一层。全局光照解决的核心问题是光线打到物体表面之后反弹出去的光还会继续照亮其他物体。没有GI场景里只有直接光照阴影区域就是死黑一片物体之间没有颜色渗透整个画面会显得干和假。PBR之所以能呈现出接近真实的质感很大程度上依赖GI提供的间接光信息——金属反射的环境、墙面之间的颜色溢出、角落里的柔和暗部这些都是GI在背后撑着。这篇内容主要面向已经接触过Unity URP、HDRP和UE4三套管线但对它们在GI实现上的差异还比较模糊的开发者。我会从各自的GI方案原理讲起结合实机对比和参数配置把为什么同一个场景在三套管线里表现不同这件事说清楚。如果你正在做跨引擎的效果对齐或者纠结项目该选哪套管线这些内容应该能帮你少走一些弯路。需要提前说明的是GI这个话题非常大我这里聚焦在实时和烘焙两条路线的工程实践层面不展开太多图形学公式推导重点放在怎么配、为什么这么配、配完什么效果上。2. 三套管线的GI方案底层逻辑差异2.1 Unity URP轻量化的妥协与实时GI的取舍URP的定位是移动端和中低端设备所以它的GI方案从一开始就是能省则省。URP支持烘焙光照贴图Baked Lightmap和光照探针Light Probes但它不支持Enlighten实时全局光照这一点和内置管线有本质区别。内置管线里那套Enlighten实时GI在URP里是被砍掉的。那URP怎么做动态物体的间接光答案是光照探针组Light Probe Group加环境光Ambient。静态物体靠烘焙动态物体靠探针插值。这个方案的问题在于探针只能捕捉低频的间接光信息高频的细节比如靠近彩色墙面的物体应该染上墙面颜色基本丢失。你在URP里放一个白色球体靠近红色墙壁球体侧面几乎不会有明显的红色反弹光除非你手动在探针里刷数据。URP的另一个特点是**Screen Space Ambient OcclusionSSAO和Screen Space Global IlluminationSSGI**的支持情况。SSAO在URP里是有的但SSGI在早期URP版本里根本没有后来才通过Renderer Feature的方式补上而且效果和性能都只能算能用。SSGI本质上是屏幕空间的后处理只能处理屏幕内可见的间接光屏幕外的东西一概不管所以转身的时候经常能看到光照跳变。从工程角度讲URP的GI策略就是静态靠烘焙动态靠探针实时靠后处理凑。这套组合在移动端够用但如果你要做主机级画质就会明显感觉到天花板。2.2 Unity HDRP为高保真而生的多层GI体系HDRP的GI方案比URP复杂得多它同时支持烘焙GI、实时GI通过Enlighten的替代方案以及屏幕空间GI而且这几套可以叠加使用。HDRP里最核心的GI组件是Volume框架下的Lighting设置你可以在这里控制环境光、雾效、以及GI的强度。HDRP的烘焙GI走的是Progressive Lightmapper渐进式光照贴图烘焙器这个烘焙器在URP里也有但HDRP里的配置项更细支持GPU烘焙速度比CPU烘焙快很多。HDRP还支持Lightmap Resolution的逐物体覆盖这意味着你可以给重要的物体单独提高烘焙精度而不是全局拉高分辨率导致烘焙时间爆炸。实时GI方面HDRP早期依赖Enlighten后来Unity推了Ray Tracing GI需要DXR支持的显卡。光追GI的效果确实好间接光的反弹次数和精度都远超屏幕空间方案但代价是性能。我在一张RTX 3060上测试1080p分辨率下开启光追GI帧率大概掉30%到40%而且显存占用明显上升。HDRP还有一个URP没有的东西Screen Space ReflectionSSR和Ray Traced Reflection的GI联动。反射本身不是GI但反射捕捉到的环境信息会反过来影响间接光的计算所以HDRP里的金属材质看起来比URP活很多因为反射和GI是打通的。2.3 UE4Lumen之前的传统GI与Lumen的革命UE4在Lumen出现之前GI方案主要是Lightmass烘焙加Distance Field Ambient OcclusionDFAO。Lightmass是UE4的静态光照烘焙器质量很高支持间接光反弹次数、环境光遮蔽、光照贴图分辨率等参数。DFAO则是用距离场来计算动态物体的环境光遮蔽效果比屏幕空间AO更稳定因为它不依赖屏幕内容。但真正让UE4在GI上拉开差距的是Lumen。Lumen是UE5引入的但在UE4后期版本里也有实验性支持。Lumen的核心是软件光追加硬件光追双路径软件路径用Signed Distance FieldSDF和屏幕空间追踪来算间接光硬件路径直接用GPU的RT Core。Lumen的最大特点是全动态——不需要烘焙场景里的物体可以随意移动GI会实时更新。我在UE4里对比过Lightmass和Lumen的同一个场景。Lightmass烘焙出来的间接光非常干净没有噪点但它是静态的物体一动GI就不对了。Lumen的间接光有轻微噪点可以通过Temporal Accumulation降噪但动态效果无敌而且颜色渗透比Lightmass更明显。代价是性能Lumen在1080p下大概吃掉30%到50%的GPU性能具体取决于场景复杂度。三套管线的GI方案对比可以总结成下面这张表管线静态GI方案动态GI方案实时GI方案典型性能开销Unity URP烘焙LightmapLight ProbeSSGI后处理低Unity HDRPProgressive LightmapperLight Probe SSRRay Tracing GI中到高UE4LightmassDFAOLumen中到高这张表的关键信息是URP的GI是够用就好HDRP是分层可选UE4是全动态优先。理解这个定位差异后面调参数的时候就不会迷茫。3. 烘焙GI的实操对比从参数到成品3.1 Unity烘焙流程中的关键参数与踩坑点Unity的烘焙GI不管是URP还是HDRP底层都是Progressive Lightmapper。这个烘焙器的工作方式是先算直接光照再算间接光照间接光照的反弹次数由Lightmap Parameters里的Bounces控制。默认是2次反弹意思是光线打到物体后反弹两次。反弹次数越多间接光越丰富但烘焙时间呈指数增长。我在一个室内场景里测试过Bounces设为1时烘焙时间约2分钟设为2时约5分钟设为4时直接飙到20分钟以上。所以Bounces不是越多越好一般室内场景2到3次就够了室外场景1到2次足够因为室外有天空光补充。另一个关键参数是Lightmap Resolution单位是texel per unit。这个值决定了光照贴图的精度。设得太低阴影边缘会有锯齿设得太高烘焙时间和显存占用都会爆炸。我的经验值是室内墙面用10到20地面用20到40小物件用40到60。但更好的做法是用Lightmap Parameters资产给不同物体分配不同的参数而不是全局调一个值。还有一个容易踩的坑是UV2。Unity烘焙GI需要模型有第二套UVUV2专门用于光照贴图。很多从外部导入的模型只有一套UV直接烘焙会报错或者效果错乱。解决办法是在建模软件里展UV2或者在Unity里用Generate Lightmap UVs选项自动生成。但自动生成的UV2质量参差不齐接缝处容易有光照泄漏重要模型还是手动展比较好。提示Unity 2021之后的版本里Progressive Lightmapper支持GPU烘焙但需要显卡支持OpenCL。如果你的显卡不支持烘焙会回退到CPU速度慢很多。可以在Preferences里查看GPU烘焙是否可用。3.2 UE4 Lightmass的配置逻辑与质量把控UE4的Lightmass烘焙和Unity的思路类似但参数命名和侧重点不同。UE4里控制烘焙质量的核心是Lightmass Settings可以在World Settings里找到。关键参数包括Static Lighting Level Scale、Num Indirect Lighting Bounces、Indirect Lighting Quality和Indirect Lighting Smoothness。Static Lighting Level Scale这个参数很关键它决定了光照贴图的分辨率基准。值越小分辨率越高烘焙越慢。默认是1我一般会调到0.5到0.8之间来提升精度。但注意这个值是全局的调小之后整个场景的烘焙时间都会增加所以大场景要谨慎。Num Indirect Lighting Bounces就是反弹次数UE4默认是1我建议室内场景调到3到5室外2到3。UE4的间接光计算比Unity更重因为它的Lightmass会考虑更多的光线采样所以同样反弹次数下UE4的烘焙时间通常比Unity长。Indirect Lighting Quality控制的是间接光的采样质量默认是1调到2到4可以显著减少噪点但烘焙时间也会成倍增加。Indirect Lighting Smoothness则是用来平滑间接光的值越高越平滑但过高会丢失细节。我一般设在0.75到0.9之间。UE4烘焙还有一个Unity没有的功能Lightmass Portal。这是一个放置在窗口或门口的体积用来引导光线进入室内。没有Portal的时候室内烘焙经常会出现光线进不来的情况加了Portal之后窗口附近的光照会明显更自然。这个功能在Unity里没有直接对应只能靠手动补光或者调环境光来模拟。3.3 烘焙结果在三套管线中的视觉差异同一个场景同样的材质在三套管线里烘焙出来的GI效果差异其实挺明显的。我拿一个简单的室内场景做了对比白色墙面、木地板、一个红色沙发、一扇窗户。在Unity URP里烘焙出来的间接光比较平墙面之间的颜色渗透很弱红色沙发对周围地面的颜色影响几乎看不出来。窗户进来的光在墙面上的衰减比较生硬暗部细节偏少。整体感觉是能看但不够真实。在Unity HDRP里同样的烘焙参数下间接光明显更丰富。红色沙发在地面上有一层淡淡的红色反弹窗户光的衰减更柔和暗部有更多层次。HDRP的Volume系统里可以额外调整Indirect Lighting Intensity我一般会调到1.2到1.5之间让间接光更明显。在UE4里Lightmass烘焙出来的效果是三者中最厚的。间接光的颜色渗透非常自然窗户光的衰减曲线接近物理正确暗部细节保留得最好。但UE4的烘焙时间也是最长的同样场景Unity URP烘了5分钟HDRP烘了8分钟UE4烘了15分钟以上。这个差异的根源在于三套管线的光照贴图编码方式和间接光计算精度不同。Unity的Lightmapper在计算间接光时采样数相对保守而UE4的Lightmass会做更多的光线追踪采样。HDRP介于两者之间但它的Volume系统给了更多后期调整空间。4. 实时GI的工程落地Lumen与光追GI的实战4.1 Lumen在UE4项目中的启用条件与性能调优Lumen在UE4里是实验性功能需要在Project Settings里开启。具体路径是Project Settings → Rendering → Global Illumination → 把Dynamic Global Illumination Method设为Lumen。同时还要开启Generate Mesh Distance Fields因为Lumen的软件光追依赖距离场。开启Lumen之后场景里的间接光会实时更新物体移动时GI跟着变。但有几个坑要注意第一Lumen对材质的要求比较高。如果材质里用了Custom Node或者复杂的ShaderLumen可能无法正确计算间接光。我遇到过用Custom Node做溶解效果的材质在Lumen下间接光直接变成黑色后来把Custom Node换成标准节点才正常。第二Lumen的噪点问题。软件光追路径下间接光会有明显的噪点尤其是在暗部。解决办法是调高Lumen Final Gather Quality或者开启Temporal Accumulation。但Temporal Accumulation会导致快速移动时出现拖影需要权衡。第三性能开销。Lumen在1080p下大概吃掉30%到50%的GPU性能具体取决于场景的三角形数量和距离场复杂度。我在一个中等复杂度的场景里测试不开Lumen是120帧开了Lumen掉到70帧左右。如果目标是60帧那Lumen基本吃掉了所有余量。调优方面Lumen Scene Lighting Quality和Lumen Final Gather Quality是两个关键参数。前者控制场景光照的更新频率后者控制最终聚集的质量。我一般会把Scene Lighting Quality设为1Final Gather Quality设为2这样在画质和性能之间比较平衡。4.2 HDRP光追GI的硬件门槛与效果边界HDRP的光追GI需要DXRDirectX Raytracing支持也就是NVIDIA RTX系列或AMD RX 6000系列以上的显卡。开启方式是在HDRP的Volume里添加Ray Tracing Settings然后启用Ray Traced Global Illumination。光追GI的效果确实比屏幕空间方案好很多。屏幕空间GI只能处理屏幕内可见的间接光转身的时候光照会跳而光追GI是全场景的不存在这个问题。我在一个走廊场景里对比过屏幕空间GI在走廊尽头有明显的暗区因为屏幕外的东西算不进去光追GI则没有这个问题走廊尽头的间接光很自然。但光追GI的性能代价也很大。我在RTX 3060上测试1080p分辨率下不开光追是90帧开了光追GI掉到55帧左右。如果同时开光追反射和光追阴影帧率会进一步掉到40帧以下。所以光追GI目前更适合高端PC或者主机移动端和中低端PC基本不用考虑。还有一个容易被忽略的点光追GI的降噪。光追GI的原始输出噪点很多需要配合Denoiser使用。HDRP里可以开启Ray Tracing Denoising但降噪会引入一定的延迟和模糊。我一般会把降噪强度设在中等太高了画面会糊。4.3 URP的SSGI能用但别指望太多URP的SSGI是通过Renderer Feature实现的需要在URP Renderer里添加Screen Space Global Illumination。开启之后屏幕空间内会有间接光效果但效果比较有限。SSGI的核心问题是它只能处理屏幕内可见的间接光。这意味着如果间接光的来源在屏幕外SSGI就完全捕捉不到。比如你面对一堵墙墙后面的红色物体对墙的间接光影响SSGI是算不出来的。所以SSGI在封闭空间里效果还行在开放场景里就很容易穿帮。另外SSGI的性能开销也不低。虽然比光追GI轻但在移动端还是太重。我在一台中端安卓机上测试开启SSGI后帧率从60掉到35左右而且发热明显。所以URP的SSGI更适合PC端的轻量级项目移动端建议还是老老实实用烘焙加探针。如果你非要在URP里用SSGI我的建议是只在大场景的远景使用近景用烘焙GI覆盖。这样既能保证近处的画质又能让远处有动态GI的感觉。但说实话这个方案的工程复杂度不低收益也有限不如直接上HDRP。5. 跨管线GI效果对齐的实操思路5.1 环境光与间接光强度的统一基准跨管线对齐GI第一步是统一环境光。三套管线的环境光来源不同Unity的Environment Lighting可以来自Skybox、Gradient或ColorUE4的Sky Light则更复杂支持Cubemap和实时捕捉。我的做法是先用一个纯色环境光作为基准把三套管线的环境光颜色和强度调到一致。具体操作是在Unity里把Environment Lighting的Source设为Color给一个中性灰在UE4里把Sky Light的Intensity调到对应值。然后放一个标准球体对比三套管线里的环境光反射是否一致。环境光对齐之后再调间接光强度。Unity HDRP的Volume里有Indirect Lighting IntensityUE4的Lightmass里有Indirect Lighting Quality和Indirect Lighting Smoothness。这些参数没有直接对应关系只能靠肉眼对比来调。我一般会先让UE4的间接光看起来正常然后调Unity的参数去逼近。这里有个经验Unity的间接光默认偏弱UE4的默认偏强。所以从UE4搬到Unity的时候通常需要把间接光强度调高20%到30%反过来则要调低。5.2 光照贴图编码与色彩空间的一致性跨管线GI对齐的另一个大坑是光照贴图的编码方式和色彩空间。Unity默认使用Linear Color SpaceUE4也是Linear但两者的光照贴图编码格式不同。Unity的Lightmap是RGBM或RGBM EncodedUE4的是RGBE或LogLuv。这些编码方式在解码时会有细微差异导致同样的光照贴图在两套引擎里看起来亮度不同。解决办法是在烘焙之前统一色彩空间设置。Unity里确认Player Settings的Color Space是LinearUE4里确认Project Settings的Rendering是Linear。然后烘焙的时候尽量用相同的曝光值和Gamma设置。Unity的Lighting设置里有Ambient Intensity和Reflection IntensityUE4的Lightmass里有Environment Color和Environment Intensity这些都要对齐。还有一个细节是光照贴图的采样过滤。Unity默认用Bilinear过滤UE4默认也是Bilinear但UE4多了一个Lightmap Filtering选项可以选Bilinear或Bicubic。Bicubic更平滑但更慢我一般用Bilinear就够了。5.3 动态物体GI的探针与距离场方案对比动态物体的GI三套管线的方案差异很大。Unity用Light Probe GroupUE4用DFAO加LumenHDRP则可以用Light Probe加Ray Tracing GI。Light Probe的优点是轻量缺点是精度低。探针是空间中的离散采样点动态物体在探针之间移动时间接光是插值出来的所以精度取决于探针的密度。我一般会在动态物体活动频繁的区域加密探针比如角色经常走动的走廊探针间距设在1到2米不常去的地方可以稀疏一些3到5米一个。UE4的DFAO则是用Distance Field来计算环境光遮蔽不依赖探针。DFAO的优点是动态物体也能有比较准确的AO缺点是它只算AO不算颜色渗透。所以UE4里动态物体的间接光颜色还是要靠Lumen或者手动补光。HDRP的光追GI对动态物体支持最好因为它是全场景光追动态物体的间接光会实时更新。但前提是硬件支持DXR而且性能开销大。实际项目里我的建议是如果动态物体不多用Light Probe加烘焙GI就够了如果动态物体多且画质要求高上Lumen或光追GI如果是在移动端老老实实用烘焙加探针别想太多。6. 项目选型什么场景该用哪套GI方案6.1 移动端与PC端的GI方案分水岭移动端的GI方案基本只有一条路烘焙Lightmap加Light Probe。URP的SSGI在移动端太重HDRP的光追GI移动端根本不支持UE4的Lumen在移动端也是实验性的。所以移动端项目GI的重点是烘焙质量和探针布局而不是实时GI。PC端的选择就多了。如果是中低端PCURP加烘焙GI是稳妥选择SSGI可以开但别指望太多。如果是高端PCHDRP加光追GI或者UE4加Lumen都能出很好的效果但要注意性能预算。如果是主机UE4的Lumen和HDRP的光追GI都是可行的具体看目标帧率和分辨率。这里有个经验数据1080p 60帧的目标下光追GI和Lumen大概能用在中高复杂度场景如果目标是4K 60帧那光追GI基本不用考虑除非是RTX 4080以上的显卡。6.2 静态场景与动态场景的GI策略选择静态场景的GI策略很简单烘焙。烘焙的GI质量最高性能开销最低因为运行时不需要计算间接光。静态场景的烘焙可以放心把Bounces调到3到5Resolution调高反正只烘一次。动态场景就麻烦了。如果场景里大部分物体是动态的烘焙GI基本没用因为物体一动光照就不对了。这时候只能上实时GILumen、光追GI或者SSGI。但实时GI的性能开销大所以动态场景通常需要降低其他方面的画质来平衡比如降低阴影质量、减少后处理效果。混合场景部分静态部分动态是最常见的。我的做法是静态物体烘焙GI动态物体用探针或实时GI。但要注意静态和动态物体的GI要尽量匹配否则动态物体在静态GI环境里会显得格格不入。匹配的方法是烘焙的时候把动态物体也放进去让它们参与间接光计算但烘焙完成后把动态物体的烘焙数据去掉只保留它们对静态物体的影响。6.3 画质与性能的平衡点怎么找GI的画质和性能平衡核心是找到那个看起来够好的最低配置。我的方法是先开最高画质然后逐项降低参数直到肉眼能看出明显画质下降为止然后回退一档。具体到GI参数Bounces从4降到2画质下降通常不明显但烘焙时间减半Lightmap Resolution从40降到20阴影边缘会变糊但如果不凑近看也还好SSGI的强度从1降到0.5间接光会变弱但配合环境光补偿也能接受。实时GI方面Lumen的Final Gather Quality从4降到2噪点会增加但帧率能提升20%左右光追GI的反弹次数从3降到1间接光会变薄但性能提升明显。这些取舍没有标准答案取决于你的项目对画质和帧率的优先级。我个人在实际项目里的体会是GI的画质提升在初期很明显但到了某个点之后投入产出比会急剧下降。比如Bounces从1到2画质提升很大从2到4画质提升就很小了但烘焙时间翻倍。所以找到那个拐点很重要别盲目堆参数。7. 那些文档里不会写的GI踩坑记录7.1 光照泄漏与接缝问题的排查链路光照泄漏是烘焙GI最常见的问题表现是光线穿过墙壁在隔壁房间的地面上出现不该有的亮斑。这个问题的根源通常是UV2的接缝或者光照贴图分辨率不足。排查链路是这样的先看泄漏的位置是不是在UV接缝附近如果是那基本就是UV2的问题。解决办法是重新展UV2或者在Unity里调高Lightmap Padding让接缝处的texel有更多余量。如果不是接缝问题那就看光照贴图分辨率是不是太低调高分辨率再烘一次试试。UE4里还有一个特有的泄漏问题Lightmass Portal没放对。Portal的位置和大小会影响光线的进入路径如果Portal太大或者位置偏了光线会从奇怪的角度进入室内造成泄漏。解决办法是调整Portal的位置和大小让它紧贴窗口或门口。7.2 动态物体GI不匹配的典型表现与修复动态物体GI不匹配的典型表现是角色走到某个区域身上的光照突然变亮或变暗或者颜色突然偏了。这个问题通常是Light Probe的插值出了问题。Light Probe的插值是基于Delaunay三角剖分的如果探针布局不合理比如有探针被放在了几何体内部插值就会出错。解决办法是检查探针位置确保没有探针在墙壁或地板里面。另外探针的密度也要均匀不要一个区域特别密另一个区域特别疏否则插值会不连续。UE4里动态物体GI不匹配的表现通常是DFAO的AO过强或过弱。DFAO的强度可以在Lightmass Settings里调但更根本的解决办法是调整Distance Field Resolution。距离场分辨率太低AO就会不准确太高则显存占用大。我一般会把重要物体的距离场分辨率调高次要物体调低。7.3 烘焙时间失控的常见原因与加速手段烘焙时间失控是另一个让人头疼的问题。常见原因有几个Bounces太高、Lightmap Resolution太高、场景三角形太多、GPU烘焙没开启。加速手段方面最有效的是开启GPU烘焙。Unity的Progressive Lightmapper支持GPU烘焙速度比CPU快3到5倍。UE4的Lightmass也支持GPU烘焙但需要开启Use GPU Lightmass选项。不过GPU烘焙对显卡有要求而且有些材质和光照类型不支持需要提前测试。另一个加速手段是分块烘焙。大场景不要一次性烘而是分成几个区域逐个烘焙。Unity里可以用Lightmap Parameters给不同区域设置不同的参数UE4里可以用Lightmass Importance Volume来限定烘焙范围。这样既能控制烘焙时间又能针对不同区域调整质量。还有一个技巧是降低烘焙时的光线采样数。Unity的Lightmapper有Direct Samples和Indirect SamplesUE4的Lightmass有Num Indirect Lighting Bounces和Indirect Lighting Quality。这些参数调低可以显著加快烘焙但画质会下降。我的做法是先低质量烘一版看整体效果确认没问题后再高质量烘最终版。这样避免高质量烘了半天发现布局有问题又要重来。8. 从GI差异反推PBR材质调优的实战建议GI和PBR材质是互相影响的。同样的材质在不同的GI环境下表现完全不同。所以调PBR材质的时候不能只看材质球本身还要考虑它所在的GI环境。在URP里因为GI比较弱材质需要适当提高环境光反射的强度来补偿。具体做法是调高Smoothness或者Metallic让材质更多地反射环境光。但注意别调过头否则会显得油腻。在HDRP里GI比较丰富材质可以保持物理正确的参数不需要额外补偿。HDRP的Volume系统里可以调Indirect Lighting Intensity如果觉得间接光太强可以适当调低。在UE4里Lumen的GI非常动态材质需要注意间接光的颜色渗透。比如一个白色物体放在红色旁边Lumen会让白色物体染上红色这时候材质的Base Color就要考虑这个因素别调得太纯。还有一个跨管线的通用建议GI环境确定之后再调材质。很多人习惯先调材质再搭GI结果GI一换材质全废。正确的流程是先搭好GI环境烘焙或实时然后在最终GI环境下调材质。这样调出来的材质才是在这个GI环境下正确的。最后分享一个小技巧用标准球体和标准材质做跨管线对比。在场景里放一组标准球体金属度0、粗糙度0.5、Base Color中性灰然后在三套管线里分别截图对比。如果标准球体的表现一致那GI环境基本对齐了如果不一致就调GI参数直到一致。这个方法比凭感觉调要靠谱得多。