ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Unity URP/HDRP/UE4全局光照对比:PBR渲染差异与选型指南

Unity URP/HDRP/UE4全局光照对比:PBR渲染差异与选型指南 关于Unity URP、HDRP和UE4的PBR渲染对比Part1我主要拆了直接光照和材质参数。当时的结论是直接光只能决定基础曝光和主光源方向剩下的大半观感全在间接光。很多朋友看完问我既然三套方案都能跑PBR为什么同一个场景出来的画面层次差那么多。答案往往不在材质球里而在全局光照。我这次写Part2专门把全局光照拉出来讲因为它是PBR项目最容易低估、也最难迁移的部分。URP走的是典型的轻量烘焙路线核心是光照贴图加光探针HDRP走的是“高保真分层”路线SSGI、反射探针、体积光和光追可以叠一大堆UE4则是离线Lightmass和近实时Lumen两代人并存。三者不是简单的好坏而是对“光线怎么反弹”这件事的成本分配完全不同。不管你是刚学渲染的新手还是已经在Unity里做过几版光照的老手这篇对比都值得读。我会从原理和实操两条线去讲为什么URP在大世界室外更容易出片为什么HDRP的室内局部光源反馈更细腻为什么UE4在动态GI上能压过Unity老版本一截以及这些差异在实际项目里究竟意味着多少工作量。1. 先搞清楚一件事PBR和全局光照根本不是一回事很多项目之所以在渲染对比上栽跟头是因为把PBR和全局光照混为一谈。PBR是一套“表面如何响应光”的局部模型全局光照负责的则是“场景里到底有哪些光、这些光怎么反弹过来”。两者绑定在一起工作但计算量和可控性完全不同。1.1 直接光照、间接光照和“PBR”三个词经常被混在一起说直接光照非常好理解一个光源打到物体表面材质根据BRDF双向反射分布函数算出这个方向上的反射结果。它只发生在“表面点 光源方向”这一个局部采样上计算量可以做到极其便宜。PBR材质参数比如Albedo、Metallic、Smoothness/Roughness本质上都是在这个局部采样的反射模型里起作用。间接光照就不一样了。一个表面点收到的光除了来自太阳和灯具还来自墙壁的反弹、地面的反弹、旁边金属物体的高光溢出。要算清楚这一点理论上需要对入射半球做积分采样数量是直接光的几十上百倍。这也是为什么全局光照从来不是GPU顺手就能算完的事每个渲染方案都得做大量近似。我在实际项目里最常见的误区是团队把材质换成PBR流程之后以为只要换了Shader标准画面就应该自动“物理正确”。但实际上PBR只保证“给定光环境表面响应符合物理规律”光环境本身是否丰富、是否连续完全由全局光照方案决定。同一个金属球在一个只有天空盒的URP场景里会发灰放到HDRP开启SSGI或者UE4的Lumen里会瞬间漂亮很多不是金属球变了而是周围“喂给”它的间接光变了。1.2 为什么同样的PBR材质在不同GI方案里长不一样材质相同、画家相同但最终渲染差异大的原因可以从漫反射和镜面反射两条路径分开看。漫反射路径靠的是入射辐照度。URP烘焙光照贴图实质上就是把场景静态几何体的低频漫反射信息压缩到纹理里。光照贴图画质高不高、间距够不够密直接决定一面白墙在背光处是干净还是发脏。HDRP的SSGI是从屏幕空间实时重建间接漫反射它能捕捉到局部动态变化但屏幕外的信息天然缺失。UE4的Lightmass是离线辐射度算法质感和Lightmap类似但能控制多次反弹的准确性Lumen则用SDF和屏幕追踪模拟实时反弹结果更接近“动态”而非“烘焙”。镜面反射对粗糙度很敏感。一个Smoothness拉到0.85的塑料材质在URP里如果周围反射探针密度不够高光区域会显得“干”在HDRP里开了SSR和反射探针联动或者UE4里Lumen做实时反射追踪塑料表面就会出现连续的环境拉伸。很多人觉得“URP渲染出来塑料像橡胶HDRP渲染出来塑料像塑料”差别就在间接镜面反射的还原度。1.3 对比前先统一坐标系漫反射、镜面反射、动态光和性能为了避免后面讨论变成“功能清单对骂”我给这次对比定四个统一口径间接漫反射静态和动态物体分别能从全局光照里拿到多少环境光信息。间接镜面反射/反射粗糙表面的环境反射是否能保持连续还是靠探针拼凑。动态光照支持灯光移动、物体移动、开关灯时GI能否实时跟随。美术可控制性出问题后你能调什么、烘焙一次要多久、实时方案是否稳定。这四个维度基本覆盖了全局光照在PBR项目里的全部痛点。直接光和小范围的AO我会放在对应章节里提但不过度展开。接下来按URP、HDRP、UE4的顺序逐个拆。2. URP的全局光照拼图烘焙、探针与SSAO的实际分量URP是在移动端和低端平台上最常用的渲染管线但“轻量”不代表它不需要全局光照只是它把全局光照的重心压在了离线烘焙和探针上。2.1 烘焙光照贴图与实时光源的边界怎么划Unity的Progressive Lightmapper会处理标记为Static的灯光和物体把间接光照结果存入Lightmap。这里要吃透一个概念Lightmap存的是“低频间接光”不是把所有光照都烤死。URP中光源的Mode可以设成Baked、Mixed和Realtime。Baked Mixed里最常见的是Baked Indirect也就是直接光保持实时间接光使用烘焙结果。这样太阳方向还能实时变化肤色亮度和阴影位置是动态的但反弹光始终是静态的。Shadowmask模式下还在Lightmap里额外存了动态阴影信息适合需要兼顾移动物体阴影的项目。代价是纹理开销更大。Subtractive模式适合极低端平台直接光也不实时阴影整体往Lightmap里压。这个模式用来做纪念碑谷这种强风格化可以做写实就不太合适。操作上我的建议是室外大世界用Baked Indirect太阳当唯一实时主光源室内场景如果想保留大量动态点光源干脆把这些点光源都设成Realtime大面积墙面反弹靠烘焙提供点光源只负责局部变化。这样既保留灵活动态灯又不会让纯实时光源把移动端性能打穿。2.2 Light Probe放不好全局光照直接失真URP中动态物体没法接受光照贴图只能靠Light Probe Group里的光照探针取间接光。探针本质上是把一个点位置的入射辐照度压缩成球谐系数运行时插值给角色。问题几乎总出现在探针密度和分布上。很多人把探针拖得满地都是看起来覆盖全实际效果却糟糕。因为探针取值是空间插值密度过高时每个探针贡献范围变小一旦其中一个被墙壁遮挡角色走过去颜色就会跳一下。正确做法是沿角色路径、门口、窗户、路灯周围去做加密。房间中央的漫反射变化平缓放一两个探针就够从门内到门外的过渡区探针间距拉到半米以内。还要让探针尽量处在“能被光照到”的位置不要塞进半封闭的角落否则角色一靠近墙角就发黑。如果你用的是新版本URP还可以把Light Probe的Adaptive Probe VolumeAPV特性用起来它是Unity 2023 LTS里引入的新方案能用体积纹理代替老式探针处理大场景时比Light Probe Group更稳。老项目不升级管线的话老老实实手摆探针。2.3 SSAO只能算“屏幕空间遮挡”不是全局光照但救场效果明显URP在版本12之后自带Screen Space Ambient Occlusion很多项目把它当成全局光照的一部分来调这严格说不准确。SSAO只做一件事根据深度和法线估算屏幕像素附近有没有几何遮挡并在这些地方压低环境光。它没有计算光反弹也不是真正的间接光照。但它和GI配合起来效果很显著。烘焙光照贴图天然缺少高频接触阴影墙角、桌腿、角色下巴这些地方容易“飘”。开一个半径合适的SSAO这些接触区域会立刻压下来视觉上物体之间就“粘”住了。URP的SSAO参数我一般这样调室内场景Radius给0.3到0.5Intensity 1.0以下室外给到1到2直接光强度别加到100%否则阴影会变成一圈黑边。Downsample选项记得打开半分辨率计算在移动端能让性能压力减半。真正的全局光照让画面亮得有层次SSAO让画面暗得扎实两者不是一个东西但缺了哪个都难受。3. HDRP的全局光照分层SSGI、光照层级与体积化方案HDRP是Unity面向高端PC和主机的高保真管线。它的全局光照不是一套单一方案而是很多层叠加的结果。理解HDRP的前提是接受“默认值不等于最优值”很多效果不打开就是白搭打开之后又要花不少时间去调。3.1 实时光追与屏幕空间GI的取舍HDRP有两个很关键的实时GI能力一个是Screen Space Global Illumination简称SSGI另一个是光线追踪。SSGI的工作原理是靠深度和法线重建屏幕上的几何信息然后用屏幕空间射线去估算间接光。它不需要光追硬件适用范围比烘焙动态但问题也很明显屏幕外信息全部没有运动物体后方的间接光会突然消失摄像机快速转动时GI结果会“抖”。光线追踪则是从摄像机、物体或光源发射真实光线对漫反射反弹和镜面反射都更准确。HDRP在NVIDIA系显卡上开了RT后室内金属物件和有色墙壁之间的颜色溢出非常明显那种“物体长在一起”的感觉是烘焙方案很难模拟的。性能上SSGI适合作为日常默认光追更适合做截图、过场动画、或者对画质敏感但帧率要求不高的交互场景。一个项目同时保两套光照Preset并不丢人过场用高开销RT实际游玩切回SSGI这是很多主机项目采的折中方案。3.2 Light Layer与体积系统带来的光照组织能力HDRP里有一个很容易被忽视的Light Layer机制。它可以给灯光和物体打标签比如某一盏灯只照亮地板和角色不影响墙壁和柱子。这对全局光照的影响非常大因为间接光是直接从直接光反弹出来的你不希望某盏氛围灯把远处不该亮的墙体一起带起来。用Light Layer把灯光作用域切小反弹路径也就被约束住了GI的“脏乱差”少一大截。体积系统是另一个支撑HDRP观感的核心。Volumetric Fog和Volumetric Clouds会参与光散射计算这本身不是GI但它会改变画面里光分布的感知。一个场景如果只有地面反射光、没有体积雾做过光轴全局光照再准也显得“干”。HDRP里我习惯先用GI把漫反射底子打稳再开中低强度的体积雾让主光源光线有形体感两套系统配合才接近电影感。3.3 物理光照单位和曝光对GI观感的影响HDRP有个特别坑的点它默认使用物理光照单位点光源和聚光灯的强度用Lumen和Candela平行光用Lux。刚开始从其他引擎迁移过来的人随手放一盏强度50000的点光源然后发现整个场景曝光完全不对间接光要么爆掉要么漆黑一片。这不是全局光照算法的问题而是曝光系统在全景参与。HDRP的间接光强度是直接从直接光强度推导的光源单位差一个数量级反弹结果就全变。正确工作流是先用HDRI Sky作为主环境光把曝光调到舒适范围再一盏一盏加局部光源并且用Light Explorer面板统一检查光源强度。没有经过这一步校准的画面讨论GI好坏毫无意义。4. UE4的全局光照双时代Lightmass烘焙与Lumen实时方案严格来说Lumen属于UE5/UEFN时代的正式能力而UE4正统开盒即用的是Lightmass。但从项目演进角度看Lumen就是UE4烘焙方案的后继形态很多团队现在做UE4项目也会提前用UE5预览版验证光照方向。所以我把两套一起讲。4.1 Lightmass的离线辐射度计算与体积光照图Lightmass在构建光照时会做一次离线辐射度计算支持多次反弹也有Importance Volume来控制计算重点区域。烘焙参数里Static Lighting Level Scale控制细节层次数值越小精度越高Num Indirect Lighting Bounces控制反弹次数Indirect Lighting Quality影响采样量和烘焙时间。实际项目里最常踩的坑是完全不调整Lightmass Importance Volume。很多人直接build默认体积覆盖整张地图结果是烘焙时间爆炸、细节不均匀。正确做法是先拉一个Importance Volume包住玩家可活动的主要区域再在外面留一圈低精度过渡。玩家看不到的地方烘焙再准也没有意义只会拖慢迭代。Volumetric Lightmap是UE4对动态物体的核心GI支撑。它把场景间接光离散到一个三维稀疏体素场里运行时角色和移动物体可以从中采样。精度越高动态物体上的光照过渡越平滑但内存和构建耗时同步上涨。开放世界如果角色活动范围大尽量不要开太高否则每一小块地图的内存都会失控。4.2 Lumen在UE4/UE5预览阶段的GI思路Lumen的核心思路是不依赖传统光照贴图改用Mesh Distance Field网格距离场、Screen Traces和软件光线追踪的组合来做实时GI。场景里静态物体和动态物体都能拿到间接光开关灯、移动窗户遮挡、角色染色都会立刻影响环境反弹。Lumen做到这个程度开销不低所以UE5里把它分成在质量档。Final Gather Quality负责全局GI采样质量Screen Traces控制屏幕空间光线追踪的范围和强度。我的建议是房间尺度场景Final Gather Quality开到1.0到1.5已经够用大平原这类远景场景开太高收益反而不大因为视线范围内能提供的屏幕追踪信息不够多出来的开销都花在远距离低细节计算上。有个容易被忽视的问题启用Lumen后Mesh Distance Field的构建质量很关键。高面数、细碎几何体如果没正确生成SDF光线撞击的结果会带着明显噪点。场景搭建时就要注意哪些物体需要进入GI体积而不是指望Lumen对所有资产自适应。4.3 从Lightmass切到Lumen哪些资产需要重做很多团队以为开个开关就能从Lightmass切到Lumen实际上资产层面的影响不小。Lightmass依赖第二套光照UVLumen则不怎么看Lightmap UV但它更依赖Mesh Distance Field质量和场景碰撞/阻挡设置。你的美术如果习惯给静态网格做精细UV2这部分工作不会白费但如果没有重新Build SDFLumen的边缘追踪很容易穿帮。同时Lightmass烘焙下的反射探针和Lumen的实时反射也完全不同。Lightmass项目里反射探针密度通常很高切到Lumen后反射探针可以大幅减少但要重新检查场景里有没有用“纯探针”来遮挡低质量反射的区域。Lumen不是万能屏幕追踪失败、SDF又撞不上的地方反射会丢失得比探针方案还明显。5. PBR材质和全局光照怎么互相配合这一节不聊引擎聊PBR材质参数在全局光照下的实际行为。三个引擎的Shader实现有差异但物理规则是一致的。5.1 间接漫反射与间接镜面反射的分储三家实现方式PBR的BRDF把反射分成漫反射和镜面反射两条路径。间接光也要按这两条路径分别处理间接漫反射通常存在Irradiance信息里间接镜面反射存在环境反射信息里。Unity URP里Lightmap主要负责漫反射间接光Reflection Probe负责镜面反射间接光。HDRP在此基础上增加了SSGI对漫反射做实时补充同时SSR会在屏幕空间里修正镜面反射。UE4的Lightmass烘焙会把间接漫反射写入Lightmap和Volumetric Lightmap镜面反射交给Reflection CaptureLumen则把漫反射和镜面反射都拉成实时计算。这里有个共性规律漫反射对空间频率不敏感所以可以用Lightmap、球谐这种低精度存储镜面反射对方向极其敏感所以永远是最早爆露问题的部分。金属材质和光滑材质在不同引擎下的表现大相径庭绝大多数不是漫反射GI的问题而是反射信息采样不足。5.2 粗糙度是GI里最容易被低估的材质参数我发现很多项目对粗糙度的调试都是拍脑袋但它在全局光照里起的作用非常大。粗糙度决定反射高光的波瓣宽度也就是环境光以什么样的锐利程度被表面反射出去。粗糙度0.9的墙面对入射光做的是“糊化”处理对反射探针分辨率要求不高粗糙度0.1的漆面则要求反射贴图或实时反射有足够高频细节否则出来的反射会是软绵绵一片。URP环境下这种问题尤其明显反射探针默认分辨率不高再赶上粗糙度低金属表面会反射出发虚的窗户轮廓看起来像材质出了问题其实换个高分辨率反射探针立刻改善。5.3 能量守恒在不同GI下如何体现PBR强调能量守恒但全局光照方案如果不守恒材质设置再准确也白搭。Lightmass烘焙时如果反弹次数不足场景整体会偏暗HDRP里如果曝光曲线和光源单位不匹配间接光可能过曝Lumen在动态GI下如果连续场景遮挡计算不准确阴影区域会“吸光”吸得过分看起来像被PS压暗过。不同引擎里的天空光和反射探针强度经常造成双重曝光。我遇到过不少项目天空盒本身已经提供了很强的天光美术又在反射探针里加了额外的环境光强度结果间接光被两套系统同时叠加整个场景泛白。出现这种情况时先怀疑全局光照叠加而不是急着动材质。6. 动态物体和动态光源下的全局光照表现静态场景看烘焙精度动态场景看GI的实时响应能力。这部分是URP和HDRP/UE4拉开差距最明显的地方。6.1 静态场景烘焙动态角色探针最容易出现前后断层URP项目的典型状态是场景全静态烘焙角色到处跑。烘焙光照贴图质量很好但角色身体上只有光探针提供的辐照度拿不到脚下地面对身体的颜色反弹也拿不到旁边墙壁的定向反射。于是经常出现“角色灰蒙蒙地站在一个精美场景里”的违和感。解决思路有几种最简单的是在角色周围动态补一盏低强度点光源让色彩溢出跟着角色走讲究一点就给角色单独铺一条带颜色溢出信息的路径在关键位置多放探针再讲究就是把角色当移动光源或者用更高级的GI方案。选哪个取决于项目目标平台但原理上都是一致的把动态物体和静态环境的GI信息尽量对齐。6.2 Screen Space GI的共同缺陷屏幕信息不够就不够HDRP的SSGI、UE5的Screen Traces、URP的SSAO共同的问题都在“屏幕空间”这四个字上。它们只能拿到当前画面里出现过的几何信息摄像机一转头背后的墙壁反弹就不存在了物体被前景挡住接触面的间接光也会丢失。实际表现就是镜头快速转动时GI会短暂“跟不上”或者物体边缘闪过一条不自然的光晕。严重程度由屏幕追踪距离、步数和质量参数决定但它无法彻底消除。真正做大场景时需要额外用反射探针、Light Probe或者光追补算来兜底。这也是为什么“屏幕空间GI 廉价实时GI”的说法只能成立一半。6.3 镜面反射的实时化从反射探针到光线追踪镜面反射比漫反射对实时性更敏感。反射探针只能在固定位置捕捉环境物体移动后反射内容不会正确变化SSR能实时但只有屏幕内像素光线追踪能给出准确反射但开销最高。HDRP和UE4的光追方案都能做镜面反射尤其在光滑金属和车窗玻璃上优势巨大。如果你项目里有大量镜面材质追求实时GI时必须把反射信息也纳入预算。只开漫反射GI、没有反弹反射画面还是“假”的。7. 实际项目里的踩坑与排查思路这一段是我自己反复踩过的坑。每家方案都有一些参数和工作流上的隐性陷阱列出来供大家排查时对照。7.1 URP下烘焙漏光和探针过渡先查Lightmap参数和探针位置URP烘焙出现漏光第一个排查方向是光照贴图的存在比和Padding。物体之间如果共享光照贴图区域但padding不够会互相渗色。第二排查方向是物体是否真的被标记为StaticMesh Renderer的Contribute GI开关是否开启。很多人把模型拖进场景勾了Static却忘了开Contribute GI烘焙结果自然一塌糊涂。探针过渡生硬优先看探针周围有没有把烘焙物体和动态物体“同地混用”。光探针取值时会受到周围几何影响探针被嵌进墙里时角色经过会突然变暗不是引擎bug是探针站位问题。7.2 HDRP里SSGI变糊、曝光不对先别急着加光SSGI变现异常时我第一件事是把Rendering里的Depth Of Field、Motion Blur和曝光曲线关掉用最简单的Flat Exposure看基线。很多时候SSGI没问题是曝光曲线在高动态范围下压暗了间接光。另外SSGI对噪点敏感场景里如果有大量细碎模型屏幕法线变化剧烈GI结果会出现低频闪动。这时不是继续加光而是把GI采样质量调高、把细碎物体的GI贡献收敛一下。7.3 UE4里Lightmass和Lumen结果不一致本质是光照模型换了从Lightmass切到Lumen场景外观差异大是正常的。Lightmass是从Lightmap空间采样的低频间接光Lumen是屏幕SDF的实时追踪两者自然不可能一致。如果你想保证切换后大方向不变先把两边共有的基础元素校准天空光强度、方向光角度、曝光、后处理。任何一项不一致对比结果都会失真。不能一边保留大量反射探针、一边用Lumen实时反射然后拿结果去对比——反射信息被叠加了两遍画面必然偏亮。7.4 三套方案共性问题色彩空间和线性工作流不管用哪个管线都先把色彩空间设成Linear。Gamma空间下烘焙的Lightmap和实时GI叠加容易偏灰金属高光也容易“焦”。HDRP强制使用LinearURP可以切UE4默认Linear。颜色管理的另一个坑是材质Albedo的数值。PBR的Albedo是漫反射率不是贴图亮度。一面白墙在光照下可能很亮但Albedo贴图应保持在0.7到0.85区间不能直接刷成1.0。全局光照会把过亮的Albedo不断反弹场景很快过曝。这个问题三个引擎通用。8. 选型建议项目决定全局光照方案最后给一套我自己的选型判断。不谈“哪个引擎天下第一”只谈什么项目适合用什么方案。对比维度Unity URPUnity HDRPUE4 / UE5-Lumen典型平台移动端、低端PC、WebGL中高端PC、主机PC、主机、开放世界GI主力烘焙Lightmap 探针SSGI 反射探针 / 光追Lightmass烘焙 或 Lumen实时动态物体GI探针插值细节有限较好SSGI实时补全Lumen下最好直接参与反弹镜面反射反射探针为主成本低SSR 反射探针 / RTLumen或反射捕获性能压力最低烘焙一次可反复用中高可分级烘焙低Lumen高美术可控性探针和Lightmap直观参数多难上手Lightmass成熟Lumen仍在迭代最适合的画风风格化、低多边形、移动写实室内写实、次世代单人大世界、动态GI、电影感按项目类型给一个具体建议手机游戏、网页展示、小体量风格化URP。重点别放在实时GI上把Lightmap质量、探针密度、SSAO三项做好观感足够撑起中端画面。中高端PC写实、单机场景叙事HDRP。SSGI和RT反射配合好室内打光非常出效果但团队里必须有人能hold住物理光照单位预设和后处理调校。开放世界、沙盒、对动态光照敏感或频繁拆改的关卡UE4/UE5路线。Lightmass适合最终烘焙Lumen适合开发期快速查看两套切换时要提前做资产管线适配。还有一个很多人忽略的点切换渲染管线比切换引擎更折腾。Unity从URP升HDRP不是改个设置就行所有Shader、材质、后处理效果、光照贴图都得重做从UE4切到UE5的光照方案也有类似成本。所以选型最佳时机是项目立项前等到中期再改光照管线代价足够拖垮进度。我个人在实际项目里的体会是没有哪套全局光照方案能“无脑开箱即用”。URP给你的是可控的速度代价是动态GI的缺失HDRP给你的是层叠的高保真代价是参数和调试成本UE4/Lumen给你的是实时的“看起来合理”代价是性能预算和资产适配。最后分享一个很土但很有效的验证方法在三个方案里摆同一个纯白球、同一块深色金属板、同一面浅色墙面彼此相邻截图后对比三个物体的过渡色。这一张图比读一百篇对比文章都直观。
返回列表