☰
Unity URP PBR材质实战:从参数原理到金属塑料质感调优
2026/9/30 9:27:43 网站建设 项目流程

1. 从零搞懂PBR:为什么你的材质看起来总像塑料

1.1 一个让我纠结了三个月的画面差异

刚接触URP管线那会儿,我做过一个特别蠢的对比测试。同一个金属球模型,我用传统Lambert光照调了一版,又用PBR流程调了一版,然后截了两张图发到群里问哪个更真实。结果群里一个做了八年TA的老哥回了一句:“你左边那个球,像极了超市里九块九包邮的塑料玩具。”这句话我记到现在。

问题出在哪?传统光照模型里,高光是一个独立于材质本身的存在,你调高光颜色、高光强度、光泽度,本质上是在“画”一个高光,而不是让材质“产生”高光。PBR(Physically 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 Reflection,Smoothness低的区域反射会变得模糊,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,只在边缘磨损、污渍过渡区域使用中间值。比如一把金属剑,剑刃是抛光金属Metallic=1,剑柄缠绕的皮革Metallic=0,两者交界处可以用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贴图控制。做写实材质一律选Metallic,Specular模式适合做宝石、玻璃这类需要精确控制反射颜色的材质。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 Map,Create 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 金属材质:从抛光钢到生锈铁

金属材质的核心特征是Metallic=1,Base 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 非金属材质:塑料、木材、布料的参数差异

非金属材质的Metallic=0,Base 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值设为0,Smoothness设为0.1到0.3,Base Color用深灰或者棕色。边缘用Dirt或者Grime滤镜做过渡,过渡区域的Metallic和Smoothness用渐变映射来控制。

水渍的处理更复杂一些。水渍区域的Smoothness要拉高到0.9以上,Metallic保持原样,Base Color稍微加深。如果水渍是流动的,还需要在Normal贴图里加入微弱的波纹。但实时渲染里水渍的反射很难做准确,我的建议是水渍区域用Smoothness贴图控制,不要改Metallic,否则水渍会看起来像金属斑块。

5. 常见问题与排查技巧实录

5.1 材质看起来像塑料的五个原因

第一个原因,Smoothness过高但Metallic=0。非金属材质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 Probe,Bake一下,或者用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里的Bloom,Bloom强度过高会让金属高光溢出。

还有一个隐蔽的原因: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颜色贴图,sRGB
MetallicMetallic Map金属度,Linear
GlossinessSmoothness Map光滑度,数值相反
NormalNormal Map法线贴图
Height无直接对应URP用Parallax Mapping
OcclusionOcclusion MapAO贴图
EmissionEmission自发光

Glossiness和Smoothness的数值是反的:Glossiness=1-Smoothness。如果你从Built-in项目迁移到URP,Smoothness贴图需要反相。在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通道放Metallic,A通道放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不够高级。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询