前段时间我在整理一个 UE5 项目里的材质资产时,发现了一个很常见的现象:项目里已经有不少材质了,但每个材质的命名习惯都不一样,有的直接在贴图颜色里塞了光照信息,有的金属度肉眼一看就不合格,有的材质看起来在单独文件里很正常,一放进主场景就开始发灰或过曝。
如果把项目慢慢做大,这种问题根本不是“调一下节点”能解决的。它背后其实是一条工作流的问题:从 PBR 贴图规范、UE5 材质节点逻辑,到性能检查、批量复用、长期维护,每一环都会影响最终效果。
这篇内容我把“UE5 材质制作”这件事拆成几个关键问题来聊。核心判断是:学懂单个节点不是重点,建立起一套从 PBR 参数理解到材质工程化维护的工作流,才是 UE5 材质制作真正值得投入的地方。
1. 先搞清楚 UE5 材质真正解决的是哪类问题
很多刚接触 UE5 的人会把材质理解为“给模型贴一层颜色”。这个理解在方向上没错,但容易在真正上手时栽跟头:明明是同一张贴图,为什么换一个光照环境就成了另一个样子?为什么金属度给到 0.5,物体看起来反而会失真?
1.1 PBR 不是一种贴图格式,而是一套光照约定
PBR 的全称是 Physically Based Rendering,也就是基于物理的渲染。它并不是某个软件特有的功能,而是一套大家共同遵守的渲染约定。
在 UE5 的默认 Lit 光照模型里,最关键的是这几个输入参数:
- BaseColor:基础颜色,也就是物体本身不带光照信息的颜色。
- Metallic:金属度,表示这个表面是金属还是非金属。
- Roughness:粗糙度,表示表面光顺程度,越接近 0 越光滑,越接近 1 越粗糙。
- Normal:法线贴图,用来在低模型上表达更多表面细节。
- Ambient Occlusion:环境光遮蔽,用来表达物体缝隙、接触处的暗部细节。
这套参数之所以好用,是因为它们和真实世界的光照行为对应得比较直接。金属会反射环境光,并且基本没有漫反射;非金属则刚好相反。粗糙度决定反射模糊程度。如果把这些参数乱给,光照引擎再强也救不回来。
1.2 UE5 默认光照模型为什么选定 Metallic / Roughness 工作流
过去在游戏开发里还有另一套 Speclar / Glossiness 工作流,它也能做 PBR,但 UE5 默认采用 Metallic / Roughness,这会直接影响你从建模软件导出贴图、在 Substance Painter 里设置输出模板、以及后续导入 UE5 时的通道分配逻辑。
Metallic / Roughness 工作流的优点是通道边界比较清晰。BaseColor 只负责底色,Metallic 只负责金属性,Roughness 只负责粗糙度。每个通道各司其职,不容易出现“为了光滑效果,把金属度也拖动”这种互相污染的情况。
在实际制作时,如果你是从 Substance Painter 这类工具导出贴图,可以优先选择基于 Unreal Engine 预设的导出模板。不同软件对金属度是否使用sRGB、法线贴图是否需要Flatten等设置会有差异,导入前先确认导出预设,比进 UE5 后疯狂调节点有效得多。
1.3 新手最容易误解的地方:材质不是“画一层颜色”
一个很典型的误区是,把高光、阴影、甚至环境反射直接画到 BaseColor 贴图里。这样做在固定光照下可能看着还行,但一旦灯光变化、物体旋转、场景换到室外或室内环境,效果就会显著变差。
正确理解是:UE5 材质是一套“输入参数 + 光照计算”的组合方案。你要提供的是“材质本身的属性”,而不是“最终画面里的颜色”。阴影和反射交给引擎计算,你负责把物理属性给准确。
这也是为什么很多 PBR 工作流会反复强调要“解包”贴图:如果你拿到的是一张已经在其他渲染器里“渲染过”的图,当成 BaseColor 直接用,结果通常是不对的。必须先搞清楚这张图里到底存了什么信息。
2. 从零搭一条最小可用 PBR 材质工作流
想理解 UE5 材质工作流,不能光看理论,必须要有一条能跑通的最小路径。这里我以做一个简单的混凝土墙材质为例,把从贴图资源到材质实例的过程拆开。
2.1 先规范贴图资源:命名和通道比什么都重要
在进 UE5 之前,先确认你手上的贴图资源长什么样。没有贴图时也可以直接用 UE5 内置的 Basic Shapes 材质节点,但要有自己的资产,还是建议先建立一套命名规范。
我常用的贴图后缀规范如下:
| 通道 | 后缀 | SRGB 设置 |
|---|---|---|
| BaseColor | _BC或_D | 需要 sRGB |
| Metallic | _M | 不需要 sRGB |
| Roughness | _R | 不需要 sRGB |
| Normal | _N | 不需要 sRGB,且需设置压缩格式 |
| Ambient Occlusion | _AO | 不需要 sRGB |
| Opacity | _Opacity或_A | 不需要 sRGB |
只要项目里所有人都遵守这套规范,后续在内容浏览器里查找和替换资源都会省很多时间。这也算是最早建立的“工作流”。
2.2 最小节点连接方式:先不要急着加各种高级表达式
新建一个 Material 后,建议先做一个最小连接:
- 拖入
TextureSample节点。 - 选择基础颜色贴图,连接到
BaseColor。 - 再拖入另外三个
TextureSample,分别选择 Metallic、Roughness、Normal 贴图,连接到对应输入。 - 如果需要 AO,再拖入一个
TextureSample连接Ambient Occlusion。
很多学习者会把大量时间花在 LinearInterpolate、Lerp、BlendOverlay 这类节点上,一开始没有必要。先把基础连接跑通,确认贴图导入设置没有问题,再考虑复杂节点结构。
2.3 用材质实例代替独立材质:这是工程习惯,不是可选项
当你确认基础材质没问题后,要做的不是复制一个新材质继续调,而是把可能变化的参数提取出来,创建 Material Instance。
做法是:在基础材质里,把某些参数设置成Parameter。例如把Roughness改成Roughness Param,选中某个常量节点,在 Details 面板里勾选Parameter,设置一个名字,比如Roughness_Amount。保存后,右键这个材质,选择Create Material Instance,之后在实例里就可以独立调整Roughness_Amount的值。
这样做的好处非常实际:如果项目里有 20 面墙,共用同一个基础材质,只需要改实例参数,不需要复制出 20 个独立材质资产。后续如果要统一调整某个效果,改基础材质就够了;如果某一面墙需要单独调,就改它的材质实例。
2.4 最小示例:贴图不用全部就位也能验证
如果没有现成贴图,也可以先做纯节点验证。比如用一个Constant节点控制 BaseColor,再用Constant控制 Roughness 和 Metallic。这种“无贴图”验证能帮助你确认材质本身的理解是否正确:把 Metallic 设为 1、Roughness 设为 0.3,它应该是一个反射很强、看起来像抛过光的金属。如果它不是这个效果,那问题就不在贴图,而在材质逻辑。
3. 为什么单次调通不等于能稳定用进整个项目
单独把一块墙面的材质调好,难度不高。真正考验人的是:当项目里出现上百个材质、多个场景交替、角色和道具混用,材质数量和复杂度会迅速膨胀,这时很多问题会从“看起来不好看”变成“编辑器卡死”“纹理全糊”“报错一大片”。
3.1 指令数、采样器数量会先于效果给出警告
UE5 的材质编辑器窗口右下角有一个三角感叹号提示,鼠标悬停时会显示该材质的复杂度预估。常看的两个指标是:
- Instruction Count:指令数。超过某个阈值,例如 300 左右就要开始警惕。
- Texture Sample Count:纹理采样数。每个材质有采样器上限,移动端尤其明显。
这不意味着每个材质都必须低于某个固定数值。粒子特效、角色皮肤、场景大件,预算本来就不同。但一个普通静态物体材质如果指令数过高,会在光照、阴影、后处理叠加后变成明显的性能问题,尤其是同屏大量对象同时出现时。
3.2 纹理流送池导致的材质变糊,经常和材质本身无关
如果你发现场景里有些材质贴图一开始清晰,过几秒变模糊,或者在各个角度浏览时表面纹理突然降级,大概率不是材质节点的问题,而是纹理流送池工作异常。
UE5 的纹理流送机制会根据视距和内存加载不同 Mip 级别。当项目贴图数量太大,流送池不够时,就会强制使用低分辨率 Mip。
排查时可以执行:
r.Streaming.PoolSize=1024这个命令可以把流送池大小临时调整到 1024MB,观察画面是否恢复清晰。如果恢复,说明项目需要提升池大小,或者需要检查是否有超大贴图被不合理导入。
3.3 移动端和桌面端,材质写法的容忍度完全不同
一套材质如果你只打算跑 PC,某些节点组合可能没有任何问题。但如果目标平台包含移动端,就需要提前考虑:
- Overlay 混合模式数量不能太多。
- 法线贴图采样数量要克制。
- 尽量少用较复杂的 Custom 表达式。
- 材质实例参数越多,跨平台兼容性越需要测试。
UE5 编辑器里可以在预览窗口右上角切换平台预览,选择 Android 或 iOS 来查看材质复杂度变化。这个切换很快,但很多人会忽略。
3.4 排查材质相关问题的顺序:不要先怀疑“材质节点”
当材质出现异常时,按这个顺序排查会更快:
- 先看模型:UV 是否展开,模型本身有没有重面。
- 再看导入设置:贴图压缩格式、sRGB、法线导入选项是否正确。
- 再看材质连接:通道是否接错,参数是否被实例意外覆盖。
- 再看光照:是否没有 Lightmass Importance Volume,或者场景光照贴图分辨率过低。
- 最后看性能限制:材质确实过于复杂,导致降级或编译失败。
很多人一上来就打开材质编辑器疯狂改节点,很容易越改越乱。其实大多数材质显示问题都出在“输入侧”,而不是“输出侧”。
4. 从“手拉节点”到“模板化工作流”的进阶路径
当你已经能熟练创建材质、材质实例、贴图通道规范后,下一步就不是“多会几个节点”,而是“如何减少重复劳动”。
4.1 用 Material Function 把重复逻辑包起来
UE5 里有一个很适合材质工作流的功能:Material Function,材质函数。
比如你经常要做“边缘磨损”效果,传统做法是在每个材质里复制一组相同的节点连线。后来你发现磨损逻辑有调整,比如增加一个 mask 参数,你就要去每一个材质里手动改,项目越大越痛苦。
更合理的做法是把“边缘磨损”逻辑封装成一个 Material Function。输入端可以是 World Position、Object Radius、Wear Amount,输出端是一个 float 或者向量。之后在任意材质里只需要调用这个函数,就像调用一个内置表达式一样。
Material Function 能真正帮你把“制作手法的经验”沉淀成“项目里的公共资产”。这是一个从个人技术到团队规范的转折点。
4.2 用 Material Layer 表达多层混合材质
如果想要在一个材质里同时表现泥土、苔藓、破损混凝土,传统的做法是准备多套贴图,然后用 Vertex Color 或高度混合来做 mask。当混合层数变多,节点会变得非常庞大。
UE5 的 Material Layer 可以把你对每一层材质的理解独立成一个文件,再通过 Material Layer Blend 把它们组合起来。以后修改其中一层不用动整个主材质,只需要调整该层的参数即可。
不过这类功能对项目规范要求很高。如果团队里还没有统一命名和目录规则,盲目使用 Material Layer 也可能造成组织混乱。建议从两到三层小范围试点开始,不要一上来就把所有材质都改造成 Layer。
4.3 批量创建和修改材质时的工程化思路
当资产数量超过一定规模,手动点击右键创建材质、拖入贴图、重命名,是很难保证效率的。
UE5 的 Editor Utility Script 可以帮你做一些批量操作。例如:
- 读取某个目录下的贴图资源。
- 根据命名规则自动创建基础材质。
- 自动把贴图通道连接到对应输入。
- 自动创建材质实例并设置默认参数。
但这里有一个很现实的建议:先验证你的命名规则足够稳定,再写自动化脚本。如果贴图命名本身乱七八糟,脚本只会把错误批量扩大,反而制造更多问题。
4.4 什么时候该写脚本,什么时候继续手动拉节点
判断标准可以很简单:
- 需要处理的数量是否超过 50 个?
- 操作步骤是否重复且无需人为审美判断?
- 规则是否稳定,三个月内不会大改?
三个条件都满足,才值得花时间写脚本。如果只是偶尔处理 3 到 5 个材质,手动完成更快。脚本和自动化不是“显得专业”的装饰,而是被重复性痛点逼出来的解决方案。
5. 一个可复用的 PBR 材质工作流自查与排查框架
前面聊了很多工具和理念,真正落到日常制作中,还需要一个可以反复使用的判断框架。我一般把这个框架叫“PBR 输入到输出四层检查法”。
5.1 第一层:输入的贴图通道是否符合 PBR 约定
检查顺序:
- BaseColor 是否已经去除烘焙阴影。如果一张图带明暗颜色,需要做去光照处理。
- Metallic 是否只有 0 或 1。金属度出现大量中间值时,画面会变得很奇怪,除非有特殊设计意图。
- Roughness 是否变化合理。混凝土墙面粗糙度通常在 0.6 到 0.9,金属钣金通常在 0.2 到 0.5,从材质逻辑上讲,越接近灰阶图的粗糙度越可信。
- Normal 贴图的方向是否符合 UE5 坐标系。法线贴图导入后如果反转,可以用
FlattenNormal或在外侧贴图工具中调整。
5.2 第二层:节点结构是否最小可用
每增加一个 Lerp 或 BlendOverlay,都要问自己:这个操作解决的是材质本身的问题,还是在弥补上一个环节的错误?
比如说,如果你发现 BaseColor 太暗,于是在材质里加一个Multiply节点把颜色提亮,你掩盖的是贴图导出阶段的问题,而不是在正确解决问题。复杂的材质节点网络有时候不是能力强的表现,而是上游问题堆积出来的“补救现场”。
5.3 第三层:材质实例参数是否可预测
创建 Material Instance 之后,要确认暴露的参数名足够直观,并且有合理的取值范围。比如Roughness_Param取值范围 0 到 1,如果你的效果需要 1.5,那就得回过头看基础材质为什么需要小于 0 或者大于 1 的参数。PBR 参数本身是有物理边界的,超出边界不一定错,但至少代表你正在偏离常规渲染逻辑。
5.4 第四层:用 UE5 的可视化模式验证结果
UE5 里有几种和材质强相关的显示模式:
- Lit:最终效果,但容易受环境光照影响。
- Unlit:只显示材质本身颜色,方便检查贴图导入是否正常。
- Shader Complexity:看材质复杂度。
- Buffer Visualization 中的 BaseColor / Metallic / Roughness:直接看 G-Buffer 里存储的数据是否和预期一致。
我自己调试材质时,会经常切到 Unlit 模式先确认贴图方向和压缩设置,再切回 Lit 确认光照下的反射和阴影。如果 BaseColor 在 Unlit 模式下看起来偏灰,不用急,回到贴图源文件检查一遍导入设置。
6. 长期使用 UE5 材质工作流的几条经验
UE5 材质看起来很自由,实际做项目时间越长,越会发现“自由”是需要约束来保障的。给长期使用这套制作流程的人几条经验,也算是对这套工作流的收口判断。
6.1 材质不是越高级越复杂越好,而是越可控越好
你可以用 Custom 节点写一段非常复杂的着色逻辑,也能做出很不错的效果。但一个 Custom 表达式里如果塞了 200 行代码,两三个月后可能连写它的人自己都很难快速修改。材质是给人看的,也是给人维护的,可读性本身就是生产力。
6.2 建立项目级规范,比一个人会多少个节点更重要
无论是贴图命名、材质命名、参数命名、贴图目录结构,还是材质实例数量限制,都值得在项目一开始就写成文档。那些看似“浪费时间”的规范,会在项目进入中期后以更高的效率回报你。
6.3 从材质延伸到整个制作管线,才叫真正的工作流
一个材质效果好不好,不只由材质编辑器决定。模型 UV 利用率会影响贴图分辨率效率;贴图烘焙方式会影响 BaseColor 里是否残留光影;导入设置会决定法线和粗糙度的呈现;光照构建会成为最终的验证环节。
所以,当你觉得材质效果不对的时候,不要只停留在材质编辑器里。把视角抬高一层,沿着“模型 → UV → 贴图 → 导入 → 材质 → 光照 → 性能”这条链路去观察,大多数问题的根源都能找到。
6.4 工具能替代的只是重复,不能替代的是判断
自动化脚本、材质函数、材质模板能帮你省掉重复劳动,但有一个环节它们替代不了:当你需要判断一个材质在既定光照氛围下是否够真实、好看、符合项目美术方向时,最后还是需要人的感受和审美。
这恰恰也是做材质工作流最有意思的地方:把确定性的部分交给工具和规范,把不确定性的部分留给经验和判断。真正成熟的制作流程,不会消灭人的作用,而是把人从低价值的重复劳动里解放出来,让你把更多时间花在值得思考的效果上。
如果你现在刚开始接触 UE5 材质,最应该做的不是先去学一堆高级表达式,而是先把你手头最常见的三种材质做扎实:一个非金属粗糙表面、一个光滑金属表面、一个混合材质表面。把这三个基础材质从贴图导入到实例化再到场景验证跑通,你对 UE5 材质工作流的理解,会比只看教程快很多。