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策略:轻量优先,够用就好
URP(Universal Render Pipeline)从设计之初就定位在移动端和中低端设备,所以它的GI方案做了大量取舍。URP支持烘焙全局光照(Baked GI)和实时GI(Realtime 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方案:完整但复杂
HDRP(High Definition Render Pipeline)是Unity对标3A级画面的管线,GI能力完整得多。它支持:
- Progressive Lightmapper:CPU和GPU两种模式,GPU模式速度快但吃显存
- Enlighten Realtime GI:比URP下完整,支持动态物体的间接光
- Screen Space Global Illumination(SSGI):屏幕空间的实时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架构对比可以看下面这张表:
| 特性 | URP | HDRP | UE4 Lightmass | UE4 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控制的是"这个物体是否参与GI",Static控制的是"这个物体是否静态",两者要配合使用。
第二步,配置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配置与限制
SSGI(Screen 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 Illumination,Method选Lumen
- 勾选Generate Mesh Distance Fields(距离场是Lumen的基础)
- 重启编辑器
Lumen的核心参数:
- Final Gather Quality:最终聚集质量,默认是1。设2-4能减少噪点但性能开销增加
- Scene Lighting Quality:场景光照质量,默认是1。设2-4能提高间接光精度
- Lumen Scene Detail:Lumen场景细节,默认是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,别碰实时GI
- PC端写实项目: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,必须是Linear,Gamma空间下GI计算会出错
- 检查Lightmap Encoding,HDRP下建议用High Quality
- 检查Ambient Intensity,URP下这个值默认是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 GI(Unity)或Affect Dynamic Indirect Lighting(UE4)
- 检查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 |
| 动态物体无GI | Light 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项目迁移到UE4,GI方面有几个坑要注意:
Lightmap UV:Unity的Lightmap UV是引擎自动生成的,UE4也自动生成,但两者的UV布局算法不同。迁移后需要重新生成Lightmap UV,否则会有接缝和渗色。
光照单位:Unity的光照强度单位是Lux,UE4是Lumens。迁移时需要换算,1 Lux ≈ 0.0929 Lumens。如果直接照搬数值,光照会差一个数量级。
Color Space:Unity默认是Gamma,UE4默认是Linear。迁移时要把Unity的Color Space改成Linear,否则颜色会偏。
Light Probe vs Indirect Lighting Cache:Unity的Light Probe和UE4的Indirect Lighting Cache功能类似但实现不同。迁移后需要重新布置探针,不能直接复用。
6.3 从UE4迁移到Unity的GI注意事项
反过来迁移也有坑:
Lightmass Portal:UE4的Lightmass Portal能大幅提高窗户处的GI质量,Unity没有对应功能。迁移后窗户处的GI会变差,需要用Reflection Probe补。
Distance Field:UE4的Distance Field是Lumen的基础,Unity没有对应功能。迁移后实时GI效果会打折扣。
Lightmap Resolution:UE4的Lightmap Resolution单位是texels per unit,Unity也是,但两者的默认值不同。UE4默认是0.1,Unity默认是40。迁移时需要重新计算。
Post Process Volume:UE4的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这个话题太大了,一篇文章只能讲个大概,具体到每个引擎的每个参数,都能单独写一篇。