
在Unity里折腾HDRP打光这件事我踩过的坑比很多人走过的路都多。从最初在标准管线下随手拖一个平行光就能出图到切到HDRP之后发现灯光参数完全看不懂、GI效果怎么调都不对再到后来终于摸清光照贴图烘焙和路径追踪那套组合拳整个过程花了不少冤枉时间。这篇东西我打算把从光照贴图到路径追踪的全局光照技术线完整讲一遍按实际项目里用的顺序来先解决HDRP下怎么正确理解灯光再讲烘焙GI的正确姿势然后说动态物体的实时GI和反射探针最后上路径追踪做离线预览和出图。每个部分都配我用过的参数和排查思路适合正在从内置管线往HDRP迁、或者已经在HDRP里做项目但光照效果一直不对劲的开发者。1. 先把HDRP的光照逻辑理顺为什么你过去的打光习惯全废了很多人第一次切到HDRP最大的困惑就是我把场景摆好了灯光也加了为什么画面看起来灰蒙蒙的甚至比内置管线还差这不是巧合而是HDRP的渲染底层逻辑和内置管线完全不同。1.1 HDRP和内置管线的光照单位差异内置管线的平行光强度用0到1的范围就能压住场景但HDRP里物理灯光单位把这一套全推翻了。点光源和聚光灯默认单位是Candela平行光用Lux面积光用Lumen。你过去习惯的Intensity1的做法在HDRP里几乎等于没开灯。这里面有个初看容易懵的点为什么HDRP要这么设计简单说HDRP的目标是物理正确。物理正确意味着光强必须有明确的物理单位这样摄像机的曝光、后期Bloom、泛光效果才能基于真实的辐射度推算出正确结果。你在HDRP里把平行光设成100000 Lux那是模拟晴天正午的太阳设成3000 Lux那是阴天或室内偏暗的环境。想让场景亮起来之前先搞清楚你想模拟什么环境。实际操作中我给场景布光的第一步不是拖灯光是先把Visual Environment Sky调好。HDRP里默认的Physically Based Sky会根据太阳方向和高度自动计算出环境光和方向光的照度这时候你新建一个平行光勾选Light组件上的“Sun”模式它会把平行光的强度和颜色自动同步到天空参数上。这一步做完场景至少是正确的后面才谈得上艺术化调光。1.2 材质响应方式决定了你必须在光照上前多花几倍功夫HDRP的Lit Shader包含了Base Color、Metallic、Smoothness等物理渲染输入但很多人忽略了一个关键点在同一光照条件下粗糙度1.0和粗糙度0.2的材质对光照的响应差别极大。粗糙度高的表面以漫反射为主粗糙度低的表面会出现高光反射如果场景里没有反射探针或Planar Reflection配合就会出现“死黑一片或者死亮一片”的极端效果。所以HDRP打光有一个执行顺序问题先定材质、再定反射源、然后才调光强。你可以把光照理解为“给表面输入能量”而材质决定了这些能量怎么回弹。材质粗糙度越高全局光照越要吃满漫反射反弹越明显材质粗糙度越低反射探针的重要度就越大。这块我强烈建议你在项目前期就把材质Smoothness定义清楚不要后期统一改。我做过一个室内场景最初所有材质都用默认的Smoothness值烘焙出来的光照发闷颜色脏。后来把木质桌面的Smoothness调到0.4墙面调到0.25金属饰品拉到0.9配合反射探针重烘焙了一次整个环境立刻“通透”起来。这个案例足以说明HDRP里材质定义是光效的地基。1.3 涉及Shadow、Volume和后期效果的管线级联动HDRP的体积体积框架Volume把曝光、Bloom、Tonemapping、色差、景深等全部集中管理。很多人只调灯光不管Volume结果怎么打光都灰、都平。我的基本配置是场景里放一个Global VolumeProfile里开启ACES Tonemapping、Bloom、Color Adjustments和Depth of Field。其中Bloom阈值按场景亮度走一般设在1.5到2.5之间防止过曝闪烁Color Adjustments的Saturation稍微降到-10到-15能让场景色彩更沉稳。HDRP的曝光模式默认是Auto如果你用了Fixed模式灯光亮度就完全由你定的物理参数决定不再自动适应。两种模式我都用过最终选了Fixed加手动Exposure Compensation动态可控性更强。阴影部分HDRP的阴影距离、级联数量和Shadow Resolution都在HDRP Asset里统一管理不是单个灯光面板。如果你觉得阴影边缘锯齿严重先去HDRP Asset里把Shadow Resolution提升到2048或4096再把Cascade Count调到4然后在灯光组件里把Near Plane Offset调到0.01左右这个组合在绝大多数场景下都能解决阴影抖动问题。2. 光照贴图烘焙静态场景GI的质量和性能全看这步的执行细节光照贴图是全局光照最传统也最稳的方案。HDRP里烘焙GI的核心工具是Progressive GPU Lightmapper配合Lightmap Static标记。这一整套流程新手很容易在里面踩坑。2.1 标记Static的完整检查清单很多人的光照贴图烘焙出来有漏光、有黑缝八成是Static标记出了问题。在Unity里想参与烘焙的物体需要两个条件一个是GameObject的Static下拉菜单里勾选Lightmap Static另一个是Mesh Renderer里的Contribute GI必须打开同时Receive GI设为Lightmaps。经常被忽略的地方是Lightmap Parameter。你可以给不同物体分配不同的参数控制烘焙分辨率、优先级和是否允许光照贴图压缩。我的习惯是墙面、地板这类大面积物体用Medium参数Resolution设成每单位几像素取决于项目需求小道具比如杯子、书本这种用Low参数烘焙密度更高。如果某个物体烘焙出来明显糊可以单独给它一个高Resolution参数而不是整体拉高全局数值。还要留意的是分离的Mesh如果共享同一块UV区域光照贴图烘焙时可能出现贪心打包问题导致细微的漏光。解决办法是在模型导入设置里开启Generate Lightmap UV注意设置合理的Pack Margin我一般用默认值4对于密集小部件会调到8这样烘焙接缝更稳定。2.2 烘焙参数的选择逻辑别再用默认值硬扛HDRP内置的Progressive GPU Lightmapper比CPU Lightmapper快很多但参数设置不对快也没用。我常用的参数组合是Lighting Mode如果场景里还有动态物体需要实时光照用Indirect Resolution和Light Probe配合纯静态场景直接Baked Indirect。Direct Samples控制在32到64之间太高收益不明显。Indirect Samples设置在256到1024之间数值越高反射反弹的噪点越少但烘焙时间成倍上涨。Lightmap Resolution默认是1但在大场景里这个数值会导致阴影和GI细节糊成一团我一般拉到2、4甚至8。注意它不是越高越好太高会增加内存压力和烘焙时间你需要观察实际效果来决定。Bounce Count这个参数容易让人误解。它控制的是渲染器计算漫反射光线的反弹次数。2次反弹能保证基本环境光3到4次能让暗部更通透、颜色溢出更细腻但烘焙时间显著提高。做室内白天场景我通常用3次夜晚场景2次就够了因为夜晚光源少反弹贡献有限。烘焙完成后不要急着关窗口先检查Lightmap的显示结果。在Lighting窗口把Baked Lightmap调成方向性或非方向性一般室内选方向性光照贴图能保留更准确的法线细节和局部遮挡室外大场景用非方向性性能更好。这条选择我花过不少时间对比项目中最终几乎都是方向性光照贴图美术效果好很多。2.3 灯光模式决定动态物体怎么被照亮HDRP里有Baked、Realtime、Mixed三种灯光模式很多人搞不清它们的作用边界。我用一句话总结Baked模式只参与烘焙实时动态物体完全不受影响Realtime模式完全实时但建议用在少量灯光上Mixed模式最关键能让静态物体受到烘焙GI同时阴影部分由实时补光配合Light Probe Group就能让动态物体也获得环境反射。我实际项目中用得最多的是Mixed Directional Baked辅助光。主平行光用Mixed不仅让静态场景有高质量阴影动态角色也能打出清晰的实时投影辅助的补光用Baked只负责烘焙GI避免运行时Shader复杂度上升和实时阴影的计算压力。这一套组合能满足大部分场景需求。动态物体的接收方式要配套处理Mesh Renderer的Receive GI选择Light Probes时它从Light Probe Group插值获取GI不会直接读取静态光照贴图。这就需要在场景合适位置布置Light Probes保证动态物体所在空间都有探针覆盖。2.4 常见问题烘焙有接缝、有黑斑、有噪点怎么办接缝问题接缝一般是UV padding不够或Lightmap压缩引起的。在Player Settings里取消勾选Use Legacy Lightmap Format同时把静态物体Mesh Renderer上的Cast Shadows改成Two-Sided能显著减少背面阴影造成的接缝。黑斑问题黑斑通常是灯光反弹采样不够或Lightmap分辨率偏低。先单独提高Indirect Samples再看看黑斑是否消失如果还在把那片区域的Lightmap Resolution调高一级基本能压下去。噪点问题噪点大概率是烘焙时Direct或Indirect Sample不足。我见过很多人烘焙时间短但噪点爆炸就是因为采样开太低。Direct至少32Indirect至少256低于这个值画面基本没法看。烘焙阶段我还建议你打开Auto Generate的开关让Unity在调节灯光后自动重新烘焙配合实时的预览判断方向。等到项目即将打包前再改成手动烘焙避免每次改材质都触发漫长等待。3. 实时GI和反射动态物体融入静态场景的正确方式光照贴图只解决了静态物体的问题场景里的NPC、玩家角色、可移动道具总得亮得自然。这需要一套实时GI的辅助体系核心就是Light Probe Group和反射探针。3.1 Light Probe Group的正确布置逻辑Light Probe Group可以在场景里放置大量采样点烘焙时记录这些位置的间接光照。动态物体运行时通过周围探针的插值获得和静态物体一致的环境光颜色与亮度。布置的原则不是“均匀撒点”而是“密度跟随视觉焦点”。我的做法是沿着角色经常经过的路线布置一圈关键交互区域加密一点墙角、门框、楼梯拐角这种光线变化大的位置必须放探针。探针之间的间隔能保证光照渐变平滑就行太密除了增加烘焙时间没有额外收益。有一类问题是新手特别容易踩的室内场景没有布置探针角色一走到屋子里身体立刻变黑。这不是材质问题是探针覆盖不够导致插值缺失。解决办法是室内室外分区块布置让室内探针完全覆盖角色的可达范围。现实中很多项目角色在门口会产生明显的亮度跳变就是因为门口缺少探针平滑过渡。3.2 反射探针粗糙度越低越依赖它HDRP的Lit材质高光反射依赖反射探针提供环境反射信息如果没有反射探针金属表面和光滑地板会变成灰蒙蒙一片。每个重要场景至少需要一个Reflection Probe覆盖主要的反射区域。我实践中的配置习惯大空间用Sphere Influence反射探针勾选Capture Every Frame在运行时更新会消耗较大一般只在编辑器下更新或者用Script在特定时机比如开门触发一次更新。小空间使用Custom模式自定义影响盒体限制反射范围减少和其他探针的重叠。反射探针有个注意事项它不能参考动态物体。如果你场景里有大量可移动的金属物件反射探针拍到的还是原来的位置这时候就得靠Planar Reflection或者单独给物体写Shader的Reflection Probe设置来处理。其实大部分项目不用做到这种程度反射探针更新时手动刷新一次就够了。3.3 Layermask与RenderingLayermask反射和阴影的可用性区别涉及探针采集和自定义Shader时不少人会混淆Layermask和RenderingLayermask。这两个概念表面都叫Layermask实际作用完全不同Layermask控制物理层面的碰撞、射线检测和逻辑判断RenderingLayermask控制渲染通道的可见性比如探针是否渲染某个层级的物体、后处理是否作用于某个层级的相机。实际案例给Underwater场景做一个水体材质要求只显示特定层级的物体反射用渲染通道的LayerMask过滤就能高效实现不必单独创建多个相机。在HDRP的反射系统里Rendering Layer Mask能帮你避免全局探针录制到不该出现的物体比如探针采集时把角色隐藏防止反射里出现“幽灵角色”。我建议你为项目做一套层管理表比如Player、Enemy、Environment、Effects、UI各占独立层级然后在反射探针里用RendererLayerMask过滤掉角色这样场景物体增多后探针和其他渲染功能不会因层级混乱而出错。单层Layermask主要留给物理交互和逻辑判断。3.4 实时阴影和接触阴影的进阶配合HDRP下动态物体的接触阴影用Contact Shadows。它的原理是沿光方向做额外深度偏移补充屏幕空间接触区域被光遮挡的细节。这个效果对角色脚下、墙根、家具底部的真实感帮助很大但开销不小。我的经验是室内特写镜头可以开启主光的Contact Shadows室外区域或远距离场景建议关掉改为用SSAO屏幕空间环境光遮蔽来补充细节。实时阴影容易出现的具备单价阴影边缘锯齿、阴影闪烁、阴影距离不足。锯齿问题提过靠HDRP Asset的Shadow Resolution和Cascade Count解决闪烁问题多半是Shadow Near Plane Offset太小或Lightmap打包重了适当调大Near Plane Offset就能缓解远处阴影突然消失则是因为Shadow Distance太“短”在HDRP Asset里把Shadow Distance调成150到300配合Fade Distance渐变能减少突兀感。4. 路径追踪从实时渲染跨入离线渲染的最后一公里路径追踪Path Tracing是HDRP里一个偏实验性质的功能但它能给场景输出非常接近离线渲染器的效果。这个功能帮我解决过很多“实时渲染出不了高品质产品图”的问题做建筑可视化、关卡Key Art、宣传片单帧这招极为好用。4.1 启用路径追踪前的环境和硬件准备HDRP的Path Tracing需要满足几个条件HDRP Asset里勾选Path Tracing并且使用支持光追的GPURTX系列最佳也能跑在纯CUDA的GPU上但效率低。在Unity 2022 LTS和更新版本里路径追踪器稳定度已经提升不少但在正式项目中建议先做原型验证别一上来就把关键宣传图渲染依赖它。使用路径追踪时不再需要烘焙光照贴图也不需要实时反射探针。它计算的是真实的光线传播包含漫反射反弹、折射、焦散、镜头效果等物理现象。由于是逐像素累积采样画面干净度取决于你给了多少固定采样数。对静态场景而言我曾经烘焙一大张4K光照贴图需要两小时路径追踪在3000采样下四十分钟就出效果更好的画面而且完全不用管UV接缝问题。4.2 路径追踪的采样与降噪设置路径追踪的帧是逐步累计的。我先说最基本的操作在Volume里把Path Tracing模式打开同时加一个Denoiser。HDRP自带Denoiser能极大压缩所需的采样数。没有降噪器时你至少需要4096采样才能出干净图有降噪器后1024到2048采样即可满足大多数场景需求。我常用的设置Max Samples设为2048开启Denoising把Denoiser的强度调到0.6左右既能平滑噪点又不至于把阴影和纹理细节磨没。如果画面还需要更干净就逐步提升到3072或4096但注意单帧渲染时间会线性上涨。路径追踪对体积光Volumetric和雾效支持得很好。想要体积雾效果需要在Path Tracing设置里开启对应的中期雾计算这个和实时管线下的体积雾是两个完全不同的算法路径开销差异极大。我的建议是做静态高帧时开体积雾增加厚重感做动态场景干脆关掉用实时体积雾代替。4.3 路径追踪实际应用质量、限制和排错路径追踪目前不支持一部分粒子系统和透明的复杂材质链碰到这类物体它会退化成普通光栅化结果甚至可能出现瑕疵。我在项目里就遇到过一个丝绸材质的窗帘在Path Tracing下渲染出黑色查了半天发现是Surface Subsurface Material在那版本里未被路径追踪完全支持。解决办法是材质临时换回Lit或者单独用对象遮罩把不需要参与光追的物体排除保留核心静态部分的真实性。如果你的机器不支持光追亦可以用CPU跑路径追踪。Unity里CPU Path Tracing是内置的只是速度感人。为了能走通流程建议项目里最好准备一台RTX 3060以上的显卡专门做这类渲染否则调参循环会拖垮你的迭代效率。这里还有一个技巧值得分享路径追踪模式下可以配合实时渲染器做一个“对拍”。你先用实时管线布置一个大概的光照氛围记录参数位置再用路径追踪验证最终效果。这个流程能帮你确认实时管线哪块设置不对比如补光强度、色调映射值是否合理。我经常用这个方法快速校对室内场景的真实视角效果非常直观。5. 实战调参的经验总结从烘焙GI到路径追踪的技术选型路线全篇文章已经覆盖了各类GI方案我再按项目阶段把技术选型路线总结一下方便你直接套用。5.1 按项目阶段选择GI方案阶段一原型期场景全是白模用纯实时灯光加SSAO就能验证玩法不需要烘焙也不需要探针。等美术资产稳定后再考虑GI效果。阶段二中期核心场景美术资产基本确定静态物体开始烘焙Lightmap同时布置Light Probe Group和反射探针解决动态角色的环境光问题。这是耗时最长的阶段烘焙参数的调整占大头。阶段三后期用于宣传图、过场动画特写的镜头可以切换到路径追踪验证最终画面效果。普通Gameplay画质继续走烘焙实时GI的混合路线。5.2 工作流层面的执行顺序实际项目里光照贴图烘焙和路径追踪不是互斥的很多团队两个都在用。烘焙GI负责游戏运行时的稳定帧率路径追踪负责精品画面的最终输出。工作流上你把场景的材质的PBR参数调正确烘焙时得到的效果与路径追踪的理论极限就不会差太远。如果差异大说明材质本身的物理参数不对或者某个补光单位设置有问题。我建议在项目里建立一套“光照验收”的标准每个场景必须同时通过烘焙实时预览和路径追踪渲染的对比两者画面差异控制在可接受范围才算光照完成。这套标准我跑了四个项目效果非常稳定。网上常有人在论坛抱怨HDRP难上手我只能说难门永远拦的是没有系统思路的人。按上面这套从“灯光单位—材质物理参数—烘焙设置—探针布置—路径追踪验证”的顺序走一遍你已经超过了绝大多数只会在Inspector里拖参数的开发者。光照的本质是给你场景里的物体分配正确的能量方法对了效果自然会出来。最后再分享一个小技巧无论你调试到哪个阶段养成先保存Lighting Profile的习惯。HDRP的所有光照相关设置集中在HDRP Asset里烘焙参数在Lighting窗口Volume覆盖在Scene层级把这几类配置拆分成可复用的Profile项目换场景、换机器、换版本时能省大量重复劳动。光影本身就是玩细节的过程你前期多花一小时把配置抽成模板后面每一个新场景都能快上半天。