ARTICLE DETAIL

资讯详情

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

Unity URP PBR材质实战:从参数原理到金属塑料质感调优

Unity URP PBR材质实战:从参数原理到金属塑料质感调优 1. 从零搞懂PBR为什么你的材质看起来总像塑料1.1 一个让我纠结了三个月的画面差异刚接触URP管线那会儿我做过一个特别蠢的对比测试。同一个金属球模型我用传统Lambert光照调了一版又用PBR流程调了一版然后截了两张图发到群里问哪个更真实。结果群里一个做了八年TA的老哥回了一句“你左边那个球像极了超市里九块九包邮的塑料玩具。”这句话我记到现在。问题出在哪传统光照模型里高光是一个独立于材质本身的存在你调高光颜色、高光强度、光泽度本质上是在“画”一个高光而不是让材质“产生”高光。PBRPhysically Based Rendering基于物理的渲染的核心逻辑完全不同——它要求材质的每一个视觉表现都必须有物理依据。金属的高光颜色来自它自身的反射率粗糙度决定高光是锐利还是弥散能量守恒保证反射的光不会比入射的光还多。URP管线对PBR的支持是原生级别的Lit Shader直接暴露了 metallic、smoothness、occlusion 这些参数但很多人拿到这些参数之后根本不知道该怎么填。我见过太多人把Smoothness拉到1.0然后抱怨场景里全是过曝的白斑也见过有人把Metallic设成0.5结果材质既不金属也不塑料卡在一个诡异的中间态。这篇笔记就是把我踩过的这些坑一个一个拆开从参数背后的物理含义讲到URP管线里的实际配置再到不同材质类型的完整工作流。1.2 谁适合看这份笔记能解决什么问题如果你正在用Unity的URP管线做项目手头有Substance Painter或者Materialize这类贴图工具但对PBR的理解还停留在“金属度拉高就是金属”的层面那这份笔记就是写给你的。我会从最基础的微表面理论讲起但不会堆公式而是用“为什么这个参数要这样调”的方式把原理揉进实操里。具体来说这份笔记能帮你解决几个典型问题金属材质看起来像塑料、非金属材质高光过曝、同一套贴图在不同光照环境下表现不一致、URP的Lit Shader参数和Substance Painter导出的贴图对不上号。这些问题的根源都在于对PBR工作流的理解有断层而不是软件操作不熟练。另外说一句网上很多PBR教程用的是Built-in管线或者HDRP参数命名和URP有差异。比如URP的Smoothness和Built-in的Glossiness在数值上是反的HDRP又多了一层Specular Color的控制。这份笔记专门针对URP管线所有参数名和操作路径都以URP为准。2. PBR的核心逻辑能量守恒与微表面理论到底在说什么2.1 能量守恒为什么你的高光不能比光源还亮PBR最底层的约束就是能量守恒。简单说一束光打到物体表面一部分被反射Specular一部分被吸收后重新发射出来Diffuse还有一部分穿透或者转化为其他形式。反射加吸收的总能量不能超过入射光的总能量。这个约束在渲染里的直接体现就是非金属材质的Specular和Diffuse是互斥的你调高了高光强度漫反射就必须相应减弱。很多传统光照模型没有这个约束你可以把高光调到刺眼的同时保持漫反射全亮结果就是物体看起来像自发光。PBR的Lit Shader在URP里强制了这个约束当你把Smoothness拉高时Specular反射增强Diffuse会自然衰减。这也是为什么PBR材质在同样光照下看起来更“稳”不会出现某个角度突然爆亮的情况。注意URP的Lit Shader里有一个Specular Highlights选项关掉它确实能消除高光但同时也破坏了能量守恒的视觉表现。除非你在做风格化渲染否则不要关。2.2 微表面理论粗糙度到底在控制什么微表面理论把物体表面看成无数个微小镜面的集合。粗糙度在URP里用Smoothness的反向值来体现控制的是这些微镜面的朝向分布。Smoothness越高微镜面朝向越一致反射光线越集中高光越锐利Smoothness越低微镜面朝向越杂乱反射光线越分散高光越弥散。这里有一个实操中很容易忽略的点粗糙度影响的不只是高光的锐利程度还影响环境反射的模糊程度。在URP里如果场景里放了Reflection Probe或者用了Screen Space ReflectionSmoothness低的区域反射会变得模糊Smoothness高的区域反射会清晰。这个特性在做潮湿地面、抛光金属、磨砂玻璃时特别有用。我自己的经验是Smoothness在0.0到0.3之间适合做粗糙的布料、未处理的木材、混凝土0.3到0.6适合做塑料、皮革、哑光漆面0.6到0.85适合做抛光木材、陶瓷、光滑塑料0.85到1.0适合做镜子、抛光金属、水面。但这个区间不是绝对的还要结合Metallic的值来调整。2.3 金属度二值逻辑还是连续过渡理论上一个材质要么是金属要么是非金属不存在中间态。但在实际制作中由于贴图精度、边缘磨损、污渍覆盖等原因Metallic贴图经常会出现灰色区域。URP的Lit Shader允许Metallic在0到1之间连续变化但这不意味着你应该随意使用中间值。我的建议是主体材质尽量保持Metallic为0或1只在边缘磨损、污渍过渡区域使用中间值。比如一把金属剑剑刃是抛光金属Metallic1剑柄缠绕的皮革Metallic0两者交界处可以用0.3到0.7的过渡来模拟磨损导致的金属暴露。如果整个模型都是0.5的Metallic渲染出来会是一种既不像金属也不像非金属的诡异质感。实操心得在Substance Painter里导出Metallic贴图时把Metallic通道的直方图拉出来看一眼。如果大量像素集中在0.4到0.6之间大概率是图层混合模式出了问题需要检查每个图层的Metallic值是否合理。3. URP管线下的PBR实操配置全流程3.1 项目准备与URP环境确认在开始调材质之前先确认你的项目确实在使用URP管线。打开Package Manager确认Universal RP已经安装。然后在Project Settings的Graphics里Scriptable Render Pipeline Settings应该指向一个Universal Render Pipeline Asset。如果没有右键Create Rendering URP Asset创建一个然后拖进去。URP Asset里有两个关键设置会影响PBR表现Lighting下的Main Light和Additional Lights。Main Light的Shadows要开启Additional Lights的Per Object Limit根据场景灯光数量调整。如果场景里有多个影响同一物体的光源Per Object Limit太低会导致部分光源不参与PBR计算材质表现会突然变平。另外Color Space必须设为Linear。在Player Settings的Other Settings里找到Color Space改成Linear。Gamma空间下PBR的光照计算是不正确的金属反射会明显偏暗粗糙度的过渡也会不自然。这个设置改完之后需要重新烘焙光照所以最好在项目初期就确认好。3.2 Lit Shader参数逐项拆解URP的Lit Shader在Material Inspector里暴露了这些参数Surface Options、Surface Inputs、Detail Inputs、Advanced Options。我按实际使用频率和重要性逐个说。Surface Options里的Workflow Mode有两个选项Metallic和Specular。Metallic模式用Metallic贴图和Smoothness贴图控制Specular模式用Specular贴图和Smoothness贴图控制。做写实材质一律选MetallicSpecular模式适合做宝石、玻璃这类需要精确控制反射颜色的材质。Render Face默认Front做透明物体或者双面材质时才改。Alpha Clipping做树叶、布料镂空时开启。Surface Inputs是核心区域。Base Map放Albedo贴图注意URP的Albedo贴图在Metallic工作流下不应该包含任何光照信息纯色块加纹理细节就对了。Metallic Map放金属度贴图Smoothness Map放光滑度贴图。如果只有一张Metallic/Smoothness合并贴图把Metallic Map的R通道和Smoothness Map的A通道分别指向同一张贴图的不同通道。这里有个URP特有的坑Metallic Map的Smoothness Source选项。默认是Metallic Alpha意思是Smoothness从Metallic贴图的Alpha通道读取。如果你的Smoothness贴图是单独的灰度图需要把Smoothness Source改成Base Map Alpha然后把Smoothness贴图放到Base Map的Alpha通道里。或者更简单的做法在Substance Painter导出时就把Metallic和Smoothness合并成一张贴图Metallic放R通道Smoothness放A通道。Normal Map放法线贴图Normal Scale默认1.0。如果法线强度看起来过强先检查法线贴图的导入设置。在贴图的Import Settings里Texture Type选Normal MapCreate from Grayscale不勾选。如果法线贴图是从其他软件导出的确认它的绿通道方向是OpenGL还是DirectX。URP默认是OpenGL方向如果贴图是DirectX方向需要勾选Flip Green Channel。Occlusion Map放AO贴图强度默认1.0。AO贴图的作用是模拟缝隙和凹陷处的阴影但它不应该替代实时光照。我的习惯是把AO强度设在0.6到0.8之间保留一部分实时光照的贡献避免物体看起来像被“压扁”了。3.3 从Substance Painter到URP的贴图导出规范Substance Painter的导出预设里选Unity URP Metallic它会自动生成一套符合URP命名规范的贴图。但有几个细节需要手动确认。Base Color贴图导出时Color Space必须是sRGB。Metallic、Smoothness、Normal、Occlusion、Height这些贴图的Color Space必须是Linear。在Unity的贴图Import Settings里sRGB选项对于Base Color要勾选对于其他贴图要取消勾选。这个设置如果搞反了金属度会偏亮或者偏暗粗糙度的过渡也会出问题。Normal贴图的Texture Type选Normal Map然后点Apply。如果Substance Painter里用了UDIM或者多象限UV导出时需要合并成一张贴图URP的Lit Shader不支持UDIM。Metallic和Smoothness的合并方式在Substance Painter的Export Presets里找到Unity URP Metallic预设它会自动把Metallic放到R通道Smoothness放到A通道输出一张RGBA贴图。在Unity里Metallic Map指向这张贴图Smoothness Source选Metallic Alpha。这样一张贴图同时控制金属度和光滑度节省显存。注意如果Smoothness贴图在Substance Painter里是反的比如你习惯用Roughness导出前在Substance Painter的Export Presets里把Roughness Invert一下。URP用的是Smoothness数值越大越光滑和Roughness正好相反。4. 不同材质类型的PBR参数实战参考4.1 金属材质从抛光钢到生锈铁金属材质的核心特征是Metallic1Base Color直接决定反射颜色。抛光钢的Base Color在sRGB空间大约是(0.56, 0.57, 0.58)Smoothness在0.9以上。生锈铁的Base Color偏红棕Smoothness在0.2到0.4之间同时需要在Metallic贴图里把锈蚀区域降到0.2到0.5因为铁锈本身是非金属。我做金属材质时有一个固定流程先在Substance Painter里用Metal预设起手然后根据具体金属类型调整Base Color。黄金的Base Color大约是(1.0, 0.76, 0.34)铜是(0.95, 0.64, 0.54)铝是(0.91, 0.92, 0.92)。这些数值不是随便定的是实际金属的反射率测量值。如果你不确定某种金属的Base Color去搜“metal reflectance values chart”能找到完整的参考表。Smoothness的处理上抛光金属的Smoothness不要直接拉到1.0。1.0意味着完美镜面在实时渲染里会出现明显的锯齿和闪烁。我一般最高用到0.95配合Reflection Probe或者Planar Reflection来模拟真实反射。如果场景里没有反射探针Smoothness超过0.8的金属会看起来像黑色塑料因为它反射的环境是默认的灰色。4.2 非金属材质塑料、木材、布料的参数差异非金属材质的Metallic0Base Color是漫反射颜色Smoothness控制高光锐利度。塑料的Smoothness在0.5到0.8之间Base Color饱和度可以很高。木材的Smoothness在0.2到0.5之间取决于是否上漆。布料的Smoothness在0.1到0.3之间高光非常弥散。这里有一个常见误区非金属材质的Specular强度不是固定的。URP的Lit Shader里非金属的Specular反射率默认是0.04但你可以通过Specular Map来调整。比如皮肤、宝石、某些涂层的Specular反射率会高于0.04。但在Metallic工作流下Specular Map是隐藏的需要切换到Specular工作流才能看到。大部分情况下保持默认的0.04就够了。布料的PBR制作有一个特殊技巧用Smoothness贴图来模拟纤维的微观结构。在Substance Painter里用Fibers滤镜生成一张噪声图然后把它连到Smoothness上Smoothness范围控制在0.1到0.35之间。这样布料的高光会呈现出细微的颗粒感而不是均匀的一片。4.3 混合材质污渍、磨损、水渍的处理逻辑混合材质是PBR工作流里最考验功力的部分。一个金属表面上有污渍污渍区域的Metallic要降低Smoothness也要降低同时Base Color要偏向污渍的颜色。这三个通道的变化必须同步否则会出现“金属质感的污渍”这种违和感。我的处理方法是分层底层是基础材质上层是污渍层。在Substance Painter里污渍层用Multiply或者Overlay混合模式同时影响Base Color、Metallic、Smoothness三个通道。污渍的Metallic值设为0Smoothness设为0.1到0.3Base Color用深灰或者棕色。边缘用Dirt或者Grime滤镜做过渡过渡区域的Metallic和Smoothness用渐变映射来控制。水渍的处理更复杂一些。水渍区域的Smoothness要拉高到0.9以上Metallic保持原样Base Color稍微加深。如果水渍是流动的还需要在Normal贴图里加入微弱的波纹。但实时渲染里水渍的反射很难做准确我的建议是水渍区域用Smoothness贴图控制不要改Metallic否则水渍会看起来像金属斑块。5. 常见问题与排查技巧实录5.1 材质看起来像塑料的五个原因第一个原因Smoothness过高但Metallic0。非金属材质Smoothness超过0.8高光会变得非常锐利看起来就像抛光塑料。解决方法是把Smoothness降到0.5到0.7之间或者检查Metallic贴图是否误设为0。第二个原因Base Color过亮。非金属材质的Base Color在sRGB空间不应该超过0.8否则漫反射会过强掩盖高光细节。把Base Color整体压暗20%到30%高光会自然凸显出来。第三个原因Normal贴图强度不足。没有法线细节的平面在PBR下会显得非常“干净”像塑料模具出来的。Normal Scale调到1.2到1.5或者在Substance Painter里增加法线细节层。第四个原因环境反射缺失。URP默认的环境反射是灰色的金属和光滑非金属在没有Reflection Probe的情况下会反射这个灰色看起来像塑料。在场景里放一个Reflection ProbeBake一下或者用URP的Screen Space Reflection。第五个原因光照方向太正。PBR材质在侧光下表现最好如果主光源正对物体高光会集中在正面看起来平淡。把主光源旋转45度到60度让高光出现在物体侧面。5.2 金属反射发黑或过曝的排查路径金属反射发黑首先检查Reflection Probe是否覆盖了物体。URP的Reflection Probe有Box Projection选项开启后反射会更准确。如果Reflection Probe的Type是Baked确认已经Bake过。如果是Realtime确认Refresh Mode不是Via Scripting。其次检查Metallic贴图的Color Space。Metallic贴图必须是Linear如果误设为sRGB金属度会偏低反射会变弱。在Unity的贴图Import Settings里确认sRGB选项没有勾选。金属反射过曝通常是Smoothness太高加上光源强度太大。把Smoothness降到0.85到0.9或者在URP Asset里降低Main Light的Intensity。另外检查Post Processing里的BloomBloom强度过高会让金属高光溢出。还有一个隐蔽的原因Base Color贴图的Alpha通道。如果Base Color贴图有Alpha通道且被Lit Shader读取金属的反射颜色会被Alpha影响。在Substance Painter导出时确认Base Color贴图没有多余的Alpha通道或者在Unity里把Alpha Source设为None。5.3 URP与Built-in管线的参数映射对照很多教程用的是Built-in管线参数名和URP不一样。我整理了一个对照表方便从旧教程迁移。Built-in参数URP对应参数说明AlbedoBase Map颜色贴图sRGBMetallicMetallic Map金属度LinearGlossinessSmoothness Map光滑度数值相反NormalNormal Map法线贴图Height无直接对应URP用Parallax MappingOcclusionOcclusion MapAO贴图EmissionEmission自发光Glossiness和Smoothness的数值是反的Glossiness1-Smoothness。如果你从Built-in项目迁移到URPSmoothness贴图需要反相。在Substance Painter里重新导出时选URP预设或者在Photoshop里反相。5.4 性能优化PBR材质的显存与Draw Call控制PBR材质比传统材质消耗更多显存因为贴图通道更多。一张2048x2048的RGBA贴图占16MB一套PBR贴图Base Color、Metallic/Smoothness、Normal、Occlusion就是64MB。如果场景里有50个独立材质显存占用会非常可观。我的优化策略是合并贴图通道。Metallic和Smoothness合并成一张RGBA贴图R通道放MetallicA通道放Smoothness。Occlusion可以打包到Base Color的Alpha通道或者Metallic贴图的G通道。Normal贴图用BC5压缩格式质量损失小显存占用减半。Draw Call方面URP的SRP Batcher会自动合并使用相同Shader Variant的材质。确保所有PBR材质用的是同一个Lit Shader不要混用不同Shader。如果材质参数不同但Shader相同SRP Batcher仍然能合并。GPU Instancing适合大量相同材质的物体比如草地、石块。实操心得在URP Asset里开启SRP Batcher然后在Frame Debugger里检查Draw Call数量。如果SRP Batcher没有生效检查材质的Shader是否支持SRP Batcher。自定义Shader需要在ShaderLab里添加[PerRendererData]标签。6. 从PBR策略路由到渲染管线一个容易混淆的概念澄清6.1 PBR策略路由和PBR渲染是两回事搜索PBR的时候经常会看到“PBR策略路由”这个词这是网络设备里的Policy Based Routing和渲染里的Physically Based Rendering完全是两个领域。策略路由是根据源地址、目的地址、端口号等条件来决定数据包转发路径的技术用在路由器和交换机上。渲染里的PBR是一套光照计算模型用在游戏引擎和三维软件里。之所以提这个是因为我在搜索PBR资料时被策略路由的文档干扰过好几次。如果你在找渲染相关的PBR内容搜索时加上“渲染”或者“Rendering”关键词能过滤掉大部分网络设备的文档。6.2 URP管线的PBR扩展方向URP的Lit Shader是通用型PBR Shader覆盖了大部分场景。但如果要做特殊效果比如清漆、布料、次表面散射需要自己写Shader。URP提供了Shader Graph可以用节点连线的方式扩展PBR。比如清漆效果在Lit Shader的基础上叠加一层Coat层Coat层有自己的Smoothness和Normal。另一个扩展方向是自定义光照模型。URP的Lighting.hlsl里定义了光照计算的函数你可以复制一份修改实现各向异性高光、毛发渲染、皮肤散射等效果。但这需要一定的Shader编程基础建议先把Lit Shader的参数吃透再动手。我在实际项目里的体会是URP的Lit Shader能解决80%的PBR需求剩下20%用Shader Graph补。不要一上来就写自定义Shader先把Metallic、Smoothness、Normal、Occlusion这四个通道的关系理清楚大部分材质问题都能在这四个参数里找到答案。踩过几次坑之后我发现材质看起来不对十有八九是Smoothness和Metallic的配合出了问题而不是Shader不够高级。
返回列表