Unity URP/HDRP与UE4全局光照GI对比:烘焙、探针与物理单位实战
1. 从为什么我的场景一打光就假说起如果你同时碰过Unity URP、HDRP和UE4这三套管线大概率会有过这种体验模型导进去材质调得也还行可一旦开始布置灯光、烘焙光照画面立刻分成两个世界——要么死黑一片要么亮得发灰要么物体像贴纸一样浮在场景里完全没有体积感。很多人第一反应是材质没调好于是反复折腾Metallic、Smoothness、Roughness结果越调越乱。问题往往不在材质本身而在**全局光照Global IlluminationGI**这套系统上。PBR基于物理的渲染负责的是单个表面如何响应光而GI负责的是光在整个场景里怎么反弹、怎么填充、怎么间接照亮其他物体。这两件事是分开的但视觉上又强耦合。你把PBR材质调得再物理正确如果GI没配对画面照样假。这篇是PBR渲染对比系列的第二部分专门聊全局光照。我会把Unity URP、Unity HDRP、UE4这三套管线在GI上的设计思路、参数含义、实操差异、以及我踩过的坑一条条拆开讲。适合已经上手过至少一套管线、但对为什么两边效果对不上感到困惑的开发者。看完你应该能明白同样是烘焙光照为什么URP的Lightmap和UE4的Lightmass出来的东西完全不是一回事以及怎么让它们尽量对齐。先给一个总纲方便你建立坐标系维度Unity URPUnity HDRPUE4实时GI方案无内置需第三方/自研SSGI、Ray Tracing GI需硬件LumenUE5/ DFAOSSGIUE4烘焙GIProgressive LightmapperCPU/GPUProgressive LightmapperLightmassCPU/GPU Swarm光照单位相对值为主物理单位Lux/EV物理单位Lumen/Lux环境光探针Light Probe GroupLight Probe VolumeIndirect Lighting Cache / Volumetric Lightmap反射探针Reflection ProbeReflection Probe SSRReflection Capture SSR这张表是后面所有讨论的地基。你会发现URP本质上是轻量级、够用就行HDRP和UE4是物理正确优先而UE4的Lightmass在烘焙质量上一直是行业标杆。理解这个定位差异很多为什么效果不一样的问题就自动有答案了。2. 全局光照到底在解决什么问题间接光的三种来源在动手调参数之前得先把GI的构成讲清楚。很多人把GI等同于烘焙光照贴图这是不完整的。一个场景里物体表面接收到的光其实来自三个渠道GI要处理的是后两个直接光照光源直接打到表面这个由PBR的BRDF负责跟GI无关。你在URP里放一盏Directional Light物体朝光的一面亮起来这是直接光。间接漫反射光打到A物体后反弹照亮了旁边的B物体。这是GI的核心。没有它背光面就是纯黑场景像剪纸。烘焙Lightmap、Light Probe、UE4的Volumetric Lightmap处理的都是这个。间接高光/反射光滑表面反射周围环境。Reflection Probe、SSR屏幕空间反射、UE4的Reflection Capture负责这块。它和漫反射GI是两套系统但视觉上要协调。我见过太多人把这三者混为一谈结果调反射的时候去改Lightmap参数当然对不上。正确的做法是分开排查先确认直接光对不对再看间接漫反射够不够最后补反射。2.1 为什么烘焙和实时必须二选一或混合间接漫反射的计算量极大——每个像素要往半球方向发射大量射线去采样周围环境。实时算性能扛不住预计算又失去了动态性。所以三套管线都走了烘焙为主、实时为辅的路线只是辅助手段的激进程度不同。URP最保守静态物体烘焙Lightmap动态物体靠Light Probe采样实时GI基本没有除非你自己接第三方。HDRP激进一些SSGI用屏幕空间信息做实时间接光近似Ray Tracing GI在有硬件支持时能实时算。UE4的Lightmass是纯烘焙但UE5的Lumen直接掀桌子用一套混合方案把实时GI做到了可用级别。这里有个关键认知烘焙GI的质量上限取决于光照贴图的分辨率和UV展开质量而不是引擎本身。很多人抱怨URP烘焙出来糊其实是他没调Lightmap Resolution或者模型UV没展好。这个后面会细讲。2.2 光照贴图、光照探针、体积光照的适用边界三种GI载体各有各的适用场景选错了就是白费功夫Lightmap光照贴图贴在静态物体表面上的预计算光照纹理。适合不动的场景几何体——墙壁、地板、建筑。缺点是只对静态物体有效且占显存。Light Probe光照探针空间中的采样点动态物体经过时插值采样。适合会动的角色、道具。缺点是精度低只能捕捉低频光照。Volumetric Lightmap体积光照贴图UE4特有在空间里生成三维网格采样点比Light Probe精度高得多。适合大型动态场景。URP和HDRP用前两种UE4三种都有。这就是为什么UE4里动态物体在复杂光照下的表现通常比URP自然——它的体积光照采样密度高太多了。3. Unity URP的GI实操从烘焙设置到探针布置URP的GI系统是够用主义的典型代表。它没有花哨的实时GI但烘焙流程清晰参数不多适合中小型项目。我拿一个室内场景举例把完整流程走一遍。3.1 Lighting窗口里那几个必须搞懂的参数打开Window Rendering LightingURP的GI设置全在这里。新手最容易懵的是这几个Lightmapper选择Progressive CPU还是Progressive GPU。CPU慢但稳定GPU快但对显存要求高且某些显卡驱动会崩。我的经验是场景小于50万三角面用GPU大了老老实实CPU别跟稳定性较劲。Lightmap Resolution每单位面积的光照贴图像素数默认40。这个值直接决定烘焙质量。室内场景我一般给到60-80室外大场景反而可以降到20-30因为室外间接光变化平缓。注意这是每单位Unity单位是米所以40意味着每平方米40个像素。Lightmap Padding贴图块之间的间隔防止漏光。默认2够用但如果你的UV块排得密调到4-8。Ambient Occlusion这个不是GI是给间接光加暗角让缝隙更立体。强度0.5-1.5之间调太高会脏。Indirect Resolution间接光的采样分辨率独立于最终Lightmap分辨率。这个值低一点没关系因为间接光本身是低频的。默认2我一般不动。Lightmap Parameters这是个预设资产控制烘焙的采样数、反弹次数等。默认的Default-Medium对大多数场景够用追求质量可以建一个自定义的把Bounces提到4-6。提示改完参数一定要点Generate Lighting重新烘焙Unity不会自动更新。而且烘焙是异步的进度条走完之前别关窗口。3.2 模型UV2烘焙失败的头号元凶我敢说URP烘焙出问题的人里七成是UV2没弄好。Lightmap需要模型有一套独立的UV通道UV2专门用来映射光照贴图不能和主UVUV1共用。为什么因为主UV是为了贴图服务的可能有重叠、有拉伸而Lightmap UV必须不重叠、且块与块之间留够间距否则烘焙时相邻面会互相污染出现黑边或漏光。在Unity里你可以在模型的Import Settings里勾选Generate Lightmap UVs让Unity自动生成。但自动生成的质量参差不齐复杂模型经常出问题。我的做法是简单模型用自动生成复杂模型在Blender/Maya里手动展UV2用Lightmap Pack功能间距设0.02-0.05。判断UV2好不好的土办法烘焙一次看Lightmap贴图在Lighting窗口底部能预览。如果贴图上有明显的黑块、撕裂、或者大片空白就是UV2的问题。3.3 Light Probe Group的布置密度与常见误区动态物体靠Light Probe采样间接光。Probe布置得好不好直接决定角色在场景里融不融得进去。新手常犯的错只在场景中央放一圈Probe。结果角色走到角落采样到的还是中央的光照颜色完全不对。正确的做法是跟着光照变化布置光照变化剧烈的地方比如窗边、灯下、明暗交界处Probe要密光照均匀的大片区域可以稀。我一般按2-4米的网格铺然后在重点区域加密到1米。还有个细节Probe要放在物体可能经过的高度通常是地面以上1-1.5米。放在地板下面或者天花板上面都是浪费。Probe的插值方式是四面体插值TetrahedralUnity会自动把Probe连成四面体网格。如果Probe布置得太稀疏或者共面四面体化会失败动态物体就会采样到错误的光照。布置完记得在Scene视图里看Probe之间的连线如果连线乱七八糟或者有断开的就是布置有问题。3.4 反射探针别让金属材质变成塑料URP里金属材质的表现一半靠PBR参数一半靠Reflection Probe。没有反射探针金属表面只能反射天空盒看起来像塑料。Reflection Probe分三种模式Baked烘焙、Realtime实时、Custom自定义。Baked最省性能适合静态环境Realtime每帧更新贵只用在需要动态反射的关键物体上Custom用一张 cubemap适合特殊需求。布置反射探针的原则是跟着反射源走每个主要反射面大镜子、光滑地板、金属墙面附近放一个。探针的Box Size要覆盖它影响的区域超出范围就衰减到下一个探针。注意Reflection Probe的Type设成Baked后也要在Lighting窗口里烘焙才会生效。很多人设完发现没反应就是忘了烘焙。4. Unity HDRP的GI物理单位带来的连锁反应HDRP和URP在GI上的最大区别不是功能多少而是单位体系。HDRP用物理单位Lux、EV、NitsURP用相对值。这个差异会连锁影响到你调光的每一个环节。4.1 物理光照单位下环境光该怎么给在URP里你把Directional Light的Intensity调到1大概就够亮了。在HDRP里Intensity是以Lux为单位的太阳光是100000 Lux级别室内灯光是几百Lux。你如果按URP的习惯填1场景会黑得伸手不见五指。HDRP的环境光Environment Lighting通过Volume系统控制主要靠Visual Environment和HDRI Sky两个组件。天空提供环境光强度由Sky的Exposure控制。室内场景没有天空就得靠Reflection Probe或者手动设置Ambient。这里有个坑HDRP的Ambient Mode如果设成Dynamic它会从天空实时采样环境光性能开销不小设成Static则用固定值但需要你手动调。室内场景我一般用Static配合一个低强度的环境色避免死黑。4.2 SSGI和Ray Tracing GI什么时候值得开HDRP的实时GI有两个选项SSGI屏幕空间全局光照和Ray Tracing GI。SSGI的原理是从屏幕空间信息里近似间接光优点是便宜缺点是只能看到屏幕内的东西——屏幕外的物体不参与计算所以转动视角时间接光会跳变。适合做点缀不适合做主GI。Ray Tracing GI用硬件光追算真实间接光质量高但需要RTX级别显卡且性能开销大。我实测下来1080p下开Ray Tracing GI帧率大概掉30-40%。除非是展示级项目否则我建议还是老老实实烘焙。4.3 HDRP烘焙与URP烘焙的流程差异HDRP的烘焙流程和URP大体相同都在Lighting窗口操作但有几个差异点HDRP的Lightmap参数多了一个Lightmap Resolution的全局乘数实际分辨率是模型设置乘以这个值。HDRP支持Light Layers可以让某些光源只影响特定层烘焙时也遵循这个规则。这个在URP里没有。HDRP的Probe Volume系统如果启用了比传统Light Probe精度高但配置复杂。我的建议是如果你从URP转HDRP先把单位体系搞明白再动GI。否则你会陷入调了光但画面还是不对的循环因为问题出在单位换算上不在GI参数上。5. UE4 Lightmass烘焙质量的行业标杆是怎么炼成的聊完Unity两套管线该说UE4了。UE4的Lightmass是我用过最重但也最准的烘焙系统。它的质量优势来自几个设计选择理解这些你就能明白为什么UE4烘焙出来的场景通常比Unity厚实。5.1 Lightmass的核心参数从Static Lighting Level Scale说起打开World Settings找到Lightmass分类第一个参数就是Static Lighting Level Scale。这个值控制引擎认为场景有多大默认1对应1单位1厘米。它影响的是光子映射的精度——值越小精度越高烘焙越慢。很多人不知道这个参数结果小场景烘焙出来糊大场景烘焙出来噪。正确做法是小场景房间级设0.5-1大场景城市级设2-4。Num Indirect Lighting Bounces间接光反弹次数默认3。每加一次烘焙时间大概翻倍但视觉提升递减。室内场景我一般给4-5室外3就够。Indirect Lighting Quality间接光采样质量默认1。追求质量给到2-4但时间会显著增加。Compress Lightmaps是否压缩光照贴图。压缩能省显存但会引入块状伪影。展示级项目建议关掉。5.2 为什么UE4的间接光看起来更厚UE4的间接光之所以看起来比Unity厚实核心原因是Volumetric Lightmap。它在场景空间里生成三维采样网格动态物体经过时能采样到高精度的间接光而不是像Unity的Light Probe那样只靠几个点插值。Volumetric Lightmap的密度由Volumetric Lightmap Detail Cell Size控制默认200厘米。这个值越小采样越密动态物体的光照越准但内存占用越大。我一般给到100-150。另一个原因是UE4的BasePass在计算间接光时会叠加AO环境光遮蔽和间接光遮蔽让缝隙和角落更暗立体感更强。Unity的AO是单独一层融合方式不同。5.3 Lightmass Portal与天光的配合UE4有个URP/HDRP都没有的东西Lightmass Portal。它是一个面片放在窗户或门口告诉Lightmass光从这里进来。没有PortalLightmass会从整个天空半球采样效率低且容易漏光有了Portal光子只从Portal方向进入精度和速度都提升。用法很简单在窗户位置放一个Portal Actor调整大小覆盖窗户开口方向朝内。然后配合Skylight天光把天光的Intensity调到合适值。室内场景我一般把Skylight的Intensity设成1-3配合Portal能烘出很自然的窗光。提示Portal只对静态烘焙有效实时GILumen不需要它。6. 三套管线GI效果对齐的实战思路前面分别讲了URP、HDRP、UE4的GI系统现在到了最关键的部分怎么让同一个场景在三套管线里看起来尽量一致。这是做跨平台项目或者做效果对比时绕不开的问题。6.1 先对齐直接光再谈间接光对齐的第一步永远是直接光。因为间接光是直接光的反弹直接光不对间接光再怎么调都是错的。对齐直接光要统一三件事光源方向、光源强度、色温。方向好办三套管线都用欧拉角或方向向量。强度麻烦因为单位不同——URP用相对值HDRP和UE4用物理单位。我的做法是先在UE4里调好一个满意的直接光记下它的Lux值然后换算到HDRP基本1:1再到URP里用目测逼近。色温也要统一。URP的Light Color是RGBHDRP和UE4支持色温Kelvin。同一个暖白光URP里你可能填(1, 0.95, 0.9)UE4里填5500K视觉上要反复对比才能对上。6.2 间接光强度与反弹次数的换算关系间接光的量由两个因素决定环境光强度或天光强度和反弹次数。三套管线的反弹次数语义不同URP的Bounces、HDRP的Bounces、UE4的Num Indirect Lighting Bounces虽然名字像但每次反弹的能量衰减曲线不一样。UE4的衰减更符合物理URP的衰减偏快。我的经验换算URP的2次反弹 ≈ UE4的3次反弹的视觉效果。所以对齐时URP的Bounces要比UE4少设1-2次。环境光强度对齐更麻烦。URP的Ambient Intensity是0-1的相对值UE4的Skylight是物理单位。我一般先在UE4里定一个基准然后在URP里从0.3开始试逐步逼近。6.3 反射与GI的协调别让金属跳出来最后一个对齐点是反射。三套管线的反射探针/Reflection Capture机制不同容易导致金属材质在某个管线里特别亮在另一个里特别暗。对齐方法是统一反射源的强度。URP的Reflection Probe有Intensity参数HDRP的Reflection Probe也有UE4的Reflection Capture靠Sky Light的强度间接控制。把三者的反射强度调到视觉一致金属材质才不会跳。还有个细节SSR屏幕空间反射在三套管线里都有但触发条件不同。URP的SSR需要额外配置HDRP内置UE4默认开。对齐时要么都开要么都关别一个开一个关。7. 那些年我在GI上踩过的坑理论讲完了说点实在的。下面这些坑每一个都让我浪费过至少半天时间。坑一改了Lightmap Resolution但没重新烘焙。Unity不会自动重烘你得手动点Generate Lighting。我见过有人调了一下午参数结果画面没变就是因为忘了点烘焙。坑二UV2重叠导致漏光。自动生成的UV2经常有重叠烘焙出来墙上会有莫名其妙的光斑。解决方法是手动展UV2或者把自动生成的Padding调大。坑三HDRP里用URP的强度值。这个前面说过但真的太多人犯。HDRP的Directional Light Intensity填1等于没开灯。坑四UE4的Lightmass Level Scale没调。默认1对应厘米如果你的场景是按米建的烘焙精度会差100倍。建场景前先想好单位。坑五Light Probe布置太稀。动态角色走到Probe稀疏区光照会突变。宁可多放几个也别省。坑六反射探针没烘焙。Baked模式的Reflection Probe必须烘焙才生效Realtime模式才实时更新。设完记得烘。坑七三套管线混用同一套贴图。PBR贴图虽然通用但不同管线的通道打包方式可能不同比如URP的Metallic在B通道HDRP可能在别的通道。跨管线用贴图前先确认通道映射。坑八忘了关Auto Generate。Unity的Lighting窗口有个Auto Generate选项开着的话每次改场景都会重烘大场景能把电脑卡死。调试阶段关掉最后再手动烘。8. 关于GI选型的一点个人判断最后说点主观的。如果你问我新项目该选哪套管线的GI我的判断是这样的做移动端或者性能敏感的项目URP的烘焙GI够用别折腾实时GI。做PC/主机的高画质项目HDRP的Ray Tracing GI或者UE4的Lightmass都是好选择看你团队更熟哪套。做大型开放世界UE4的Volumetric Lightmap Lightmass Portal组合目前还是最成熟的方案。至于UE5的Lumen它确实改变了游戏规则但那是另一个话题了。就UE4和Unity这两套传统GI系统而言核心差异不在功能而在物理正确的贯彻程度——UE4从单位到算法都更贴近真实光照Unity则在不同管线上做了不同程度的妥协。理解这个差异比记住任何参数都重要。我在实际项目里的体会是GI调参的时间八成花在UV和探针布置上两成花在参数上。很多人本末倒置一直在调参数却忽略了UV2和Probe这些地基。把地基打牢参数随便调调就出效果地基不牢参数调到天亮也是白搭。