
1. 全局光照到底在解决什么问题很多人第一次接触PBR渲染管线的时候会把注意力全放在材质、贴图、法线这些看得见的东西上结果做完场景一看模型要么像塑料玩具一样飘在空中要么暗部死黑一片怎么调材质都不对。问题往往不在材质本身而在于**全局光照Global Illumination简称GI**没处理好。全局光照说白了就是模拟光线在场景里弹来弹去的过程。现实世界里阳光照进房间不会只照亮被直射的那块地板墙壁、天花板、家具都会把光反射出去让整个空间亮起来。这种间接反射的光就是全局光照要解决的核心。如果只做直接光照Direct Lighting场景就会显得生硬、不真实暗部完全没有细节。Unity的URP、HDRP和UE4在全局光照的实现思路上差异非常大这也是为什么同一个场景在不同引擎里跑出来效果天差地别。URP走的是轻量化路线GI方案相对克制HDRP是Unity的高清管线GI能力完整但配置复杂UE4的Lightmass和Lumen则是另一套哲学尤其是Lumen直接把实时全局光照拉到了可用级别。这篇文章主要面向已经上手过至少一个引擎、想搞清楚GI底层逻辑的开发者。如果你还在纠结为什么我的场景这么暗或者烘焙出来的光照为什么和预览不一样那这篇内容应该能帮你理清思路。我会从三个引擎的GI架构讲起拆解各自的实现原理再给出可直接复现的配置步骤和参数计算最后把踩过的坑整理成速查表。2. 三大引擎GI架构的核心差异2.1 URP的GI策略轻量优先够用就好URPUniversal Render Pipeline从设计之初就定位在移动端和中低端设备所以它的GI方案做了大量取舍。URP支持烘焙全局光照Baked GI和实时GIRealtime GI但实时GI依赖的是Enlighten的旧架构在URP下功能被大幅裁剪。URP的烘焙GI走的是Lightmapper路线底层是CPU或GPU Progressive Lightmapper。它的核心逻辑是把静态物体的光照信息预先计算好烘焙到Lightmap贴图里运行时直接采样。这样做的好处是运行时开销极低坏处是动态物体没法享受烘焙光照而且场景一改就得重新烘焙。URP下实时GI的限制更明显。Enlighten在URP里基本处于能用但别指望太多的状态动态物体的间接光反弹效果很弱而且对场景规模有硬性限制。我实测过一个200米见方的场景Enlighten的实时GI直接崩了光照探针Light Probe的密度根本跟不上。所以URP的GI策略可以总结为静态靠烘焙动态靠探针实时GI当添头。这个策略在移动端是合理的但在PC端做写实场景就会显得力不从心。2.2 HDRP的GI方案完整但复杂HDRPHigh Definition Render Pipeline是Unity对标3A级画面的管线GI能力完整得多。它支持Progressive LightmapperCPU和GPU两种模式GPU模式速度快但吃显存Enlighten Realtime GI比URP下完整支持动态物体的间接光Screen Space Global IlluminationSSGI屏幕空间的实时GI效果不错但有屏幕外信息丢失的问题Ray Tracing GI需要DXR兼容硬件效果最好但门槛高HDRP的GI配置项非常多光是Lightmap的参数就有几十个。新手很容易被这些参数绕晕结果烘焙出来的效果还不如默认设置。我的经验是先把Lightmap Resolution和Lightmap Padding这两个参数调对其他参数先保持默认等基础效果出来了再微调。HDRP下还有一个容易被忽略的点Volume框架。HDRP的很多GI相关设置是通过Volume覆盖的比如Exposure、Indirect Lighting Controller等。如果你发现场景亮度不对先检查Volume设置而不是去改Lightmap。2.3 UE4的GI哲学Lightmass与Lumen双轨并行UE4的GI方案分两条线传统的Lightmass烘焙和Lumen实时全局光照。Lightmass是UE4用了很多年的烘焙系统底层是CPU光线追踪烘焙质量很高但速度慢。它的核心优势是光子映射Photon Mapping能处理复杂的间接光反弹尤其是室内场景的多次反弹效果非常自然。Lightmass的参数相对集中主要调Static Lighting Level Scale、Num Indirect Lighting Bounces和Indirect Lighting Quality这三个就够用了。Lumen是UE5引入的但UE4后期版本也有实验性支持。Lumen的核心是软件光线追踪Software Ray Tracing加距离场Distance Field能在不依赖硬件光追的情况下实现实时全局光照。Lumen的厉害之处在于动态场景的GI响应非常快改个光源位置间接光几乎立刻更新。但Lumen也有明显短板距离场精度有限小物件和薄壁结构的GI容易出问题性能开销大中低端显卡跑不动噪点问题需要配合Temporal AA才能压住。三个引擎的GI架构对比可以看下面这张表特性URPHDRPUE4 LightmassUE4 Lumen烘焙GI支持支持支持不适用实时GI有限支持支持不支持支持硬件光追GI不支持支持不支持支持UE5动态物体GI探针探针SSGI探针原生支持性能开销低中高烘焙时高运行时高适用场景移动端PC/主机静态场景动态场景3. 烘焙GI的实操流程与参数计算3.1 Unity URP烘焙GI完整步骤先讲URP的烘焙流程因为它的参数最少最容易上手。第一步标记静态物体。在Inspector里把需要烘焙的物体勾选Contribute GI同时设置Static选项。这里有个坑很多人只勾了Contribute GI但没勾Static结果烘焙出来物体不参与GI计算。Contribute GI控制的是这个物体是否参与GIStatic控制的是这个物体是否静态两者要配合使用。第二步配置Lighting面板。打开Window Rendering Lighting在Scene标签页里设置Lighting Mode选Baked Indirect或Subtractive。Baked Indirect只烘焙间接光直接光还是实时的适合动态光源Subtractive把直接光和间接光都烘焙适合完全静态的场景。Lightmapper选Progressive GPU速度比CPU快很多。Lightmap Resolution默认是40 texels per unit这个值决定了光照贴图的精度。计算公式是Lightmap Resolution 场景对角线长度 / 期望的贴图边长。比如场景对角线20米想要2048的贴图那分辨率就是20/2048≈0.01换算成texels per unit就是100。第三步调整Lightmap Padding。这个参数控制物体在Lightmap上的间隔防止光照渗色。一般设2-4个texel就够了太小会渗色太大会浪费贴图空间。第四步烘焙。点击Generate Lighting等进度条走完。烘焙时间取决于场景复杂度和分辨率一个中等场景在GPU模式下大概几分钟。注意URP下如果场景里有大量小物件建议合并成一个大网格再烘焙否则每个物件都要占一块Lightmap空间贴图利用率极低。3.2 HDRP烘焙GI的关键参数HDRP的烘焙流程和URP类似但参数更多坑也更多。Lightmap Resolution在HDRP下默认是2 texels per unit比URP低很多。这是因为HDRP的场景通常更大如果按URP的精度来贴图会爆掉。我的经验是室内场景设10-20室外场景设2-5具体看场景尺度。Indirect Resolution是HDRP特有的参数控制间接光的采样精度。这个值设太低间接光会有明显的块状噪点设太高烘焙时间翻倍。一般设Lightmap Resolution的1/2到1/4比较合适。Lightmap Padding在HDRP下建议设4-8因为HDRP的光照贴图通常更大需要更多间隔来防止渗色。Denoiser是HDRP烘焙的利器能大幅减少噪点。Optix Denoiser需要NVIDIA显卡OpenImageDenoise是CPU的速度慢但兼容性好。我一般用Optix效果和速度都满意。HDRP还有一个Lightmap Compression选项默认是Auto。如果发现光照贴图有色带改成High Quality但显存占用会翻倍。3.3 UE4 Lightmass烘焙参数详解UE4的Lightmass烘焙在World Settings里配置核心参数如下Static Lighting Level Scale这个参数控制光照计算的尺度默认是1。如果场景很大设0.5-0.8能加快烘焙速度但降低精度如果场景很小设1.5-2能提高精度。计算公式是Level Scale 场景实际尺寸 / 引擎默认尺寸。Num Indirect Lighting Bounces间接光反弹次数默认是3。每增加一次烘焙时间大概增加30%-50%。室内场景建议设5-10室外场景3-5就够了。Indirect Lighting Quality间接光质量默认是1。设2-4能明显减少噪点但烘焙时间线性增加。Indirect Lighting Smoothness间接光平滑度默认是1。设0.75-0.9能减少噪点但会损失细节。Compress Lightmaps是否压缩光照贴图默认开启。如果发现色带严重关掉这个选项但显存占用会增加4倍。UE4的烘焙时间通常比Unity长一个中等室内场景可能要几十分钟到几小时。建议先用低质量参数快速预览确认效果后再用高质量参数正式烘焙。4. 实时GI的实现与性能权衡4.1 HDRP的SSGI配置与限制SSGIScreen Space Global Illumination是HDRP下最实用的实时GI方案因为它不需要硬件光追性能开销也可控。配置SSGI的步骤在场景里添加一个Volume添加Screen Space Global Illumination覆盖勾选Enable调整Ray Steps光线步数默认是32设16-64之间。步数越高效果越好但越吃性能调整Radius采样半径默认是1设0.5-2之间。半径越大间接光越柔和但越容易漏光调整Intensity强度默认是1根据场景亮度微调SSGI的核心限制是屏幕空间它只能看到屏幕内的信息屏幕外的物体不参与GI计算。所以当摄像机转动时屏幕边缘的间接光会突然出现或消失产生闪烁。解决办法是配合Reflection Probe和Light Probe使用用探针补全屏幕外信息。我实测下来SSGI在室内场景效果不错尤其是配合高粗糙度材质时间接光的柔和感很自然。但在室外大场景下SSGI的半径不够用间接光会显得很局部。4.2 UE4 Lumen的启用与调优Lumen在UE4后期版本里是实验性功能启用步骤打开Project Settings Rendering勾选Dynamic Global IlluminationMethod选Lumen勾选Generate Mesh Distance Fields距离场是Lumen的基础重启编辑器Lumen的核心参数Final Gather Quality最终聚集质量默认是1。设2-4能减少噪点但性能开销增加Scene Lighting Quality场景光照质量默认是1。设2-4能提高间接光精度Lumen Scene DetailLumen场景细节默认是1。设2-4能捕捉更多小物件Distance Field Resolution Scale距离场分辨率默认是1。设2-4能提高距离场精度但显存占用增加Lumen的性能开销很大中端显卡如GTX 1660跑1080p大概只能到30帧。优化手段包括降低Final Gather Quality、减少距离场分辨率、关闭硬件光追。Lumen的噪点问题需要配合Temporal AA和Lumen Denoiser使用。Temporal AA的Temporal Upsampling选项能进一步降低噪点但会引入轻微的拖影。4.3 实时GI的性能对比与选型建议三个方案的性能开销从低到高排列URP Enlighten Realtime GI开销最低但效果最弱只适合移动端HDRP SSGI开销中等效果不错适合PC端室内场景UE4 Lumen开销最高效果最好适合高端PC和主机选型建议移动端项目URP 烘焙GI Light Probe别碰实时GIPC端写实项目HDRP 烘焙GI SSGI硬件光追可选动态场景多的项目UE4 Lumen但要做好性能优化静态场景为主的项目UE4 Lightmass烘焙质量最高5. 常见问题与排查技巧实录5.1 光照贴图渗色与接缝问题问题表现物体边缘出现其他物体的颜色或者Lightmap接缝处有明显色差。排查思路检查Lightmap Padding是否太小建议设4-8检查物体是否共用同一块Lightmap如果是确保它们的UV不重叠检查Lightmap Resolution是否太低导致采样精度不够如果是接缝问题检查UV接缝是否对齐必要时手动调整UV独家技巧在Unity里可以用Lightmap Parameters资产来单独控制每个物体的烘焙参数。创建一个Lightmap Parameters资产把Padding设大然后赋给容易渗色的物体。5.2 烘焙结果与预览不一致问题表现Scene视图里光照正常但Game视图里暗部死黑或者过曝。排查思路检查Exposure设置HDRP和UE4都有自动曝光可能把亮度压了检查Color Space必须是LinearGamma空间下GI计算会出错检查Lightmap EncodingHDRP下建议用High Quality检查Ambient IntensityURP下这个值默认是1设太低会导致暗部死黑独家技巧在Unity里可以临时把Ambient Mode改成Flat用一个纯色环境光快速验证GI是否正常。如果Flat模式下正常说明是GI的问题如果还是不对说明是材质或曝光的问题。5.3 实时GI的闪烁与噪点问题表现摄像机移动时间接光闪烁或者画面有颗粒状噪点。排查思路SSGI的闪烁通常是屏幕外信息丢失导致的增加Reflection Probe密度Lumen的噪点需要提高Final Gather Quality和Temporal AA质量检查Temporal AA是否开启关闭TAA噪点会非常明显检查Ray Steps是否太低SSGI建议至少32步独家技巧Lumen的噪点可以用Lumen Denoiser压但Denoiser会引入轻微拖影。如果拖影不可接受可以降低Denoiser强度用TAA来补。5.4 动态物体GI不生效问题表现动态物体如角色在场景里没有间接光显得很平。排查思路检查Light Probe Group是否覆盖了动态物体所在区域检查动态物体的Renderer是否勾选了Contribute GIUnity或Affect Dynamic Indirect LightingUE4检查Light Probe的密度是否足够稀疏的探针会导致间接光过渡不自然HDRP下检查SSGI是否开启SSGI能给动态物体提供屏幕空间的间接光独家技巧Unity的Light Probe可以用Probe Adjustment Volume来局部调整比如在角色经常活动的区域加密探针。UE4的Indirect Lighting Cache也能给动态物体提供间接光但精度不如Light Probe。5.5 常见问题速查表问题可能原因解决方案暗部死黑Ambient Intensity太低提高Ambient Intensity或增加反弹次数光照渗色Lightmap Padding太小增大Padding到4-8接缝色差UV接缝未对齐手动调整UV或增大Padding烘焙结果与预览不一致Exposure或Color Space错误检查Exposure和Color Space设置实时GI闪烁屏幕外信息丢失增加Reflection Probe密度Lumen噪点Final Gather Quality太低提高质量或开启Denoiser动态物体无GILight Probe未覆盖增加Light Probe密度烘焙时间过长分辨率或反弹次数太高降低分辨率或反弹次数6. 跨引擎GI效果对比与迁移经验6.1 同一场景在三引擎下的GI表现我拿一个标准的室内场景一个房间有窗户、家具、几个点光源在三个引擎里各跑了一遍参数尽量对齐结果差异很明显。URP烘焙GI效果中规中矩间接光比较平暗部细节一般。SSGI在URP下不可用所以动态物体的GI只能靠Light Probe过渡不够自然。整体感觉是够用但不出彩。HDRP烘焙GI质量明显高于URP间接光的层次感更好暗部细节丰富。SSGI开启后动态物体的GI过渡自然很多但屏幕边缘有轻微闪烁。整体感觉是接近3A水准。UE4 Lightmass烘焙质量最高间接光的多次反弹非常自然尤其是窗户透进来的光在地板上的反弹层次感最强。但烘焙时间最长一个场景烘了将近两小时。UE4 Lumen实时GI效果惊艳改光源位置间接光立刻更新动态物体的GI完全原生支持。但噪点明显需要TAA压而且性能开销大帧率只有Lightmass方案的一半。6.2 从Unity迁移到UE4的GI注意事项如果你要把Unity项目迁移到UE4GI方面有几个坑要注意Lightmap UVUnity的Lightmap UV是引擎自动生成的UE4也自动生成但两者的UV布局算法不同。迁移后需要重新生成Lightmap UV否则会有接缝和渗色。光照单位Unity的光照强度单位是LuxUE4是Lumens。迁移时需要换算1 Lux ≈ 0.0929 Lumens。如果直接照搬数值光照会差一个数量级。Color SpaceUnity默认是GammaUE4默认是Linear。迁移时要把Unity的Color Space改成Linear否则颜色会偏。Light Probe vs Indirect Lighting CacheUnity的Light Probe和UE4的Indirect Lighting Cache功能类似但实现不同。迁移后需要重新布置探针不能直接复用。6.3 从UE4迁移到Unity的GI注意事项反过来迁移也有坑Lightmass PortalUE4的Lightmass Portal能大幅提高窗户处的GI质量Unity没有对应功能。迁移后窗户处的GI会变差需要用Reflection Probe补。Distance FieldUE4的Distance Field是Lumen的基础Unity没有对应功能。迁移后实时GI效果会打折扣。Lightmap ResolutionUE4的Lightmap Resolution单位是texels per unitUnity也是但两者的默认值不同。UE4默认是0.1Unity默认是40。迁移时需要重新计算。Post Process VolumeUE4的Post Process Volume和Unity的Volume框架类似但参数不同。迁移后需要重新配置曝光、Bloom等参数。7. 我个人在实际操作中的体会GI这个东西参数多、坑多、调试时间长但核心逻辑其实不复杂静态靠烘焙动态靠探针实时靠屏幕空间或距离场。把这三句话记住遇到问题就不会慌。我踩过最大的坑是Lightmap Resolution设太高。有一次为了追求精度把分辨率设到了200 texels per unit结果烘焙了六个小时出来的贴图有4K显存直接爆了。后来才明白分辨率不是越高越好够用就行。计算公式是分辨率 场景对角线长度 / 期望贴图边长一般2048的贴图就够用了。另一个坑是Color Space。有一次项目从Gamma切到Linear所有光照都变了暗部死黑亮部过曝。查了半天才发现是Color Space的问题。所以新建项目第一件事就是确认Color Space是Linear。最后分享一个小技巧用Lightmap Parameters资产来单独控制物体的烘焙参数。Unity的Lightmap Parameters可以创建多个资产每个资产有不同的Padding、Resolution等参数然后赋给不同的物体。这样就能针对容易渗色的物体单独调参数不用全局改。这个内容后续还可以这样扩展比如深入讲Light Probe的插值算法或者对比不同Denoiser的效果或者讲GI在VR项目里的特殊处理。GI这个话题太大了一篇文章只能讲个大概具体到每个引擎的每个参数都能单独写一篇。