ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Unity URP/HDRP与UE4全局光照方案对比与实战调优指南

Unity URP/HDRP与UE4全局光照方案对比与实战调优指南 1. 全局光照到底在解决什么问题1.1 从直接光到间接光的认知跨越很多人做PBR渲染一开始关注的都是材质本身——金属度、粗糙度、法线贴图这些。但真正让画面“活”起来的其实是全局光照。直接光照只计算光源直接打到物体表面的那部分而全局光照要解决的是光线打到物体表面之后反弹到其他物体上再反弹再反弹……这个多次弹射的过程。Unity的URP和HDRP以及UE4在全局光照的实现思路上有本质区别。URP走的是轻量级路线默认只有烘焙光照贴图加光照探针实时全局光照基本靠Light Probe和Reflection Probe来模拟。HDRP则内置了屏幕空间全局光照SSGI、光线追踪全局光照Ray Tracing GI等方案。UE4的Lightmass和Lumen则是另一套体系Lightmass是纯烘焙方案Lumen是动态全局光照方案。我刚开始接触这块的时候最大的困惑是为什么同样的场景在URP里看起来就是比UE4“平”后来才明白问题出在间接光的计算精度和反弹次数上。URP默认的烘焙设置里间接光反弹次数只有1到2次而UE4的Lightmass可以设置到10次以上。这个差异在封闭室内场景里特别明显——墙角、天花板、地板之间的光线互反射直接决定了画面的层次感。1.2 三套管线的GI方案对比先给一个整体对比方便你快速定位自己该用哪套方案特性Unity URPUnity HDRPUE4烘焙GILightmapperCPU/GPULightmapperGPU优先Lightmass实时GI无需插件SSGI、RTGILumen光照探针Light Probe GroupLight Probe GroupLightmass Importance Volume反射探针Reflection ProbeReflection Probe、Planar ProbeReflection Capture环境光遮蔽SSAORenderer FeatureSSAO、Ray Tracing AOSSAO、DFAO间接光反弹次数1-2次默认可配置最高8次最高100次Lightmass这张表里的信息量很大我逐个拆解。URP的Lightmapper支持CPU和GPU两种模式GPU模式快但吃显存CPU模式慢但稳定。HDRP强制GPU烘焙因为它的光照贴图分辨率可以拉到很高CPU跑起来太慢。UE4的Lightmass是CPU烘焙但支持分布式构建多台机器一起跑能大幅缩短时间。实时GI这块URP原生不支持你得靠第三方插件或者自己写SSGI。HDRP的SSGI是基于屏幕空间的只能处理屏幕内可见的间接光屏幕外的信息丢失。RTGI需要硬件支持光线追踪效果最好但性能开销也最大。UE4的Lumen是混合方案结合了屏幕空间追踪和距离场追踪不需要光线追踪硬件也能跑这是它最大的优势。2. Unity URP的全局光照实操细节2.1 烘焙设置里的关键参数URP的烘焙设置面板看起来简单但有几个参数直接决定最终效果。打开Window Rendering Lighting进入Scene标签页重点看这几个Lightmapper模式选择CPU和GPU的区别不只是速度。GPU烘焙对显存要求高8GB显存的卡跑2K光照贴图基本就满了。CPU烘焙虽然慢但支持Progressive CPU模式可以边烘焙边看效果调试阶段特别有用。我的习惯是调试用CPU Progressive最终出图用GPU。Lightmap Resolution这个值不是越高越好。每单位面积的光照贴图像素数默认是40。室内场景建议拉到60-80室外场景40就够了。拉太高会导致光照贴图文件巨大手机端直接爆内存。有个计算公式光照贴图总大小 场景表面积 × 分辨率² × 4字节RGBA。一个100平米的室内场景分辨率80的话大概需要100×80²×4 2.56MB看起来不大但如果有几十个物体累加起来就很可观了。Lightmap Padding光照贴图之间的间距默认2像素。这个值太小会导致相邻物体的光照信息互相污染出现漏光。建议设成4-8像素具体看分辨率。分辨率越高Padding也要相应加大。Ambient Occlusion这个选项在URP的Lighting面板里叫“Ambient Occlusion”勾选后烘焙时会计算AO并叠加到光照贴图上。强度建议0.5-1.0距离设成1-2米。注意这个AO是烘焙进光照贴图的运行时改不了所以调试阶段要反复试。Indirect Resolution间接光的分辨率默认是Lightmap Resolution的一半。这个值影响间接光的精度但不会影响直接光。室内场景建议设成和Lightmap Resolution一样室外可以减半。2.2 光照探针的摆放技巧光照探针是URP里模拟动态物体间接光的主要手段。Light Probe Group的摆放有几个坑我踩过第一探针要形成封闭体积。很多人只在物体周围放几个探针结果动态物体走到边缘时光照突然变暗。正确的做法是用探针把整个可活动区域包起来形成一个封闭的凸包。Unity的Light Probe Group组件有个“Add Probe”按钮但手动摆太慢我一般写个编辑器脚本自动生成网格状探针。第二探针密度要匹配光照变化。如果场景里有个窗户窗边和角落的光照差异很大探针就要在窗边加密。均匀分布会导致光照过渡不自然。我的经验是光照变化剧烈的地方探针间距0.5-1米光照均匀的地方2-3米一个就够了。第三探针要避开几何体内部。探针如果在墙里或者地板下计算出来的光照信息是错的。Unity有个“Remove Inner Probes”功能但只能删掉完全在几何体内部的边缘上的还得手动调。第四动态物体要用Light Probe Proxy Volume。如果动态物体很大比如一辆车单个探针的光照信息不够用需要LPPV来提供体积化的光照信息。LPPV的Resolution参数控制体积纹理的分辨率默认2x2x2大物体建议调到4x4x4或更高。2.3 反射探针的实战配置反射探针在URP里负责模拟镜面反射的间接光。配置要点Type选择Baked模式在烘焙时生成Cubemap运行时不能改。Realtime模式每帧渲染6个面性能开销大但能反射动态物体。Custom模式可以指定一张Cubemap适合做特殊效果。大部分场景用Baked就够了只有水面、镜子这些需要Realtime。Resolution默认128室内场景建议256室外128够了。再高就是浪费因为反射探针的Cubemap会被压缩成RGBM格式实际精度有限。Box Projection这个选项很重要。勾选后反射探针会根据包围盒的形状来投影反射而不是当成无限远的球。对于房间这种封闭空间Box Projection能让反射看起来更准确。但要注意Box Projection需要设置好Bounds否则反射会扭曲。Intensity和Blend DistanceIntensity控制反射强度默认1。Blend Distance控制探针之间的过渡距离设成0的话物体在两个探针之间会突然跳变。建议设成1-2米让过渡自然。Culling Mask可以指定哪些层的光源参与反射计算。比如UI层、特效层不参与反射可以在这里排除节省性能。3. Unity HDRP的全局光照进阶玩法3.1 SSGI的开启与调优HDRP的SSGI是屏幕空间全局光照不需要烘焙实时计算间接光。开启方法在Volume里添加Screen Space Global Illumination组件勾选Enable。关键参数Ray Steps光线步进次数默认32。越高越精确但性能开销线性增长。室内场景建议64室外32。如果发现间接光有噪点先加Ray Steps不行再加Temporal Accumulation。Temporal Accumulation时域累积利用前一帧的信息来降噪。开启后画面会变平滑但快速移动相机会有拖影。建议配合TAA使用能大幅降低噪点。Filter Radius滤波半径默认8。越大越平滑但会丢失细节。室内场景建议4-8室外8-16。Depth Tolerance深度容差默认0.1。这个值控制光线在深度不连续处是否继续步进。太小会导致光线穿透物体太大又会导致漏光。建议0.05-0.2之间调。Ray Length光线长度默认50米。超过这个距离的间接光不计算。室内场景20-30米够了室外可以拉到100米。SSGI最大的问题是屏幕外信息丢失。相机一转屏幕外的间接光就没了画面会突然变暗。解决办法是配合Reflection Probe和Light Probe使用用它们来补充屏幕外的信息。3.2 Ray Tracing GI的硬件要求与配置HDRP的Ray Tracing GI需要硬件支持DXRDirectX Raytracing。NVIDIA RTX系列和AMD RX 6000系列以上都支持。开启方法在HDRP Asset里勾选Ray Tracing然后在Volume里添加Ray Tracing Global Illumination组件。Ray Count每像素发射的光线数默认1。建议2-4再高性价比就低了。光线数翻倍性能开销也翻倍但画质提升不是线性的。Ray Length光线最大追踪距离默认100米。这个值影响性能很大因为光线追踪的BVH遍历开销和距离成正比。室内场景30-50米够了。Clamp Value限制间接光的最大亮度默认10。防止某些高亮物体导致画面过曝。室内场景建议5-10室外10-20。Denoiser降噪器HDRP内置了NVIDIA的OptiX降噪。开启后能大幅降低噪点但会增加显存占用。建议开启除非你的显存非常紧张。Ray Tracing GI的效果确实好但性能开销也大。我实测过1080p分辨率下RTGI开启后帧率大概掉30%-50%。如果目标帧率是60fps建议只在高端PC上开主机和移动端就别想了。3.3 HDRP的Light Probe与Reflection Probe差异HDRP的Light Probe和URP基本一样但Reflection Probe有几个额外功能Planar Reflection Probe平面反射探针专门用于水面、镜子这种平面反射。比普通Reflection Probe精确得多但只能用于平面。配置时要注意设置好Plane Offset和Capture Camera的裁剪面。Reflection Probe的Realtime模式HDRP的Realtime Reflection Probe支持Time Slicing可以把6个面的渲染分摊到多帧完成。Time Slicing Mode选“All Faces”的话每帧渲染一个面6帧完成一次更新。这样性能开销就小多了适合需要实时反射但又不要求每帧更新的场景。Proxy VolumeHDRP的Reflection Probe支持Proxy Volume可以指定一个网格体作为反射的包围盒。对于不规则形状的房间用Proxy Volume比用Box Projection更准确。4. UE4的全局光照体系拆解4.1 Lightmass烘焙的核心参数UE4的Lightmass是CPU烘焙参数比Unity多得多。打开World Settings找到Lightmass设置Static Lighting Level Scale静态光照级别缩放默认1。这个值控制光照贴图的密度0.5的话密度翻倍烘焙时间也翻倍。室内场景建议0.5-1室外1-2。Num Indirect Lighting Bounces间接光反弹次数默认3。这个值直接决定间接光的丰富程度。室内场景建议10-20室外3-5就够了。注意反弹次数每增加1烘焙时间大概增加30%-50%。Indirect Lighting Quality间接光质量默认1。建议调到2-4能显著减少噪点。但烘焙时间也会相应增加。Indirect Lighting Smoothness间接光平滑度默认1。调到0.75-0.9能减少噪点但会丢失细节。建议0.8左右。Compress Lightmaps压缩光照贴图默认开启。关闭后画质更好但内存占用翻倍。如果目标平台内存充足建议关闭。Ambient OcclusionUE4的AO是烘焙进光照贴图的和Unity类似。但UE4的AO参数更细可以分别控制直接光和间接光的AO强度。Lightmass的烘焙时间是个大问题。一个中等规模的室内场景默认参数下可能要烘几个小时。我的优化经验是先用低质量参数快速预览确认光照布局没问题后再用高质量参数最终烘焙。另外UE4支持Swarm分布式烘焙多台机器一起跑能大幅缩短时间。4.2 Lumen的启用与性能权衡Lumen是UE5引入的动态全局光照方案UE4.27之后也支持了。启用方法Project Settings Rendering Global Illumination Dynamic Global Illumination Method选Lumen。Lumen有两种模式Surface Cache和Distance Field。Surface Cache精度高但性能开销大Distance Field性能好但精度低。默认是两者混合根据距离自动切换。关键参数Final Gather Quality最终聚集质量默认1。调到2-4能减少噪点但性能开销增加。建议1-2。Scene Lighting Quality场景光照质量默认1。调到2能提升间接光精度但烘焙时间增加。Lumen Scene DetailLumen场景细节默认1。调到2能捕捉更小的几何体但性能开销增加。Ray Lighting Mode光线光照模式有“Surface Cache”和“Hit Lighting”两种。Surface Cache快但精度低Hit Lighting慢但精度高。建议默认Surface Cache需要高质量反射时切Hit Lighting。Lumen的性能开销和场景复杂度强相关。我实测过一个中等复杂度的室内场景1080p下Lumen开启后帧率大概掉40%-60%。如果目标帧率是60fps建议只在高端PC上开。主机上可以开但要把分辨率降到900p或动态分辨率。4.3 UE4的Reflection Capture与Unity的差异UE4的Reflection Capture对应Unity的Reflection Probe但有几个关键差异Sphere Reflection Capture vs Box Reflection CaptureUE4有球形和盒形两种反射捕获。球形适合室外和开放场景盒形适合室内和封闭场景。Unity只有盒形Box Projection。Reflection Capture的更新方式UE4的Reflection Capture默认是烘焙时更新但可以手动触发更新。Unity的Baked模式也是烘焙时更新但Realtime模式每帧更新。UE4没有每帧更新的选项需要实时反射的话得用Planar Reflection或Scene Capture。Reflection Capture的优先级UE4的Reflection Capture有优先级设置多个Capture重叠时优先级高的生效。Unity的Reflection Probe也有类似机制但叫“Importance”数值越大优先级越高。Reflection Capture的亮度控制UE4的Reflection Capture可以单独控制亮度Unity的Reflection Probe只能通过Intensity控制。UE4的控制更精细可以分别调整高光和漫反射的强度。5. 三套管线GI效果的实测对比5.1 测试场景搭建与参数统一为了公平对比我搭了一个标准测试场景一个10米×10米×3米的封闭房间一面墙上有窗户房间中央有一个金属球和一个粗糙的立方体地面是木地板。光源是一个方向光模拟太阳和一个点光源模拟室内灯。三套管线的参数尽量统一光照贴图分辨率URP 80HDRP 80UE4 Level Scale 0.5相当于80间接光反弹次数URP 2HDRP 4UE4 10AO强度URP 0.8HDRP 0.8UE4 0.8反射探针分辨率URP 256HDRP 256UE4 256测试硬件RTX 3080Ryzen 9 5900X32GB内存。5.2 画质差异的量化分析间接光亮度UE4的间接光最亮因为反弹次数最多。URP的间接光最暗因为反弹次数最少。HDRP介于两者之间。具体数值在房间角落采样UE4的亮度是URP的1.8倍HDRP是URP的1.4倍。间接光颜色UE4的间接光颜色最丰富因为多次反弹后不同材质的颜色会互相影响。URP的间接光颜色比较单一基本就是环境光的颜色。HDRP比URP好一些但不如UE4。阴影柔和度UE4的阴影最柔和因为Lightmass会计算软阴影。URP的阴影比较硬因为默认的阴影过滤质量不高。HDRP的阴影质量可以调调到最高后和UE4差不多。反射质量HDRP的反射质量最好因为支持Planar Reflection和Ray Tracing。UE4的反射质量也不错但Realtime Reflection Capture的性能开销大。URP的反射质量最差因为Reflection Probe的分辨率有限而且不支持Planar Reflection。噪点水平URP的烘焙光照贴图基本无噪点因为烘焙时做了降噪。HDRP的SSGI有噪点需要Temporal Accumulation来降。UE4的Lumen也有噪点需要调Final Gather Quality。5.3 性能开销的对比数据在1080p分辨率下三套管线的帧率表现管线静态场景帧率动态场景帧率烘焙时间URP烘焙GI120fps110fps5分钟HDRPSSGI90fps75fps无HDRPRTGI60fps45fps无UE4Lightmass110fps100fps30分钟UE4Lumen70fps55fps无从数据看URP的性能最好因为它的GI方案最轻量。HDRP的RTGI性能最差但画质最好。UE4的Lightmass性能不错但烘焙时间太长。Lumen的性能介于SSGI和RTGI之间但不需要烘焙适合快速迭代。6. 常见问题与排查技巧实录6.1 漏光问题的定位与修复漏光是全局光照最常见的问题表现为光线从墙壁缝隙或角落渗出来。排查步骤第一步检查光照贴图分辨率。分辨率太低会导致光照信息不足出现漏光。把Lightmap Resolution调高试试如果漏光减轻就是分辨率问题。第二步检查Lightmap Padding。Padding太小会导致相邻物体的光照信息互相污染。把Padding调到4-8像素试试。第三步检查几何体是否封闭。如果墙壁之间有缝隙光线会从缝隙漏进来。用ProBuilder或建模软件检查一下确保几何体是封闭的。第四步检查光照探针。如果动态物体周围的光照探针太少也会出现漏光。增加探针密度试试。第五步检查AO设置。AO能吸收一部分漏光。把AO强度调高距离调大试试。如果以上都没问题那就是烘焙设置的问题。试试把Indirect Resolution调高或者把反弹次数减少。有时候反弹次数太多反而会导致漏光因为光线反弹到不该去的地方。6.2 间接光过暗或过亮的调优间接光过暗的常见原因反弹次数太少。URP默认2次建议调到4次。UE4默认3次建议调到10次。环境光强度太低。在Lighting面板里把Environment Lighting的Intensity调高。光照贴图分辨率太低。调高分辨率试试。AO强度太高。AO会吸收间接光把AO强度调低试试。间接光过亮的常见原因反弹次数太多。减少反弹次数试试。环境光强度太高。把Environment Lighting的Intensity调低。光源强度太高。检查一下方向光和点光源的强度。反射探针强度太高。把Reflection Probe的Intensity调低。调间接光是个反复试错的过程。我的经验是先调反弹次数再调环境光强度最后调AO。每次只调一个参数调完看效果这样能快速定位问题。6.3 烘焙时间过长的优化策略烘焙时间过长是UE4 Lightmass的常见问题。优化策略降低Static Lighting Level Scale。这个值越大光照贴图密度越低烘焙越快。但画质会下降。建议在调试阶段用2-4最终烘焙用0.5-1。减少Num Indirect Lighting Bounces。反弹次数每减少1烘焙时间大概减少30%。调试阶段用3-5最终烘焙用10-20。降低Indirect Lighting Quality。调试阶段用1最终烘焙用2-4。使用Swarm分布式烘焙。多台机器一起跑能大幅缩短时间。配置方法在Swarm Agent里设置Coordinator其他机器连上来就行。关闭Compress Lightmaps。压缩光照贴图会消耗CPU时间关闭后烘焙更快但内存占用增加。分块烘焙。把大场景分成几个小块分别烘焙最后合并。UE4支持Level Streaming可以按需加载。Unity的烘焙优化类似但Unity的GPU烘焙本身就比CPU快很多。如果显卡支持建议用GPU烘焙。另外Unity的Progressive CPU模式可以边烘焙边看效果调试阶段特别有用。6.4 动态物体光照不匹配的解决动态物体在烘焙场景里光照不匹配通常是因为光照探针没覆盖到。解决方法增加光照探针密度。在动态物体活动区域加密探针。使用Light Probe Proxy Volume。大物体用LPPV来提供体积化的光照信息。使用Adaptive Probe Volume。HDRP的Adaptive Probe Volume能根据场景复杂度自动调整探针密度比手动摆探针方便得多。检查探针的Culling Mask。确保动态物体的层被包含在探针的Culling Mask里。检查探针的HDR模式。如果场景是HDR的探针也要设成HDR模式否则光照信息会不匹配。还有一个容易被忽略的问题动态物体的材质。如果动态物体的材质和静态物体的材质差异太大光照探针的信息可能不适用。比如静态物体是粗糙的动态物体是光滑的反射探针的信息就不匹配。这时候需要给动态物体单独配置反射探针。7. 跨管线迁移的注意事项7.1 从URP迁移到HDRP的GI调整URP迁移到HDRPGI部分需要重新配置光照贴图要重新烘焙。URP和HDRP的光照贴图格式不同不能直接复用。光照探针要重新摆放。HDRP的探针精度更高原来的探针密度可能不够。反射探针要重新配置。HDRP支持Planar Reflection和Ray Tracing原来的Reflection Probe可能不需要了。材质要重新调。HDRP的材质模型和URP不同金属度、粗糙度的表现有差异间接光的效果也会不同。Volume设置要重新调。HDRP的SSGI、RTGI都需要在Volume里配置URP没有这些。7.2 从Unity迁移到UE4的GI差异Unity迁移到UE4GI部分的差异更大光照单位不同。Unity用LuxUE4用Lumen。同样的数值UE4的光照强度大概是Unity的10倍。光照贴图格式不同。Unity用EXRUE4用UE4的格式。不能直接复用。光照探针机制不同。Unity的Light Probe Group和UE4的Lightmass Importance Volume是两套体系。反射探针机制不同。Unity的Reflection Probe和UE4的Reflection Capture有差异需要重新配置。烘焙设置不同。Unity的Lighting面板和UE4的World Settings差异很大需要重新学习。迁移过程中最大的坑是光照单位。我一开始按Unity的数值设UE4的光照结果画面一片漆黑。后来才知道UE4的光照单位是Lumen数值要乘10。这个坑踩过一次就记住了。7.3 跨平台GI方案的取舍不同平台的GI方案选择PC高端HDRP RTGI或UE4 Lumen画质最好性能开销大。PC中端HDRP SSGI或UE4 Lightmass画质不错性能开销适中。主机URP烘焙GI或UE4 Lightmass性能优先画质够用。移动端URP烘焙GI必须用烘焙实时GI性能扛不住。WebGLURP烘焙GI而且光照贴图分辨率要低否则加载太慢。选择GI方案时要先确定目标平台再确定画质目标最后确定性能预算。三者平衡才能选出最合适的方案。我的经验是宁可画质降一点也要保证帧率稳定。帧率不稳画质再好也没用。8. 个人实操心得与建议8.1 调试阶段的快速迭代技巧调试GI时最耗时的就是烘焙。我的快速迭代技巧用低质量参数预览。URP用CPU Progressive模式UE4用Level Scale 4、Bounces 3、Quality 1。这样烘焙时间能缩短到几分钟快速看光照布局。用Lightmap Density视图检查。Unity的Scene视图有Lightmap Density模式能直观看到光照贴图的密度分布。红色区域密度不够蓝色区域密度过高。根据这个视图调整分辨率比盲调高效得多。用Baked Lightmap视图检查。烘焙完成后切到Baked Lightmap视图能直接看到光照贴图的效果。如果有漏光或噪点一眼就能看出来。用Volume快速切换GI方案。HDRP的Volume可以保存成Profile不同GI方案存成不同Profile一键切换对比。UE4的Post Process Volume也有类似功能。用命令行烘焙。Unity支持命令行烘焙可以写个脚本自动跑。UE4也支持命令行烘焙配合Swarm分布式能大幅缩短时间。8.2 项目实战中的GI方案选择我做过几个项目GI方案的选择经验室内建筑可视化UE4 Lightmass反弹次数20Level Scale 0.5。画质最好烘焙时间可以接受几小时。室外开放世界URP烘焙GI光照贴图分辨率40反弹次数2。性能优先画质够用。动态时间变化场景HDRP SSGI或UE4 Lumen。需要实时GI烘焙方案不行。移动端游戏URP烘焙GI光照贴图分辨率20-40反弹次数1-2。性能第一画质第二。VR项目URP烘焙GI光照贴图分辨率40-60反弹次数2。VR对帧率要求极高实时GI基本不能用。选择GI方案时最重要的是明确项目需求。如果项目不需要动态时间变化烘焙GI是最优解。如果需要动态GI那就得接受性能开销。没有完美的方案只有最适合的方案。8.3 未来趋势与学习建议全局光照技术还在快速发展。几个趋势值得关注硬件光线追踪的普及。随着RTX和RX 6000系列的普及RTGI会越来越常用。学习RTGI的原理和配置是未来的必备技能。机器学习降噪。NVIDIA的OptiX降噪和Intel的OIDN降噪能大幅降低RTGI的噪点。学习这些降噪器的使用能提升RTGI的实用性。混合GI方案。Lumen的成功证明了混合方案的价值。未来可能会有更多混合方案出现结合烘焙和实时的优势。云烘焙。Unity和UE4都支持云烘焙把烘焙任务放到云端本地机器不用等。学习云烘焙的配置能提升工作效率。学习建议先精通一套管线的GI方案再横向对比其他管线。我一开始是URP后来转HDRP再后来学UE4。每学一套新管线都能加深对GI原理的理解。另外多动手调参数比看文档有用得多。GI是个经验活调得多了自然就有感觉了。最后分享一个小技巧调GI时把场景截图保存下来标注参数。下次遇到类似场景直接参考之前的参数能省很多时间。我有个文件夹专门存各种场景的GI参数截图现在已经有几百张了。这个习惯让我在项目里调GI的速度比同事快很多。
返回列表