
做 UE5 材质绕不开 PBR。无论你是做场景、角色还是道具材质工作流都是从 PBR 基础开始再逐步走向高级材质节点、材质实例和工程化资产管理。很多初学者会把“材质”等同于“贴图”实际上在 UE5 中材质由 Material Editor 里的节点网络驱动贴图只是输入数据。要得到正确的金属、非金属、粗糙表面和法线细节必须先理解每个 PBR 参数的含义再把这些参数通过合适的节点接到材质结果上。这里是《UE5 材质大师班从 PBR 基础到高级材质制作工作流》的上篇目标是用一条主线把基础材质制作流程走通先建立 PBR 概念再熟悉材质编辑器然后完成从贴图导入到材质实例创建的标准工作流最后给出生产环境常用的排查方法和检查清单。1. 为什么做 UE5 材质必须先理解 PBR 参数1.1 从传统 Diffuse 工作流到 PBR 工作流在旧式渲染流程里常见的做法是把 Diffuse、Specular、Bump 三张贴图直接叠到模型上。它的问题在于不同引擎对高光计算公式、贴图颜色空间和环境反射的实现方式并不一致同一个模型在 A 引擎里正常换到 B 引擎里就会明显偏亮或发灰。美术为了适配不同平台往往要手动调整多套贴图工作量大效果还不稳定。PBR 是“基于物理的渲染”它把表面表现抽象成几个物理含义明确的参数基础颜色、金属度、粗糙度、法线方向、自发光等。只要这些参数输入正确引擎就能根据真实光线行为计算反射、漫反射和阴影效果在不同光照环境下都能保持稳定。UE5 默认光照模型基本也是沿这套思路所以做材质之前先理解 PBR 参数比单纯学习节点操作更重要。1.2 五个关键 PBR 参数的含义与常见误用材质节点网络里最重要的内容是给结果节点提供正确的输入。如果连参数含义都理解错了后面的节点组合再复杂最终效果也是错的。参数作用常见范围常见误用BaseColor表面基础颜色0 到 1直接把渲染图贴进去或把 AO 乘进 BaseColorMetallic是否为金属0 非金属1 金属只给 0 或 1忽略锈蚀、磨损等过渡区域Roughness表面粗糙程度0 光滑1 粗糙粗糙度贴图的 sRGB 没关导致高光范围异常Specular非金属高光强度默认 0.5大多数材质不需要改误改会让整体泛白Normal法线扰动方向向量贴图把法线贴图当普通贴图接到其他引脚BaseColor 是材质本身的颜色信息不应该包含光照和阴影。金属材质和普通材质在这里的区别很大金属的 BaseColor 更接近“反射颜色”非金属的 BaseColor 更接近“漫反射颜色”。如果直接拿一张带 AO 的渲染图当 BaseColor在动态光照下就会出现阴影叠加、曝光不正确的问题。Metallic 和 Roughness 都不是颜色贴图它们属于线性数据。实际项目里常把 Metallic、Roughness、AO、Height 打包到一张贴图的 RGBA 通道里但导入引擎后必须关闭 sRGB否则数值会被错误转换材质效果会明显偏离预期。Normal 是向量数据不是普通颜色。它在材质编辑器里要接到 Normal 引脚贴图资产本身也要设置为法线贴图压缩格式。很多材质发黑、光影扭曲的问题都是因为法线贴图被当成了普通颜色贴图。1.3 Shading Model 与 Default Lit 的选择UE5 材质细节面板里有 Shading Model 选项常规材质选择 Default Lit 即可。这个模式支持 BaseColor、Metallic、Roughness、Normal、Emissive 等 PBR 输入适合绝大多数场景和角色材质。如果选择 Unlit材质将不再响应场景光照只显示节点输出的颜色。它适合自发光屏幕、特效粒子、全息投影一类效果但不适合做普通物体表面。Subsurface、ClearCoat、Cloth、Eye 等模型则分别适合皮肤、车辆清漆、布料、眼球等特殊材质它们的输入引脚会有差异使用前要先确认是否需要这些物理特性。不要为了“看起来更好看”随意切换 Shading Model。不同模式对输入的要求不同Shader 复杂度和性能也会变化。在普通材质上使用 Subsurface 而不提供 SubsurfaceColor效果反而会比 Default Lit 更奇怪。2. UE5 材质编辑器节点链路、混合模式和着色模型是基础2.1 最小的材质链路常量到结果节点UE5 材质编辑器里的流程是“从输入节点到输出节点”。无论中间有多少节点最终都要接到 Material Result 节点的各个引脚上。第一次打开材质编辑器时可以先建立一条最简单链路Constant 节点BaseColor 灰色 ------ 材质结果节点 BaseColor 引脚 Constant 节点Roughness 0.5 ------ 材质结果节点 Roughness 引脚 Constant 节点Metallic 0 ------ 材质结果节点 Metallic 引脚这三个常量组合起来就是一个灰色、不导电、中等粗糙度的基础材质。把它拖到场景物体上可以看到物体受到灯光照射后产生漫反射和模糊高光。这个最小链路的意义是验证“节点网络正确驱动材质结果”这条路径。如果连最基础的常量材质都不亮问题往往不在材质节点而在灯光、模型 UV 或材质 Shading Model 设置。2.2 高频节点和参数节点的区别材质节点数量很多但 PBR 材质制作里最常用的是下面几类节点类型用途连接示例Constant固定数值灰度为 0.5 的 RoughnessScalarParameter可实例覆盖的数值给材质实例控制粗糙度VectorParameter可实例覆盖的颜色/向量给材质实例控制 BaseColor 颜色TextureSampleParameter2D可实例覆盖的贴图采样 BaseColor 贴图Multiply相乘两个纹理值叠加Lerp两路输入线性插值用顶点色混合两种材质Fresnel边缘光效果连接自发光或透明度关键区别是常量节点不能通过材质实例覆盖而 ScalarParameter、VectorParameter、TextureSampleParameter2D 是参数节点创建材质实例后可以直接调整。如果希望材质在多个物体上有不同颜色或者蓝图运行时要动态改参数就必须使用参数节点而不是在节点网络里写死常量。2.3 Material Domain、Blend Mode、Shading Model 怎么组合材质细节面板里最容易混淆的三个选项是 Material Domain、Blend Mode 和 Shading Model。Material Domain 决定材质用在哪个渲染阶段。普通场景物体通常选 Surface后处理材质选 PostProcessUI 材质选 User Interface。选错域会导致节点引脚完全不同。Blend Mode 决定物体怎样与背景混合。Opaque 完全不透明Masked 通过遮罩裁剪像素Translucent 支持半透明混合Additive 做发光叠加。Blend Mode 选错时材质不显示或者透明排序错误是常见现象。物体类型Material DomainBlend ModeShading Model普通墙面SurfaceOpaqueDefault Lit铁丝网、叶片SurfaceMaskedDefault Lit玻璃SurfaceTranslucentDefault Lit发光屏幕SurfaceOpaque 或 UnlitUnlit角色皮肤SurfaceOpaqueDefault Lit 或 Subsurface选择组合时先想清楚物体最终接受的灯光类型。例如半透明材质如果要真实反射和折射需要额外处理 Refraction 引脚和反射捕获如果只是做一个淡入淡出的物体Translucent 加 Opacity 就能跑通。2.4 先理解引脚再记快捷键材质编辑器左侧有很多输出引脚包括 BaseColor、Metallic、Roughness、Normal、Opacity、Opacity Mask、Emissive、World Position Offset 等。每个引脚都有明确语义。建议先把引脚含义和数据类型记住再去记右键添加节点的快捷键。在材质图表中右键输入节点名称可以快速查找节点例如输入TextureSample、ScalarParameter、Lerp。节点名称大小写不敏感但拼写必须正确。材质保存后节点网络会参与编译如果出现红色警告通常是因为节点类型与引脚类型不匹配或者某个输入没有合法连接。3. 从贴图到材质实例一套标准 PBR 工作流3.1 贴图准备命名、通道打包和色彩空间进入 UE5 之前贴图资产就应该有清晰命名。项目里常见的命名规范是T_材质名_通道例如T_Brick_BaseColor T_Brick_Roughness T_Brick_Metallic T_Brick_Normal通道打包也是成熟项目常用的做法。因为 Metallic、Roughness、AO、Height 都是灰度或线性数据可以合到一张贴图的 RGBA 通道减少纹理采样次数。比如 R 通道放 RoughnessG 通道放 MetallicB 通道放 AOA 通道放 Height。这样在材质节点里通过 ComponentMask 或 SeparateChannel 节点取出对应通道即可。通道打包时要注意打包出的贴图是线性数据导入 UE5 后 sRGB 必须关闭。如果一套资源只有 BaseColor 是 sRGB其余数据贴图都是线性那么就要在导入阶段分开设置。3.2 导入 UE5 的纹理设置在内容浏览器中导入贴图后纹理资产会在双击后看到压缩设置。不同通道的推荐设置如下贴图通道压缩设置sRGB说明BaseColor默认颜色压缩开启颜色信息允许人眼感知Metallic灰度或 RGBA 通道打包关闭线性数据Roughness灰度或 RGBA 通道打包关闭线性数据AO灰度或 RGBA 通道打包关闭线性数据NormalNormalmap 压缩关闭向量数据这张表是整个 PBR 工作流最容易出错的地方。很多人材质发灰、高光奇怪不是节点连错而是纹理 sRGB 设置错误。BaseColor 开启 sRGB 后颜色正常Roughness 如果误开 sRGB0.5 的粗糙值会被转换为另一个浮点值高光强度和模糊范围会明显偏亮。法线贴图在 UE5 中需要把压缩设置为 Normalmap。如果项目中的法线贴图来自不同 DCC 工具还要注意绿色通道方向。某些工具导出的法线贴图与 UE5 的坐标方向相反可以在纹理资产设置里调整绿通道翻转或使用FlattenNormal节点处理。3.3 创建材质并连接贴图在内容浏览器里右键选择“材质”命名为M_Brick。打开材质编辑器后按下面顺序连接TextureSampleParameter2D (BaseColor) ------ 结果节点 BaseColor TextureSampleParameter2D (Metallic) ------ 结果节点 Metallic TextureSampleParameter2D (Roughness) ------ 结果节点 Roughness TextureSampleParameter2D (Normal) ------ 结果节点 Normal每个 TextureSampleParameter2D 节点需要指定对应的纹理资产并且节点命名建议与纹理命名一致例如T_Brick_Roughness。Normal 贴图节点还要把 Sampler Type 设置为 Normal否则法线方向无法被正确解析。连接完成后保存材质把材质拖到场景中的模型上。此时如果材质球没有显示预期效果先检查灯光是否足够再检查材质是否有编译错误。如果一切正常材质会随环境光产生自然高光。3.4 参数化并创建材质实例很多团队不会直接用M_Brick材质而是创建MI_Brick_Red、MI_Brick_Dark等材质实例。这样做的原因是材质实例继承父材质不需要复制整套节点网络修改父材质时所有实例同步更新实例调整参数时不需要重新编译材质在运行时更高效。操作步骤是选择材质资产右键选择“创建材质实例”命名为MI_Brick_Red。双击打开材质实例在参数分组里找到父材质中的参数节点。如果某个参数被 ScalarParameter 或 VectorParameter 声明就可以在材质实例中勾选“覆盖”并修改值。因此在父材质阶段就要把需要变化的数值改成参数节点。例如墙面颜色用 VectorParameter粗糙度用 ScalarParameter贴图用 TextureSampleParameter2D后期调用时只需要在材质实例里覆盖参数。3.5 验证材质是否正确预览网格体、光源和场景材质编辑器自带预览面板默认显示一个球体。建议根据材质对象切换预览网格体比如墙面用 Plane 或 Cube角色道具用 Sphere。预览环境尽量包含强光和弱光以便观察粗糙度和金属度变化。验证 PBR 材质是否正确时不要只盯颜色。可以按以下顺序检查金属物体是否有带颜色的反射而不是简单的白色高光。非金属物体的高光是否为白色且粗糙度越高高光范围越大。法线贴图是否让表面光影产生真实起伏而不是“贴图颜色变化”。场景中加入反射捕获或 Lumen 后金属材质是否能看到环境反射。调整材质实例 Roughness 时材质球高光是否同步变化。只有在这些物理效果都合理时材质才算真正跑通。只把贴图接上去看到颜色缺少 PBR 验证并不能算完成。4. 从基础走向高级材质组合、法线叠加和自定义 HLSL4.1 材质组合用 Lerp 和 Vertex Color 做磨损或混合基础 PBR 材质只能表现单一表面而现实物体往往包含多层材质例如墙面开裂、金属边缘生锈、地面有青苔。这时可以使用 Lerp 节点把两套材质混合起来。最简单的混合方式是用顶点色控制。模型在建模软件里把需要暴露磨损区的顶点涂成红色导入 UE5 后材质中使用顶点色节点的 R 通道作为 Lerp 的 AlphaTextureSampleParameter2D (墙面) ------ Lerp A 输入 TextureSampleParameter2D (破损层) ------ Lerp B 输入 VertexColor.R ------------------------ Lerp Alpha 输入 Lerp 输出 ------ 结果节点 BaseColor同样的逻辑也可以控制 Roughness、Metallic 和 Normal。只要保证几套贴图的 UV 一致材质混合就能表现磨损、青苔、污渍等细节。要注意顶点色精度有限边缘过渡可以通过顶点色渐变处理或者把顶点色与噪声贴图相乘让边界更自然。4.2 法线贴图叠加不要直接 Add在做地砖、岩石或角色皮肤时经常需要把大尺度法线和小尺度法线叠加起来。最直接的想法是把两个法线贴图相加但这样会产生方向偏差因为法线是归一化向量直接加法会导致长度和方向都不对。建议使用BlendAngleCorrectedNormals节点把基础法线和细节法线接进去TextureSampleParameter2D (基础法线) ------ BlendAngleCorrectedNormals 纹理采样节点 (细节法线) ------------------- BlendAngleCorrectedNormals BlendAngleCorrectedNormals 输出 ------ 结果节点 Normal如果没有这个节点也可以用Normal Map的Reconstruct Z和向量运算实现但理解成本更高。默认使用引擎封装好的混合节点效果稳定也能避免“法线越叠越平”的问题。4.3 用 Custom 节点写 HLSLUE5 材质编辑器支持自定义节点 Custom可以在节点里写一段 HLSL 代码。它的作用是实现引擎节点没有直接暴露的计算逻辑例如边缘光、特殊渐变或按视角变化的透明度。下面这段代码实现一个简单的边缘发光效果float3 viewDir normalize(CameraVector); float ndv saturate(dot(Normal, viewDir)); return pow(1.0 - ndv, EdgePower) * EdgeColor;使用 Custom 节点时需要把Normal、CameraVector、EdgePower、EdgeColor作为输入变量传入节点否则代码里无法访问这些值。Custom 节点返回类型可以是float3或float。上面代码返回float3适合连接到 BaseColor 或 Emissive。Custom 节点写起来灵活但报错信息往往不那么友好。建议先用简单代码跑通再逐步增加计算。HLSL 中不能随意调用引擎全局函数所有参数都要通过节点输入引脚显式传入。4.4 运行时的动态材质实例材质实例不仅可以在编辑器中调整程序运行时也能通过蓝图动态修改参数。常见用途包括血量变化、颜色切换、隐藏冷却效果等。在蓝图事件中先获取静态网格体组件然后调用Create Dynamic Material Instance节点创建动态材质实例再通过Set Scalar Parameter Value或Set Vector Parameter Value修改参数MeshComponent-CreateDynamicMaterialInstance(0); MeshComponent-SetScalarParameterValueOnMaterials(Roughness, 0.2); MeshComponent-SetVectorParameterValueOnMaterials(TintColor, FLinearColor::Red);这里的关键点是参数名必须和材质里的 ScalarParameter 或 VectorParameter 命名完全一致。如果材质里参数叫Roughness蓝图里写RoughnessValue设置不会生效也不会报错错误排查起来比较隐蔽。4.5 高级工作流思路高级材质工作流不是堆节点而是把常用逻辑沉淀成可复用资产。MF_开头的材质函数可以把边缘磨损、法线混合、顶点色混层、细节贴图增强等逻辑封装起来新材质直接拖入函数节点既节省时间也避免重复写错。材质函数可以接收参数例如磨损强度、边缘阈值、贴图颜色等。把函数放到规范的材质库目录后项目中所有材质都能复用。这也是材质本身之外更重要的工作流资产。5. 常见问题排查发黑、UV 异常、实例不生效、透明排序和性能5.1 材质在预览正常进场景后发黑材质编辑器里看着正常放到场景里却发黑这是新手最常见的现象。原因可能不止一个需要按顺序查。问题现象可能原因检查方式处理建议场景中整体发黑场景缺少光源或间接光照在场景中放置平行光/天空光增加光照或使用默认亮度环境物体局部发黑法线贴图方向错误查看法线贴图是否接到 Normal 引脚确认贴图 Sampler Type 为 Normal材质完全不识别灯光Shading Model 为 Unlit查看材质 Shading Model改为 Default Lit颜色过暗或过亮纹理 sRGB 设置错误查看贴图资产 sRGB 开关BaseColor 开数据贴图关高光溢出Metallic/Roughness 参数异常检查 Metallic/Roughness 贴图确认线性数据没有被 sRGB 处理排错时不要一上来就改节点。先看材质预览是否正常再看场景光照再看纹理资产设置再看节点连接顺序基本不会走偏。5.2 UV 拉伸和贴图方向不对贴图拉伸或扭曲时问题通常不在材质而在模型 UV。打开模型资产查看 UV 编辑界面确认 UV 展开是否在 0 到 1 范围内模型每个区域的 UV 密度是否均匀。材质中的 TextureCoordinate 节点可以调整 Tiling但无法解决模型本身 UV 错误。如果模型在 3D 软件里就没有展好 UV材质里再怎么调都很难救回。项目中使用材质时还要注意不同通道贴图是否使用同一套 UV。如果 BaseColor 用 UV0Normal 用 UV1连接节点后可能出现法线方向与颜色对不上的问题。5.3 材质实例参数不生效材质实例参数不生效时先确认父材质中是否使用了参数节点。常量节点无法在实例中覆盖参数节点还要在实例详情中勾选“覆盖”否则默认跟随父材质。动态材质实例不生效的排查思路参数名是否大小写一致。是否在正确 MeshComponent 上调用。是否先创建了动态材质实例。场景中物体是否被其它材质覆盖。参数节点名是否写错写错时不会报错但值不会变。推荐在父材质中规范参数命名并在材质实例列表中观察参数是否显示。如果参数没有出现在实例面板说明它还是常量节点不是参数节点。5.4 半透明材质不显示或排序错乱半透明材质使用 Translucent Blend Mode需要连接 Opacity 引脚。完全不透明物体不要使用 Translucent因为半透明材质不写入深度渲染排序复杂容易导致交叠物体出现错误透明效果。如果半透明材质没有显示先检查 Opacity 引脚是否连接。Opacity 为 0 时完全透明看不到物体。排序错乱时可以调整物体的Translucency Sort Priority或者将同一类透明物体放在同一排序层。使用 Masked 时要注意Opacity Mask 引脚只接受 0 到 1 的遮罩值边缘会有锯齿。如果希望得到边缘平滑的镂空效果可以结合MaskOpacity和半透明混合但要避免对大面积物体使用否则性能下降明显。5.5 Shader 复杂度和性能材质节点越多Shader 计算指令越多复杂度和性能风险越高。UE5 材质编辑器底部的 Stats 或材质资产详情页会显示指令数和节点数可以作为初步判断依据。性能问题常见原因优化方向节点过多每次材质更新都编译大量逻辑封装材质函数减少重复节点纹理采样过多多张贴图独立采样通道打包采样一次提取多通道Overdraw 高半透明或 Masked 材质过多尽量使用 Opaque减少透明叠加法线运算复杂大量 Blending 和 Custom HLSL控制节点层级使用简化计算生产项目里材质性能不是看一个节点而是看整体场景。材质资产在移动端和 PC 端可以设置不同的质量级别避免高复杂度材质在小设备上直接拉爆性能。6. 生产环境工作流、PBR 检查清单和扩展方向6.1 学习环境与生产环境的差异学习材质时可以随便拖材质到物体上看效果生产项目中则要围绕“可维护、可复用、可排查”建立工作流。两者最大的区别在于约束。阶段关注点典型操作常见问题学习环境快速看到效果直接连节点、拖到模型忽略资源命名和参数规范开发环境功能正确、迭代高效建立材质函数、参数化命名混乱、复用困难生产环境性能、版本、多端适配统一贴图格式、性能预算材质资产无法像代码一样 diff生产环境里材质资产是二进制 UE 资产无法像代码一样逐行比对所以更要做好命名、目录结构和版本管理。一个材质只干一件事参数含义清晰后续别人接手时成本就会低很多。6.2 材质命名、参数规范和材质函数库建议按前缀区分资产类型M_普通材质。MI_材质实例。MF_材质函数。T_纹理。MPC_材质参数集合用于全局统一控制。参数命名尽量使用英文小驼峰并与用途结合例如Roughness_Floor、BaseColor_Tint、NormalIntensity。避免使用Color、Value这类歧义名称。材质函数库存放在统一目录后通过MF_前缀和注释说明输入输出方便团队复用。材质编辑器里的注释节点可以把节点区域标记为“磨损混合”“法线叠加”“边缘光”保存后团队其他成员能更快读懂材质结构。这对维护长节点链路非常有帮助。6.3 PBR 材质检查清单下面这份清单可以直接复制到项目文档中每次制作新材质时逐项确认BaseColor 是否只包含固有色没有混入光照、阴影和 AO。金属材质是否正确设置了 Metallic金属边缘是否有过渡渐变。Roughness 贴图是否关闭 sRGB是否为线性数据。Normal 贴图是否设置为 Normalmap 压缩方向是否与引擎坐标一致。AO 是单独通道或贴图不要直接乘到 BaseColor 上。需要调整的颜色、数值、贴图是否使用了参数节点。材质实例参数命名是否可读是否与父材质一致。Blend Mode 是否正确Opaque、Masked、Translucent 是否按需选择。Shading Model 是否为 Default Lit特殊材质是否确实需要切换。材质复杂度是否在项目性能预算内纹理采样是否过密。材质函数是否已经封装了高频逻辑节点网络是否清晰。预览网格体、光照环境是否已验证在场景中是否仍有色偏。这份清单的价值在于把“我觉得没问题”变成“我可以逐项确认”。排错时按照清单一项项排查能减少大量无目的试错。6.4 扩展方向AI 辅助贴图、PCG 和材质自动化现在的材质制作工作流越来越依赖自动化。PCG程序化内容生成可以结合材质实例生成大量外观变化让场景中的物体不再是复制粘贴。运行时通过蓝图设置材质参数也能实现交互式变色、状态反馈等玩法。AI 辅助贴图工具也被越来越多团队引入前期概念和贴图草稿。使用 AI 生成的贴图时要重点检查接缝、UV 布局、颜色空间和 PBR 通道的物理属性AI 生成的灰度图不一定能直接当作 Metallic 或 Roughness 使用。它更适合作为基础素材经过 DCC 工具清理、通道拆分、统一 UV 后再进入 UE5 生产管线。材质工作流的最终目标不是把节点连得越来越复杂而是让任意一个材质都能快速创建、快速调整、快速排查。把 PBR 参数理解到位把材质实例和材质函数用起来再配合一套稳定的贴图导入规范UE5 材质制作的质量和效率都会明显提升。上篇先把 PBR 参数、材质编辑器和基础工作流讲清楚中心是把“结果正确”落到检查清单上。下一部分再展开多层材质混合、材质烘焙、顶点着色、程序化纹理和性能优化更细节的做法。对 UE5 材质制作者来说最值得投入的不是熟记节点快捷键而是建立一套从贴图设置、材质参数到实例调优的可复用流程然后让这套流程在项目里跑起来。