Unity URP/HDRP与UE4全局光照差异实操指南
做跨引擎渲染对比的人多少都有点“强迫症”同样一个场景、同一套PBR材质在Unity URP里调完颜色搬到UE4里一看总觉得地面“变质”了反过来UE4里做好的黄昏氛围放进Unity HDRP又显得干瘪、发平。材质参数、线性空间、灯光方向都排查过一遍问题往往不在模型也不在贴图而藏在“全局光照”这个看不见的层里。单帧静帧可以用美术手法绕过但项目真要跨引擎落地必须搞清楚两边的GI到底怎么算、怎么烘、怎么调。这篇就专门聊Unity URP、HDRP和UE4在全局光照上的实现差异重点是实操时可以照抄的参数设置、场景准备、动态物体间接光方案和踩坑总结。适合场景美术、TA也想跨引擎迁移项目的图形程序员。全文不聊渲染方程推导只聊怎么在项目里用、为什么同一个场景出来后感觉完全不一样。1. 调参之前先看“家底”三个管线的GI体系根本不是一回事全局光照这个词被用得太泛了。实际项目里我们说的GI通常指三件事一是静态物体之间的光线反弹间接漫反射二是动态物体从环境中获得的环境光三是材质表面的反射/镜面IBL。三个管线在这三件事上的实现路径完全不同所以盲目对照参数永远对不上。1.1 Unity的真实身份烘焙为主、实时为辅Unity内置渲染管线时期有Enlighten实时GI号称可以实时更新间接光但实际精度和可控性都比较尴尬。到了URP和HDRP时代Unity把重心完全放到了烘焙GI上通过Progressive Lightmapper渐进式光照贴图器CPU/GPU两种模式预计算间接漫反射再配合Light Probe光照探针和Reflection Probe反射探针给动态物体和镜面反射提供数据。URP适合移动端和中低端项目它的烘焙结果依赖场景里的静态标记Static和光照贴图UV运行时几乎没有实时GI开销。HDRP则更倾向“高端离线烘焙 可选的实时反射”组合它在HDRP里还可以开启Screen Space Global IlluminationSSGI或者基于DXR硬件光追的反射/全局光照但这些都属于“后期补充”绝大多数HDRP项目不会把所有GI都跑在实时上成本完全扛不住。这里要记住Unity的一个关键特性URP和HDRP都不再把光照贴图当作“附加品”而是把间接光、AO、反射全部拆成独立资源烘焙参数做得比老版本精细许多但同样的参数也会让新人困惑——Bounces光线反弹次数、Indirect Intensity、Lightmap Resolution、Light Probe Reduction这几个参数互相影响调错一个画面就脏。1.2 UE4的Lightmass离线烘焙才是正统UE4的全局光照体系核心是Lightmass——一套独立于主进程的离线烘焙工具。它基于“光子映射 辐射度累积”的做法把场景里的静态网格体烘焙到Lightmap光照贴图和Volumetric Lightmap体积光照贴图VLM中。UE4也有过实时的Light Propagation VolumesLPV但官方早已不推荐项目里很少见到有人用它学习成本高且效果一般新项目基本可以跳过。Lightmass的优点是烘焙质量稳定、间接光过渡柔和尤其是室外场景暖阳冷暗部的色彩溢出比Unity默认效果好很多。但它也有一个致命节奏问题每次修改静态灯光、模型位移或者材质里的发光属性都要重新Build Lighting而且UE4的Build时间比Unity要长不少尤其是大型关卡全量烘焙动辄半小时以上。团队如果没有养成“集中烘焙”的习惯很容易被迭代速度拖死。1.3 HDRP那点“例外”SSGI和光追不是免费午餐很多人一看到HDRP支持SSGI就觉得可以脱离烘焙。实际测试下来HDRP的SSGI和反射都是屏幕空间技术只能处理屏幕内可见信息相机一转、物体出了画面间接光就断了。放个项目里你会发现墙角阴影不稳定门缝和遮挡关系频繁闪烁。SSGI适合用来给烘焙GI做动态叠加比如给角色脚下补一层接触阴影或者给半动态场景增加氛围但完全依赖SSGI做全局光照属于“自找麻烦”。HDRP的光追GI需要支持DXR的显卡运行时开销非常夸张项目里通常只用于离线预渲染或者高端展示场景真正量产的游戏很少全场景开启。所以我在做HDRP项目时默认方案依然是“Progressive Lightmapper烘焙 反射探针 少量SSGI做动态层”把实时计算控制在局部。2. 实操对比从场景准备到烘焙参数两边最该调的几组数字这个部分是最容易踩坑的地方。很多人跨引擎移植时只盯着灯光强度和颜色却忽略了间接光参数。同一盏平行光在Unity里强度1.2在UE4里强度3.2这本身不是问题——问题在于你烘焙时有没有把间接光和环境光的关系处理好。2.1 场景准备静态标记、光照贴图UV与模型规范不管哪个引擎烘焙GI前必须先分清静态和动态。Unity里模型必须勾选Static静态且需要保证模型有正确的UV2光照贴图UV。你可以用Generate Lightmap UVs自动生成但如果模型本身拓扑比较复杂或存在重叠UV自动生成的结果会很难看最好还是在DCC工具里手动展好第二套UV。UE4这边同样要求静态网格体有Lightmap UV但要多注意一个细节UE4的Lightmap UV坐标是有限制的引擎右上角Build菜单里可以看到Lightmap UVs是否为空、是否重叠。如果模型没有光照贴图UVUnity和UE4都不会报错而是直接显示成一片黑的烘焙结果。这个“黑屏”问题我排查过太多次每次最后都会发现是FBX导入设置里没有生成Lightmap UV。Unity在模型导入设置里开启Generate Lightmap UVsUE4在Static Mesh编辑器的Build Settings里点Generate Lightmap UVs逻辑都是自动摊开第二套UV但自动摊开对复杂模型不一定靠谱。模型规范这块我最想强调一个点不要用顶点色模拟AO。很多外包场景喜欢直接用顶点色刷暗部这在传统游戏时代很常用但到了PBR GI流程里顶点色会和烘焙AO、间接光互相叠加导致暗部发闷、颜色发脏。跨引擎移植时最好把模型顶点色全部清空让间接光计算重新跑一遍。2.2 Unity里的关键参数Bounces、Indirect Intensity、Lightmap ResolutionUnity的Lighting窗口里有几个参数我按影响程度排个序BouncesBaked LightBounces控制光线在场景里反弹的次数。默认值是1但1次反弹的画面会显得非常“平”暗部没有层次。建议室内场景至少4次室外场景2到3次。增加Bounces会让整体亮度上浮特别是角落和天花板需要重新校灯光强度。Indirect Intensity位于Environment Lighting下的Environment Multiplier或者Lightmap参数里的Indirect Intensity。这个参数直接放大或缩小间接光强度。URP默认烘焙出来容易偏灰我习惯把它设置在0.8到1.2之间微调而不是反复抬平行光强度。按我的经验Indirect Intensity调到0.85左右暗部会干净许多不会死黑也不会灰蒙蒙。Lightmap Resolution控制光照贴图精度单位是每单位多少像素。室内场景的小物件建议40到60大地面可以降到20到30。不要全场景都用最高精度烘焙时间和内存会成倍上涨而实际视觉提升非常有限——贴图精度翻倍烘焙时间可能翻三倍以上。Lighting ModeURP/HDRP支持Substractive、Shadowmask、Subtractive三种模式。移动端常用Subtractive配合Baked Direct Lighting可以保留实时阴影PC上更推荐Shadowmask模式它允许静态物体接受实时的方向光阴影同时带来烘焙的间接光性价比最高。实操时我通常先调Bounces再调Indirect Intensity最后才动Lightmap Resolution。如果发现画面有大量的噪点或者光斑先不要急着加分辨率而是检查是不是模型UV之间间距太小或者Lightmap Padding不足。把Padding从2提到4大多数漏光和串色问题都能解决。2.3 UE4里的关键参数Indirect Lighting Quality、Static Lighting Level Scale、Diffuse BoostUE4的World Settings面板里有Lightmass设置其中这几个参数跨界影响巨大Static Lighting Level Scale这个参数容易被人忽略它控制场景中光照贴图密度与物体的世界缩放比例之间的关系。默认值是1意思是1个光照贴图像素覆盖约50个世界单位具体换算要看项目单位设置。如果你发现场景里的地面阴影糊成一片可以把这个值下调到0.5相当于提升整体光照贴图密度代价是内存和烘焙时间上升。Indirect Lighting Quality默认1提升到2到4时Lightmass会为间接光计算更多采样直接效果是漏光减少、光斑减少、暗部过渡更平滑。室外场景调到2就够室内复杂场景我会调到4再往上收益不明显烘焙时间却容易翻倍。Diffuse Boost直接作用于间接漫反射强度默认1。如果你的内景暗部太黑可以提到1.2如果整个场景灰雾感重则往下降到0.7。这个参数和Unity的Indirect Intensity本质是同一个作用但从两个引擎的效果走向来看UE4里Diffuse Boost超过1.5后画面很容易发飘建议控制在0.8到1.3之间。还有Indirect Lighting Bounce Count可以通过Config文件调整默认是3次反弹。UE4的3次反弹已经能覆盖绝大多数场景室内烤漆面、玻璃反射之类需要更多反弹的复杂情况一般场景里很少遇到。我倾向于保持默认3而不是无脑调高因为高反弹次数会影响间接光饱和度让墙壁颜色互相污染太重。UE4的烘焙流程是设置World Settings → 按Build → 选Lighting QualityPreview / Medium / High / Production→ Build Only Lighting。日常迭代用Preview出外验或提交美术资源用Production。Production的采样质量和预览差异非常大预览版很多光照噪点在Production下会自动消失。很多新人看到预览版画面脏就拼命调参数其实是采样等级不够不是参数问题。3. 动态物体的间接光从Light Probe到体积光照图烘焙贴图只能管住静态物体角色、NPC、移动小车这类动态物体如果直接暴露在烘焙结果里会明显“飘”在场景上——脚下没有接触阴影头顶没有环境色。这时就需要另一套载体来承接动态物体的间接光。3.1 Unity的Light Probe Group铺设与密度控制Unity处理动态物体间接光的方法是Light Probe Group光照探针组。它的原理是在场景空间里布置一批采样点烘焙时记录每个点的间接光数据运行时动态物体根据自身位置从邻近探针插值获取颜色和亮度。Light Probe的布置密度是个经验活均匀铺会浪费资源太稀疏会导致角色移动时亮度突变、露出“台阶感”。我自己的做法是三层布点走廊和房间中轴线上每隔1到2米放一个关键交互区域门口、桌边、光源切换处加密到半米一个墙面和窗边再补一排用来捕捉从窗户透进来的暖色或冷色渐变。放置时记得把Probe高度稍微抬离地面避免它吃到地面贴图的暗部否则角色脚部怎么打亮都救不回来。还有个常见问题Unity场景里如果Light Probe的Tetrahedral四面体插值解析失败角色会闪成绿色或红色。出现这种现象几乎都是探针之间间距过大或者有探针被塞进了碰撞体内部。解决方法是打开Gizmos可视化探针位置把异常探针删掉或移动。另外大量美术为了省事会把整栋楼的探针“刷”成一层平面这会导致上下楼梯时间接光完全不正确我建议在楼梯中段和层高变化处必放探针每层至少两层高度。3.2 UE4的动态间接光Lightmass Importance Volume和体积光照贴图UE4里的动态物体间接光走的是Volumetric Lightmap体积光照贴图VLM它的数据由Lightmass烘焙时生成。VLM会在场景空间中布置一个三维规则网格记录复数球谐系数运行时给动态物体提供环境光。VLM的精度控制建筑在Lightmass Importance Volume重要体积上。这个体积定义“哪些空间值得存VLM数据”只有落在体积内的空间才会拥有高质量的动态间接光。很多人刚接触UE4时会忘记设置重要体积结果角色走到场景边缘时完全没有间接光发黑发干。你必须在游戏主活动区间内包住一个足够大的Lightmass Importance Volume并且让体积稍微包含墙体本身否则靠墙位置的角色还会被错误照亮。VLM有三种类型One Layer单层、Two Layer双层、Four Layer四层在项目设置里可以选。层数越高动态物体在不同海拔上的间接光过渡越平滑但内存和烘焙时间也越大。第三人称游戏场景如果存在山体和多层建筑至少选Two Layer纯平面地形场景用One Layer就够了。我第一次做山谷项目时选了One Layer角色在山坡上走路时偶尔会闪出一个错误的环境色改成Two Layer之后明显改善。UE4的Reflection Capture反射捕获对动态物体的镜面反射负责。放置位置和Light Probe逻辑类似每个房间至少放一个Reflection Capture需要在Build Reflection Captures之后才会把周围环境编码进Cubemap。注意Reflection Capture只反射静态场景动态物体本身不会进入彼此的反射所以在水面或镜面较多的场景里要配合Planar Reflection或Screen Space Reflection来补充。3.3 两边布点习惯的核心差别Unity的Light Probe是离散点UE4的VLM是连续体积网格两者布置逻辑有本质区别。Unity需要你手动一个一个点放UE4则只需要拉一个体积再由引擎内部网格化。因此我常建议团队Unity项目更依赖TA或者场景美术花时间布点布点质量直接决定动态角色画面好坏UE4项目则要在关卡设计阶段就规划好重要体积范围范围大了浪费内存范围小了角色出戏。两者都别指望自动生成解决一切虽然Unity有Light Probe Auto Placement自动放置但效果只能用于原型验证实际项目中还是手动布置更可靠。4. 反射与IBL全局光照的另一半很多人被室内暗部坑惨间接漫反射管的是“白天的地面、墙壁、天花板”而物体表面那种湿润、金属、玻璃的高光响应靠的是反射探针和IBLImage-Based Lighting。这部分在跨引擎对比里经常被忽略但画面质感差异很大。4.1 反射探针与反射捕获都是Cubemap但更新逻辑完全不同Unity的Reflection Probe有Realtime、Baked两种模式。Realtime模式每帧或定期重新捕获场景效果动态但开销高Baked模式则烘焙一次静态Cubemap适合室内固定机位。URP里推荐Baked 微量的Screen Space Reflection配合HDRP则直接用Reflection Probe加Volumetric体积来模拟复杂反射。UE4的Reflection Capture只有一个模式——静态捕获。它不会实时更新除非你主动重新Build Reflection Captures。同一个场景如果修改了静态灯光或移动了反射捕获位置没有重新Build的话反射还是会停留在旧状态这是UE4项目里反射问题最多的来源。两边的核心坑是同一个反射探针设置的Capture Radius和影响范围如果太小物体走到边界会出现突然的反射断裂。建议把Reflection Probe的影响范围做成有重叠的圆让两块Cubemap之间平滑过渡。HDRP里还要开着Reflection Probe的Blend相距通道否则多个探针重叠区域只会取最强信号过渡硬切。4.2 HDR环境图的选择与采集别再拿网图当天空盒很多人直接用一张普通JPG天空贴图当环境光结果物体表面的高光灰暗、金属材质乌突突。IBL之所以重要是因为它同时提供频率极高太阳、频率较低天空渐变的两类环境信息低精度贴图会把高频信息抹掉。正确的做法是使用HDR格式的EXR或者HDR文件常见资源站有Poly Haven这类免费HDR环境贴图库。如果你要还原真实项目可以在现场用全景相机拍HDR再后期合成为一张16bit的EXR。Unity中把这张图放进Skybox和Reflection SourceUE4则放进Sky Atmosphere Sky Light。注意两边的强度单位不同Unity的Intensity Multiplier更接近物理光照强度UE4的Sky Light强度默认1需要在Directional Light配合下平衡。4.3 HDRP里如何让暗部反射不“死板”HDRP的默认反射方案偏“干”尤其是在没有光追的时候暗部物体的反射非常微弱甚至几乎看不出来。我的处理方法是给Reflection Probe加上“Cone”和“Range”控制器让反射覆盖范围更自然同时开启SSRScreen Space Reflections作为补充。SSR会把当前屏幕上已经渲染的像素当作反射源所以它能看到画面中出现的角色和武器但屏幕外的东西依然看不到。更实际的经验是在暗部较多场景里不要依赖反射探针给环境补光因为反射探针不会产生漫反射环境光。你需要的还是Light Probe或者反射探针里的环境贡献度。HDRP的Volume里有个Indirect Lighting Controller会直接影响间接光强度很多人找不到它默认隐藏得比较深。打开这个控制器并调低Diffuse GI强度可以让暗部保留更多细节但不会过度泛灰。5. 性能与迭代效率烘得动、跑得起才是好方案全局光照的最终选择一半看画面一半看性能。两个引擎在烘焙时间和运行时开销上差距非常大这也是跨引擎项目资源规划时最容易被忽视的部分。5.1 烘焙时间与磁盘占用对比Unity的Progressive Lightmapper支持CPU和GPU两种烘焙。GPU模式在支持RTX的卡上会明显更快实测室内场景GPU模式比CPU快2到3倍但它有一些固有问题显卡驱动崩溃就会导致烘焙中断而且GPU显存不足时大场景只能靠分块。CPU模式更稳适合24小时无人值守的中央烘焙机。磁盘占用上Unity的光照贴图通常导出为EXRHDR格式一张1024的光照贴图在十几MB左右大型场景整体占比很可观。UE4的Lightmass烘焙时间普遍比Unity长。原因之一是Lightmass默认启动的是多个独立进程每个进程只处理一块区域如果你的机器核心数少烘焙会非常慢。UE4的Lightmap默认输出是F16HDR的格式磁盘占用同样不低而且还要额外生成VLM数据整体占用比Unity更高。我在Process里见过一个中等规模开放场景Lightmap加VLM总共占掉1.5GB的内存卸载很多静态物体之后才压下来。如果你要经常迭代我给几个建议隔离出独立烘焙关卡或者在同一个关卡里用“最小可烘区域”调试参数确认满意后再全量烘焙。Unity里把Lightmap Parameters设为低分辨率版本烘PreviewUE4里用Lighting Quality Preview模式——这些方式都能在几十秒内出结果迭代效率能差出一个数量级。烘焙机的CPU占用和内存要提前规划UE4尤其吃核心数8核以下机器要慎重。5.2 运行时开销URP轻量HDRP昂贵UE4主要拼探针运行时方面URP的全局光照在烘焙完成之后GPU基本上只需要读取采样光照贴图开销极低这是移动端项目的核心竞争力。HDRP在运行时除了烘焙数据还要处理SSGI、SSR、Volumetric Fog等后处理栈帧时间会有明显上涨尤其在4K分辨率下。UE4运行时没有实时GI计算它读取Lightmap和VLM数据开销其实不大。真正的性能大头在动态物体多时每个角色都要从VLM做球谐插值和环境光累计角色数量上到几十个后这部分开销会直接影响帧率。如果你做大面积同屏角色的项目需要把VLM层数调低或者在Quality Settings里降低Volumetric Lightmap的品质。5.3 跨引擎项目资源分配建议如果你正在做“Unity URP/HDRP和UE4同步开发”我建议不要逐个参数强行对齐而是按表现目标拆分移动端用URP只计算最简单烘焙GI Light ProbePC高端用HDRP烘焙 SSGI 光追反射UE4端反而能直接用Lightmass 较高精度的VLM。与其追求“三个平台画面一致”不如承认每个引擎的GI上限和下限不同按各自特性去做画面反而更容易保证质量和性能平衡。6. 常见问题排查与经验速查最后把我在实际项目里经常遇到的GI问题整理成一张速查表按“现象—原因—解法”来写省得大家再走一遍弯路。现象可能原因排查与解法暗部死黑、不灰间接光倍率太低 / Bounce太少Unity查Indirect IntensityUE4查Diffuse Boost先提到1.2左右再看阳光照不进室内窗户没有开口 / 模型单面阻挡检查窗户模型是否是双面材质开启双面投影或者补一个透明材质漏光墙面之间出现亮缝Lightmap UV重叠或间距不够把Lightmap Padding从2调到4或8重新生成Lightmap UV角色脚下没有接触阴影Light Probe或VLM没有覆盖该区域补探针/拉大Lightmass Importance Volume再重新烘焙反射断裂、硬切Reflection Probe影响范围不重叠让多个探针之间保留重叠区HDRP里开启Blend画面灰得像雾天空盒过暗 / 间接光倍率过高调低间接光倍率或者换更明亮的HDR环境贴图UE4角色在山坡上闪色VLM层数不够Project Settings里把Volumetric Lightmap设为Two LayerUnity烘焙后模型全黑模型缺少Lightmap UV或没有标记Static检查Static勾选和Generate Lightmap UVs是否正确UE4 Build Lighting后反射没变化忘记Build Reflection Captures重新执行Build Reflection Captures还有一个很多人不重视的坑引擎版本不同GI参数名称和效果差异巨大。Unity从内置管线升级到URP时很多老项目的Enlighten实时GI会被自动禁用烘焙参数也需要重新调整UE4从4.26升级到4.27时Lightmass的默认设置也会发生变化。做跨引擎对比前先固定引擎小版本把两边版本号写清楚否则所有结论都无法复现。我个人在实际操作中最强烈的感受是Unity和UE4的GI对比本质不是“谁更好”而是“谁更能容忍项目不合理的资源规划”。Unity容错性较高参数调得糙一点画面还能看UE4则对静态划分、重要体积、Lightmap UV的规范性要求极高一步没做到位烘焙结果会明显地惩罚你。所以你要是从UE4转Unity感觉“轻飘飘”从Unity转UE4第一次烘焙出来画面发脏这都不是错觉只是两个引擎把间接光的责任分配给了不同环节而已。最后分享一个可以长期用的习惯每次调GI前先截一张只有直接光的画面再打开间接光看变化。这样你能清楚分辨出哪些暗部问题来自间接光哪些其实源于材质反照率或灯泡强度。跨引擎对比时也要按这个顺序来——先统一直接光再对比间接光层最后才谈反射和后期否则你永远都在“调色差”而不是“调GI”。