ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Unity URP材质调优实战:从PBR原理到5大案例解析

2026/8/5 2:19:43 拓冰建站 浏览量
Unity URP材质调优实战:从PBR原理到5大案例解析 1. 项目概述从“背参数”到“懂原理”的材质调优之路每次打开Unity的Lit材质面板面对那一长串的参数你是不是也感到一阵头大Base Map、Metallic、Smoothness、Normal Map……这些词都认识但具体怎么调为什么这么调心里却没底。很多朋友包括我自己刚入门时都走过一条弯路在网上找各种“万能参数”然后死记硬背下来祈祷在自己的项目里也能生效。结果往往是场景一换灯光一变材质效果就变得惨不忍睹完全不是教程里看到的样子。这种知其然不知其所以然的状态是学习Shader和材质表现最大的障碍。这个项目或者说这篇分享就是来解决这个核心痛点的。我们不谈高深的Shader代码也不讲复杂的图形学原理就聚焦在Unity URP管线下那个最常用的Lit/Simple Lit材质面板上。通过5个从简单到复杂的实战案例我会带你亲手调整每一个滑块观察每一次变化并深入解释这些参数背后的物理意义和视觉逻辑。我们的目标不是让你记住某个“森林材质”的Metallic值应该是0.3还是0.4而是让你彻底理解为什么调整Metallic会影响高光和反射Smoothness的“光滑”到底指的是什么物理属性Normal Map的强度为何不能无脑拉满当你理解了这些“为什么”你就能在面对任何材质、任何光照环境时都能自信地调出想要的效果从被参数“牵着走”变成主动“驾驭”参数。这适合所有Unity开发者无论你是刚接触3D美术的程序员还是想深入理解材质表现的美术同学。我们将从最基础的塑料和金属开始逐步深入到皮肤、丝绸、潮湿地面等复杂材质。整个过程就像在解一道物理渲染的谜题而谜底就藏在那个我们每天都会打开的材质面板里。2. 核心思路基于物理的渲染PBR是理解参数的钥匙在深入案例之前我们必须先建立一套正确的认知框架。URP的Lit Shader是基于物理的渲染Physically Based Rendering, PBR模型实现的。理解PBR是理解所有参数意义的基石。你可以把PBR想象成一套“绘画规则”它规定了光与物体表面交互的物理规律而材质面板上的参数就是这套规则下的“控制开关”。2.1 PBR的核心能量守恒与微表面理论PBR模型主要基于两个核心思想。第一是能量守恒物体表面反射的光线包括漫反射和高光反射总量不能超过它接收到的光线总量。这意味着一个非常明亮的镜面反射高光区域周围其漫反射颜色通常会显得暗一些。在Lit材质中Metallic参数直接关联着这个能量分配。当Metallic为1纯金属时几乎所有光线都被反射几乎没有漫反射当Metallic为0非金属时光线会部分反射部分被吸收并散射为漫反射。第二是微表面理论它认为物体表面并非绝对光滑而是由无数微观尺度的“小镜面”构成。这些微表面的朝向分布决定了表面的粗糙或光滑程度。在Lit材质中Smoothness参数控制的正是这个微表面的粗糙度。Smoothness越高微表面朝向越一致反射的高光越集中、锐利Smoothness越低微表面朝向越杂乱反射的高光越分散、模糊。2.2 Lit材质面板参数分组解析理解了PBR基础我们再来看Lit材质面板的参数就会清晰很多。面板通常分为几个关键区域表面属性Surface Options这是材质的“身份定义”。Surface Type不透明/透明决定了渲染队列和混合模式Render Face双面/正面控制多边形哪一面被渲染Alpha Clipping用于制作镂空效果。对于大多数实体物体我们使用Opaque。基础贴图与颜色Base Map and Color这是材质的“底色”。Base Map是一张RGB颜色贴图定义了物体表面的固有颜色Albedo。对于非金属它就是漫反射颜色对于金属它则表示反射光的颜色因为金属几乎不漫反射。Base Color滑块可以整体染色Base Map。金属度与光滑度Metallic and Smoothness这是材质的“物理属性核心”。Metallic滑块定义表面是金属1还是非金属0或者介于两者之间。Smoothness滑块定义表面的光滑程度。这里有一个高效的工作流使用一张贴图的Alpha通道来存储Smoothness信息即Smoothness贴图用另一张贴图的Alpha通道或单独一张灰度图来存储Metallic信息即Metallic贴图。这样可以通过纹理控制不同区域的属性比如一把生锈的剑剑身是金属高Metallic锈斑是非金属低Metallic。法线贴图Normal Map这是材质的“细节雕刻师”。它通过RGB颜色编码表面法线的方向在不增加模型多边形的情况下模拟出凹凸不平的细节。Normal Map的强度Scale参数控制凹凸感的强弱。高度贴图Height Map这是法线贴图的“增强版”也称为视差贴图Parallax Mapping。它是一张灰度图白色代表凸起黑色代表凹陷。配合Occlusion参数它能在倾斜视角下产生更真实的视差位移效果但性能开销比法线贴图大。遮挡贴图Occlusion Map这是材质的“阴影增强器”。它是一张灰度图用于模拟环境光遮蔽Ambient Occlusion, AO效果即物体缝隙、褶皱处应该更暗。它通常烘焙自高模能极大地增强体积感和真实感。发射贴图Emission这是材质的“自发光”属性。它让材质不受场景光照影响自己发出颜色和光。Emission Map和Emission Color共同控制自发光的强度和颜色。在URP中需要启用Bloom后处理效果自发光才能产生“辉光”效果。注意PBR材质的美术资源制作贴图有一套严格的规范。Base MapAlbedo必须是sRGB颜色空间不能包含光照信息即阴影和高光应该是物体在均匀白光下的纯颜色。Normal Map通常是切线空间法线贴图需要设置为“Normal map”类型Unity才会正确解码。3. 实战案例一基础材质——塑料与金属让我们从一个最经典的对比开始塑料和金属。这个案例能最直观地展示Metallic和Smoothness的核心作用。目标创建一个光滑的红色塑料球和一个磨砂的金色金属球。操作步骤在场景中创建两个球体Sphere。为每个球体创建一个新的材质球Shader选择Universal Render Pipeline/Lit。塑料球材质设置Base Color: 设置为纯红色RGB: 255, 0, 0。Metallic: 拖动滑块到0。这是关键塑料是非金属几乎没有镜面反射颜色来自Base Color的特性。Smoothness: 拖动滑块到0.9。高光滑度会让塑料表面产生清晰、锐利的高光点这是光滑塑料的典型特征。金属球材质设置Base Color: 设置为暗金色例如 RGB: 180, 140, 50。注意金属的Base Color通常不是亮黄色因为它的颜色主要来自反射的环境。Metallic: 拖动滑块到1。这告诉Shader这是一个纯金属。Smoothness: 拖动滑块到0.3。较低的平滑度模拟了金属表面的磨砂质感高光会扩散开变得柔和。效果对比与原理分析 将两个球放在同一个方向光下观察。你会发现塑料球的高光点非常小、非常亮并且高光的颜色是光源的颜色通常是白色。这是因为非金属的镜面反射是“无色”的只反射光源本身。金属球的高光区域更大、更柔和磨砂感并且高光的颜色偏向于Base Color的金色。这是因为金属的镜面反射是“有色”的其反射颜色由Base Color决定。实操心得调整金属材质时一个常见的误区是把Base Color调得太亮。实际上现实中的金属尤其是磨砂金属在非直接反射方向看起来是较暗的。它的“亮”来自于对周围环境的强烈反射。因此从一张HDR环境贴图Skybox来反射是让金属看起来真实的关键。你可以尝试更换不同的天空盒观察金属球颜色的变化而塑料球的变化则不明显。4. 实战案例二复杂材质——人类皮肤皮肤是次表面散射Subsurface Scattering, SSS材质。URP的Lit Shader虽然没有完整的物理SSS模拟但我们可以通过巧妙组合参数来近似这种“透光”的感觉。目标创建一个带有血色感和透光感的皮肤材质。操作步骤准备贴图你需要一张皮肤的Base Color贴图肤色一张Normal Map增加皮肤纹理细节一张Roughness贴图控制不同区域的平滑度如鼻子油亮、脸颊干燥和一张Subsurface Mask贴图用于模拟SSS通常将血管密集、皮肤薄的区域如耳朵、鼻翼、指关节画成白色。创建材质Shader选择Lit。基础设置Base Map: 赋予皮肤颜色贴图。Metallic: 设置为0。皮肤是非金属。Smoothness Map: 赋予粗糙度贴图并将滑块调整到一个较低的平均值如0.2。皮肤整体是粗糙的但通过贴图让鼻头、额头等区域更亮更光滑。模拟次表面散射关键步骤在材质面板的Advanced Options下找到Transmission透射相关选项URP版本不同位置可能略有差异。启用它。Transmission Color: 设置为暗红色如 RGB: 80, 10, 10。这模拟了光线穿透皮肤后被血液吸收再散射出来的颜色。Transmission Mask: 赋予之前准备的SSS遮罩贴图。这样透射效果只会出现在贴图标白的区域如耳廓强度也由贴图控制。细节增强Normal Map: 赋予法线贴图强度Scale设置为0.5 - 0.8。过强的法线会让皮肤看起来像皮革适中的强度可以增加毛孔和细纹的质感。Occlusion Map: 赋予AO贴图强度设为1。这会让眼窝、鼻下、嘴唇缝等结构深处自然变暗增强立体感。原理与技巧 这个案例的核心是“欺骗”眼睛。真实的SSS计算昂贵我们通过Transmission这个简化模型来近似。当光线从背面或侧面照射皮肤较薄的区域时Transmission Color会使得这些区域泛出红光模拟出“透光”感。Smoothness Map的使用至关重要统一的平滑度会让皮肤像塑料或蜡像。你需要一张好的贴图来区分皮肤不同部位的油脂分泌情况。注意事项皮肤材质的Base Color贴图绝对不能包含阴影或高光它必须是纯粹的、均匀光照下的肤色。所有光影细节都应交给Normal Map、Smoothness Map和光照本身来计算。这也是PBR工作流的基本要求。5. 实战案例三布料材质——丝绸与粗麻布布料材质范围极广从光滑如镜的丝绸到粗糙的粗麻布主要区别在于表面的微观结构。我们将用同一组基础贴图通过调整参数来创造两种截然不同的布料。目标用同一张编织纹理贴图创建丝绸和粗麻布两种材质。操作步骤准备贴图一张编织图案的Base Color贴图一张对应的Normal Map模拟编织物的凹凸。创建两个材质均使用LitShader。丝绸材质设置Base Map: 赋予编织纹理贴图颜色可以鲜艳一些如亮紫色。Metallic: 设置为0。丝绸是非金属。Smoothness: 设置为0.85 - 0.95。极高的光滑度是丝绸的特征它会产生锐利、移动的高光称为“丝光”。Normal Map: 赋予法线贴图但强度Scale设置为0.1 - 0.3。丝绸表面虽然光滑但仍有细微的编织纹理需要非常微弱的法线来体现强度过大会破坏光滑感。粗麻布材质设置Base Map: 使用同一张贴图但Base Color调成灰褐色降低饱和度。Metallic: 设置为0。Smoothness: 设置为0.1 - 0.2。极低的平滑度意味着表面非常粗糙高光几乎完全扩散看不到清晰的光点。Normal Map: 赋予同一张法线贴图强度Scale设置为1.0甚至更高如1.2。强调粗糙的编织纹理。可选使用Height Map如果有效果更强的视差贴图可以启用并赋予Occlusion值设为约0.05能产生更强的凹凸立体感。对比分析 将两个材质球放在旋转的灯光下观察。丝绸材质的高光会是一个快速移动的、明亮的光斑随着视角变化而闪烁。粗麻布则几乎没有明显的高光点整体呈现哑光质感法线贴图带来的凹凸感非常显著。这个案例生动展示了Smoothness和Normal Scale两个参数如何协同工作定义表面的微观几何感受。常见问题为什么我的丝绸看起来像塑料区别在于高光的“质感”。塑料的高光更“硬”而丝绸的高光带有一种柔软的“流动感”。除了Smoothness极高外可以尝试轻微降低Specular强度如果Shader有此选项或者依赖更复杂的环境反射一张好的HDR环境贴图来提供丰富的高光细节而不是单纯一个点光源的亮斑。6. 实战案例四环境交互材质——潮湿的地面这个案例我们将模拟一种动态的、与环境交互的材质效果雨后潮湿的地面。核心思路是混合两种不同的表面属性干燥的石板低Smoothness和积水区域高Smoothness 高反射。目标创建一个石板地面材质并模拟其表面局部积水、反光的效果。操作步骤准备贴图Base Color: 干燥石板的颜色/纹理贴图。Normal Map: 石板表面的凹凸贴图。Mask Map(或分别的Metallic/Smoothness贴图)这是一张RGBA贴图其中R通道用于MetallicA通道用于Smoothness。我们将用它来定义哪里是积水区白色高Smoothness哪里是干燥区黑色低Smoothness。创建材质使用LitShader。基础表面设置Base Map和Normal Map分别赋予对应贴图。Metallic: 保持为0。石板和水都是非金属水的反射是无色的。关键使用遮罩贴图控制光滑度在Smoothness参数处将来源从“滑块”切换到“贴图Alpha通道”。将准备好的Mask Map贴图拖入Metallic/Smoothness的贴图槽。现在Smoothness滑块将变成一个“乘数”。将滑块设为0.8。这意味着贴图Alpha通道中白色的区域积水其Smoothness为 0.8 * 1.0 0.8非常光滑黑色的区域干燥石板其Smoothness为 0.8 * 0.0 0非常粗糙。增强效果为了让积水区域更有“水”的感觉我们可以稍微提高这些区域的Specular强度如果Shader暴露此参数或者更简单的方法——使用Height Map模拟水膜的厚度。将同一张Mask Map的Alpha通道也连接到Height Map可能需要复制一张贴图或使用Shader Graph实现更精确的混合。设置一个很小的Occlusion值如0.02。这样在积水区域会因视差效果产生轻微的“凹陷”或“覆盖”感视觉上更像一层水膜覆盖在石板上。实现原理 这个案例展示了如何突破单一滑块的限制通过一张贴图来空间化地控制材质属性。Mask贴图像一个模具告诉Shader在模型表面的不同区域应用不同的物理属性值。这是制作复杂、写实材质的关键技术。你可以用同样的思路制作生锈金属锈迹部分Metallic0 Smoothness低干净部分Metallic1 Smoothness高、脏污墙面等任何表面属性不均匀的物体。实操心得制作Mask贴图时在Photoshop等软件中可以用笔刷手动绘制积水区域。注意边缘的过渡纯黑到纯白的硬边会显得不自然。使用柔边笔刷或者添加一些噪点让过渡区域灰度有变化这样渲染出来的干湿交界会更柔和、更真实。此外积水的形状应遵循物理规律聚集在低洼处、脚印里、石板缝隙中。7. 实战案例五风格化材质——卡通渲染Toon材质我们将跳出写实范畴探索如何用Lit Shader的基础参数来实现非真实感渲染NPR特别是卡通渲染风格。卡通材质的核心特征是色块化和硬边高光。目标创建一个带有硬边高光和阶梯状漫反射的卡通风格材质。操作步骤 URP的Lit Shader本身是PBR的要实现完美的卡通需要自定义Shader。但我们可以通过极限化参数和结合后处理近似实现核心效果。创建基础卡通色创建一个新材质使用LitShader。Base Color: 选择一个纯色。Metallic: 设为0。Smoothness: 设为1.0。极高的光滑度会产生一个非常小、非常锐利的高光点这接近卡通中的“星形高光”。实现硬边光影关键步骤仅靠材质无法改变光影的平滑过渡。我们需要借助灯光和渲染设置。在URP Asset中找到Lighting设置下的Additional Lights将其Per Pixel模式改为Per Vertex如果支持。这会让附加光的光照计算在顶点级别进行产生棱角分明的光影但效果有限且影响主光。更主流和有效的方法是使用后处理Post-Processing为相机添加Volume组件并添加一个Color Grading覆盖。将Tonemapping模式改为Neutral然后大幅降低Contrast并提高Post-exposure这会让中间调变灰但能突出明暗交界。更专业的做法是使用自定义的屏幕空间后处理Shader或Toon ShadingAsset来实现边缘光和色阶化。模拟卡通高光虽然Smoothness1能产生锐利高光但形状还是圆点。我们可以通过一张特殊的高光遮罩贴图Specular Map来塑造高光形状。制作一张黑白贴图白色区域是你想要出现高光的形状如一个星星、一条横线。在材质中将这张贴图连接到Specular的贴图槽或通过Shader Graph的Multiply节点与Smoothness结合。这样高光就只会在你定义的形状内出现且边缘锐利。使用Shader Graph实现进阶对于真正的卡通材质建议使用Shader Graph。核心节点是Step或Posterize。Step节点将平滑的光照强度如Dot ProductofNormalandLight Direction输入Step通过调整Edge阈值输出0或1实现绝对的明暗二分。Posterize节点将光照强度输入Posterize设置Levels为3或4输出阶梯状的强度值实现多阶色块的卡通效果。将处理后的结果输出给Base Color即可得到色块化漫反射。高光部分同样可以用Step节点处理Specular强度来实现硬边。风格化参数思维 这个案例的意义在于打破PBR参数的“物理”束缚。在风格化渲染中Smoothness可以不再是物理粗糙度而是“高光集中度”Normal Map可以不再是模拟真实凹凸而是用来创造风格化的轮廓变形。理解每个参数最终影响的视觉通道颜色、亮度、对比度、边缘你就能灵活运用它们来实现各种艺术目标而不仅仅是物理模拟。注意事项用标准Lit Shader hack出的卡通效果有很大局限性尤其是光影的硬边。对于正式的风格化项目投入时间学习Shader Graph或使用成熟的卡通Shader Asset是更高效、效果更好的选择。本案例主要是为了开拓思路理解参数的本质是控制视觉输出而非必须遵守物理定律。8. 参数联动与性能考量调优材质时参数之间往往相互影响同时我们也需要关注性能。8.1 参数间的相互影响Metallic 与 Base Color当Metallic为1时Base Color的含义从“漫反射颜色”变为“反射颜色”。一个金色的金属其Base Color应该是暗金色而非亮黄色因为它的“亮”来自于反射环境光而非自身发光。调整金属材质时应在一个具有丰富信息的HDR环境好的Skybox下进行。Smoothness 与 反射高Smoothness不仅产生锐利高光也使得屏幕空间反射SSR或反射探针Reflection Probe的效果更清晰。低Smoothness则会让反射变得模糊甚至不可见。如果你的场景依赖反射来表现材质如光滑地板、汽车漆务必保证Smoothness值足够高并且配置好反射源。Normal Map 与 Smoothness强烈的法线凹凸高Normal Scale实际上会在微观上影响表面的粗糙度。即使Smoothness设置得很高一个凹凸剧烈的表面在宏观上看也不会像镜子一样光滑。因此在调整了法线强度后可能需要微调Smoothness以达到理想的整体观感。8.2 性能优化指南材质复杂度直接影响渲染开销。以下是一些优化原则贴图分辨率与压缩在保证视觉质量的前提下使用尽可能低的贴图分辨率。对于手机等移动平台1024x1024或512x512通常是上限。务必为贴图选择正确的压缩格式Base Map: ASTC 或 ETC2 (sRGB)。Normal Map: BC5/DXT5nm 或 ASTC/ETC2 (Normal map quality)。Mask Map(Roughness/Metallic/AO): BC7 或 ASTC/ETC2 (Linear)。贴图通道合并尽可能合并贴图。最经典的做法是将MetallicR、OcclusionG、Detail MaskB、SmoothnessA打包到一张贴图的四个通道中即一张Mask Map贴图代替四张单独的灰度图能大幅减少纹理采样次数和内存占用。慎用 Height Map (Parallax Mapping)视差贴图效果虽好但像素着色器开销较大。在移动平台或低端PC上除非必要否则优先使用Normal Map。如果使用尽量降低Occlusion值和采样距离。减少透明材质透明Transparent渲染队列特别是Alpha Blend会严重打乱GPU的渲染顺序导致Overdraw过度绘制是性能杀手。对于树叶、栏杆等优先使用Alpha ClippingCutout它虽然边缘有锯齿但性能好得多。对于软边缘可以考虑使用Dithering抖动技术来模拟透明。利用材质变体Material Variants如果一个材质球只有颜色等少数属性不同不要复制整个材质球。可以创建材质变体右键材质 - Create - Material Variant变体继承父材质的所有属性和贴图但允许你覆盖其中几项。这有利于合批Batching提升渲染效率。9. 常见问题排查与调试技巧即使理解了原理实操中还是会遇到各种问题。这里记录一些高频问题和我的排查经验。9.1 材质看起来“不对”或“很平”检查光照和环境PBR材质极度依赖光照。确保场景中有足够强度和质量的光源Directional Light, 烘焙光照。检查天空盒Skybox Material一个纯色或简单的渐变天空盒无法为金属等反射材质提供足够的环境信息替换为HDR环境贴图立竿见影。检查贴图色彩空间Base Map必须是sRGB而Normal Map、Mask Map、Height Map必须是Linear非sRGB。在Unity导入设置中确认。如果Normal Map被错误地当成sRGB颜色会变亮导致法线信息错误凹凸感全无。检查法线贴图类型在法线贴图的导入设置中Texture Type必须设置为Normal map并勾选Create from Grayscale如果是灰度高度图转换而来。这样Unity才会在导入时进行正确的解码和压缩。9.2 高光过曝或消失过曝检查主光源的强度Intensity是否过高。在PBR中光源强度应基于物理单位如勒克斯。尝试将Directional Light的强度降到0.5-1.5范围内看看。同时检查相机的Post-processing中是否开启了Bloom过强的Bloom阈值Threshold过低或强度Intensity过高也会导致高光区域“融化”成一片白色。消失首先确认Smoothness值是否大于0。其次检查光源角度高光出现在法线朝向与“视线方向-光线方向半角向量”一致的区域移动光源或物体角度寻找高光。对于金属确保Metallic为1并且环境中有可反射的内容反射探针或天空盒。9.3 性能突然下降使用Frame DebuggerWindow - Analysis - Frame Debugger。逐帧查看Draw Call数量。如果某个材质出现后Draw Call激增可能是由于该材质使用了Transparent渲染类型或者其Shader导致无法与其他物体合批。检查纹理分辨率在Profiler中查看纹理内存占用。过大的纹理如4K贴图用于一个小物件是常见的内存和带宽浪费。检查实时灯光数量每个额外的逐像素光源都会增加渲染开销。尽可能将静态物体的光照烘焙到光照贴图Lightmap中减少实时光源。9.4 移动平台上的材质问题支持检查确保使用的Shader特性在目标移动平台上被支持。例如某些复杂的Height Map或Detail Normal可能在低端GLES2设备上不被支持。在Player Settings中设置正确的图形API和Shader兼容性级别。精度问题移动GPU的浮点精度通常是mediump低于PC。这可能导致法线计算、特别是视差映射出现精度误差产生闪烁或条纹。在Shader中对于关键计算如法线变换使用precision highp float声明高精度。发热与耗电复杂的片元着色器尤其是多重纹理采样和复杂光照计算是GPU的主要负担。优化策略包括减少纹理采样次数合并贴图简化光照模型对远处物体使用Simple Lit代替Lit使用LODLevel of Detail系统在远处使用更简单的材质或模型。调优材质是一个反复观察、分析、调整的过程。最有效的工具就是你的眼睛和场景视图。养成一个好习惯在调整参数时频繁地从不同角度、不同光照条件下观察物体并与其他参考物体或现实照片进行对比。记住这些参数背后的物理和视觉逻辑你就能从无休止的试错中解放出来真正高效地创造出心中所想的材质世界。