1. 从一张武士刀疤脸说起:为什么我死磕这套 PBR 纹理流程
做角色纹理这行十来年,我经手的项目从手游低模到影视级高模都有,但真正让我反复回头打磨的,还是 AAA 级别的武士角色。原因很简单——武士这个题材几乎把 PBR 纹理工作流里所有的难点都塞到了一起:多层叠穿的布料、反复锻打的金属甲片、皮革束带、漆器纹样、皮肤上的旧伤疤,还有那种“被雨水和血渍反复浸透”的脏旧感。你只要能把一个武士角色的纹理做透,基本就摸到了 PBR 工作流的天花板。
这篇内容我想聊的,就是用 Substance Painter 走完一套完整的 AAA 武士角色 PBR 纹理流程。核心关键词就三个:Substance Painter、PBR、纹理工作流。我会从整体设计思路讲到具体的图层搭建、材质参数、导出配置,再到实际踩过的坑和排查技巧。适合已经会基本操作、但做出来的东西总感觉“差点意思”的中级选手,也适合想系统梳理一遍 PBR 逻辑的进阶朋友。如果你还在纠结“为什么我的金属看起来像塑料”“为什么布料永远脏得不自然”,那这篇大概率能帮你省下不少试错时间。
先说清楚一件事:PBR 不是某个软件的功能,而是一套基于物理规律描述材质反射行为的着色模型。Substance Painter 只是把这套模型做成了可视化的图层工作台。理解这一点,你才不会把它当成“画贴图的 PS”。我见过太多人把 SP 当 Photoshop 用,一层层往上糊颜色,最后导出才发现金属度、粗糙度全乱套,进引擎一渲染就露馅。所以下面我会先讲思路,再讲操作,顺序不能反。
2. 整体设计与思路拆解:PBR 工作流到底在解决什么问题
2.1 先搞懂 PBR 的底层逻辑,别急着开图层
PBR 全称 Physically Based Rendering,基于物理的渲染。它的核心思想是:用一组符合物理规律的参数来描述材质,让同一套贴图在不同光照环境下都能得到合理的结果。传统手绘贴图靠“画高光、画阴影”来模拟光照,换个环境光就崩了;PBR 则是把材质本身的属性(颜色、粗糙度、金属度、法线)交给引擎,由引擎根据真实光照去计算最终效果。
对武士角色来说,这意味着什么?意味着你不能再靠“感觉”去画一块金属的亮部,而是要老老实实告诉引擎:这块区域是铁,金属度=1,粗糙度大概在 0.3 到 0.5 之间,表面有锻打留下的微观起伏,法线贴图负责表达这些细节。引擎拿到这些数据,自己会算它在阳光下、火光下、雨夜里分别长什么样。
这里必须提一个关键概念:金属度(Metallic)和粗糙度(Roughness)是 PBR 的两根支柱。金属度决定这个材质是导体还是绝缘体,只有 0 和 1 两个合理取值(中间值只用于过渡或特殊效果);粗糙度决定表面微观的平整程度,直接影响高光的锐利度和反射的清晰度。很多人做出来的金属像塑料,八成是因为金属度没给到 1,或者粗糙度给得太低导致高光死板。
提示:PBR 有金属度工作流(Metallic/Roughness)和镜面反射工作流(Specular/Glossiness)两套。现在主流引擎和 Substance 默认都是金属度工作流,本文也以这套为准。别混用,混用必出问题。
2.2 武士角色的材质拆解:先分类,再动手
拿到一个武士角色,我第一件事不是打开 SP,而是在脑子里把角色拆成若干材质区域。这一步决定了后面图层怎么组织、ID 贴图怎么烘。以典型的 AAA 武士为例,大致可以分成这几类:
| 材质区域 | 典型部件 | 核心 PBR 特征 |
|---|---|---|
| 皮肤 | 面部、颈部、手部 | 金属度=0,粗糙度中等偏高,有次表面散射需求 |
| 布料 | 内衬、绑带、外袍 | 金属度=0,粗糙度高,法线细节丰富 |
| 金属甲片 | 胸甲、肩甲、护臂 | 金属度=1,粗糙度中低,需表达锻打和磨损 |
| 皮革 | 腰带、护腕、刀鞘 | 金属度=0,粗糙度中等,有油脂感和龟裂 |
| 漆器/木质 | 刀柄、装饰件 | 金属度=0,粗糙度低,有清漆层反射 |
| 毛发 | 头盔装饰、须发 | 通常单独用毛发系统,纹理上主要做法线走向 |
分类的意义在于:每一类材质的 PBR 参数区间是相对固定的,你只要在这个区间里做变化,就不会跑偏。比如金属甲片的粗糙度,我一般控制在 0.25 到 0.55 之间,磨损处拉高到 0.7 以上,抛光处压到 0.2 以下。这个区间不是拍脑袋来的,是参考真实钢铁的测量数据加上美术表现需求折中的结果。
2.3 为什么选 Substance Painter 而不是手绘或程序化生成
有人问,现在程序化纹理工具那么多,为什么还死磕 SP?我的答案是:武士角色这种高度定制化、需要大量手工叙事细节的资产,程序化生成搞不定“故事感”。程序化擅长做重复的、大面积的材质,比如一整面砖墙;但武士甲片上那道被刀砍出来的缺口、皮革上因为长期握持磨出的包浆,这些是需要人一笔一笔去“讲”的。
SP 的优势在于它把图层系统、遮罩系统、程序化材质、手绘笔刷揉在了一起。你可以用程序化材质快速铺底,用遮罩控制区域,再用手绘笔刷补细节,最后用滤镜统一调整。这套组合拳打下来,效率和质量都能兼顾。而且 SP 的实时渲染预览基本和主流引擎一致,所见即所得,省去了反复导出的麻烦。
至于 Blender 那边,我通常用它做前期的高模雕刻和低模拓扑,烘焙法线、AO、曲率这些基础贴图,然后导入 SP 做材质。Blender 的重复纹理处理在环境资产上很香,但角色身上用得少,这里不展开。
3. 核心细节解析与实操要点:从烘焙到材质分层
3.1 烘焙前的模型准备:UV 和命名决定成败
烘焙是 PBR 工作流里最容易被忽视、又最容易翻车的一步。我见过太多人材质做得漂漂亮亮,结果烘焙出来的法线全是接缝和噪点,白瞎。
UV 的核心原则是:接缝藏在视觉死角,UV 岛之间留足间距,密度尽量统一。武士角色的 UV 有几个特殊注意点:甲片的硬边接缝尽量放在背面或内侧;面部的 UV 接缝藏在发际线和耳后;布料的接缝可以顺着布纹方向走,反而更自然。UV 岛之间的间距(Padding)我一般留 4 到 8 像素,导出分辨率越高留得越多,避免边缘渗色。
命名规范同样重要。低模、高模、烘焙组要一一对应,比如low_helmet对high_helmet,别用obj_001这种。SP 的烘焙是按名称匹配的,命名乱了就得手动指定,费时费力。我习惯在 Blender 里就把命名理清楚,导出 FBX 时勾选保留名称。
注意:高模和低模的位置必须完全重合,不能有偏移。烘焙法线靠的是射线投射,位置对不上,投出来的法线就是歪的。我一般会把高模和低模放在同一坐标原点,用 Blender 的“匹配变换”确认一遍。
3.2 基础贴图烘焙:法线、AO、曲率、位置、厚度
SP 里需要烘的贴图有好几张,每张都有明确用途,别漏也别多:
- Normal(法线):把高模的细节投射到低模上,是细节表现的主力。
- Ambient Occlusion(AO):环境光遮蔽,用来做脏迹堆积和阴影遮罩。
- Curvature(曲率):边缘和凹槽的提取,做磨损和积灰的利器。
- Position(位置):基于世界坐标的渐变,做上下方向的脏迹过渡。
- Thickness(厚度):表达模型的通透感,皮肤和薄布料会用到。
烘焙参数上,抗锯齿(Anti-aliasing)我一般开到 4x 或 8x,射线距离(Ray Distance)根据高低模的差异调整,一般 0.01 到 0.05 之间。如果高模细节特别深,射线距离要相应加大,否则细节投不全。烘完一定要在 SP 里转一圈看有没有黑块、接缝、噪点,有问题当场重烘,别拖到后面。
3.3 材质分层逻辑:从底到面的五层结构
我在 SP 里做材质,基本遵循一个五层结构,从下往上依次是:
- 基础材质层:纯色或程序化材质打底,确定这块区域是什么材质。
- 色彩变化层:加入色相、明度的自然变化,避免死板的纯色。
- 细节纹理层:叠加噪点、划痕、布纹等微观细节。
- 叙事层:手工绘制的故事性细节,比如刀疤、污渍、缺口。
- 统一调整层:用滤镜或调整图层统一粗糙度、做整体脏旧。
这个结构的价值在于可维护性。如果甲方说“甲片太亮了”,你只需要动统一调整层,不用从头再来。如果只想改某个刀疤的位置,直接找叙事层。图层命名也要规范,我习惯用材质_部位_作用的格式,比如metal_chest_roughness,找起来一目了然。
3.4 智能材质与智能遮罩:效率翻倍的关键
SP 的智能材质(Smart Material)和智能遮罩(Smart Mask)是提效的核心。智能材质本质上是打包好的一组图层加遮罩,拖上去就能用;智能遮罩则是基于烘焙贴图自动生成选区,比如自动选中所有朝上的面、所有边缘、所有凹槽。
做武士甲片时,我常用的智能遮罩组合是:Curvature 选边缘做磨损 + AO 选凹槽做积灰 + Position 选下部做泥渍。这三个叠起来,基本能覆盖 80% 的脏旧需求,剩下的用手绘补。但要注意,智能遮罩是“起点”不是“终点”,直接套用会显得很套路,必须手动破一破,加些不规则的变化。
提示:智能材质用多了容易“同质化”,不同部件看起来像同一个模子刻的。我的做法是每个部件至少改一处智能遮罩的参数,或者手动擦掉一部分,让它有独特性。
4. 实操过程与核心环节实现:武士甲片的完整纹理搭建
4.1 金属甲片:从锻打到战损的完整流程
金属甲片是武士角色的视觉重心,我拿胸甲来举例,走一遍完整流程。
第一步,铺基础金属。新建填充层,Base Color 给一个偏冷的深灰(大概 RGB 90, 92, 95),Metallic 给 1,Roughness 给 0.4。这一步定下“这是铁”的基调。别一上来就给纯黑或纯白,真实钢铁的颜色是带一点冷调的灰。
第二步,加锻打痕迹。新建填充层,挂一个Metal Brushed类的程序化材质,Roughness 稍微拉高到 0.5,用 Curvature 遮罩反向选中平面区域,让锻打纹理只出现在甲片表面而不是边缘。锻打的方向要统一,顺着甲片的走向,别乱。
第三步,做边缘磨损。新建填充层,Base Color 提亮到 RGB 140 左右,Metallic 保持 1,Roughness 压到 0.25。用 Curvature 遮罩选中所有凸边,再用Paint笔刷手动擦掉一部分,让磨损有轻重变化。磨损处的金属是“被磨亮”的,所以粗糙度要低,高光才锐利。
第四步,做凹槽积灰。新建填充层,Base Color 给暗褐色(RGB 60, 50, 40),Metallic 给 0,Roughness 给 0.9。用 AO 遮罩选中凹槽,再用 Position 遮罩限制在下半部分,模拟灰尘和泥垢堆积。这一层金属度必须给 0,因为灰尘不是金属。
第五步,手绘战损。用Slash或Scratch笔刷,在甲片正面画几道深浅不一的刀痕。刀痕内部要露出更亮的金属底色,边缘要有翻卷的毛刺感。这一步是“讲故事”,位置和走向要符合战斗逻辑,别随便乱画。
第六步,统一调整。加一个Sharpen滤镜提一下细节,再用Color Balance微调整体色调,让甲片和周围材质协调。
4.2 布料与皮革:脏旧的层次感怎么堆
布料和皮革的难点在于脏旧要有层次,不能一坨糊上去。我的做法是分三层脏:
- 底层脏:整体压暗,用 Position 遮罩做上下渐变,模拟长期穿着导致的整体变旧。
- 中层脏:用 AO 遮罩在褶皱和接缝处加积灰,颜色偏灰褐。
- 顶层脏:手绘泥点、血渍、油渍,位置集中在膝盖、手肘、下摆这些易脏部位。
皮革还要额外加一层油脂感:在经常握持或摩擦的部位(比如刀柄缠绕处),Roughness 压低到 0.3 左右,Base Color 稍微加深,模拟被手汗和油脂浸润的效果。这个细节很小,但加上之后真实感提升明显。
布料的法线细节靠高模雕刻的布纹投射,如果高模没做布纹,可以在 SP 里用Fabric类的程序化材质补,但效果不如高模投射自然。所以前期雕刻别偷懒。
4.3 皮肤与面部:次表面散射的纹理准备
皮肤的 PBR 参数和金属完全相反:Metallic 必须为 0,Roughness 在 0.4 到 0.6 之间,还要考虑次表面散射(SSS)。SP 本身不直接渲染 SSS,但你可以通过 Base Color 的色调和一张额外的 Scattering 贴图来为引擎提供数据。
面部纹理的重点是血色分布和瑕疵。额头、鼻头、颧骨这些地方血色偏红,粗糙度略低(出油);眼周、嘴角血色偏暗,粗糙度略高。伤疤处要单独处理:疤痕组织比正常皮肤更亮、更光滑,Roughness 压到 0.35 左右,Base Color 偏粉白。
注意:皮肤的 Base Color 千万别用纯肉色,那是新手最容易犯的错。真实皮肤是多层色彩叠加的结果,底层是血色,中层是肤色,表层是角质。我一般用三层填充加遮罩来模拟,比单层纯色真实得多。
4.4 导出配置:不同引擎的参数差异
纹理做完,导出这一步同样关键。SP 支持导出到 Unity、Unreal、Blender 等主流引擎,每个引擎的贴图打包方式不同:
| 引擎 | Base Color | Metallic/Roughness | Normal | 备注 |
|---|---|---|---|---|
| Unreal | BaseColor | 打包进 ORM | Normal | ORM 顺序为 AO/Roughness/Metallic |
| Unity | Albedo | Metallic + Smoothness | Normal | Smoothness = 1 - Roughness |
| Blender | Base Color | Metallic + Roughness | Normal | 分开导出 |
导出格式我一般选 PNG 16 位(法线必须 16 位,否则会有色阶),其他贴图 8 位够用。分辨率根据项目定,AAA 角色一般 4K,手游 2K 甚至 1K。导出前一定要在 SP 里用目标引擎的预览模式检查一遍,避免打包顺序搞错。
5. 常见问题与排查技巧实录:那些年我踩过的坑
5.1 金属像塑料、布料像纸:参数排查速查表
这是最高频的问题,我整理了一张速查表:
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 金属像塑料 | Metallic 没给到 1 | 检查金属层 Metallic 是否为 1 |
| 金属高光死板 | Roughness 太低且无变化 | 粗糙度加噪点变化,别用纯值 |
| 布料像纸 | 法线细节不足 | 补高模布纹或程序化布纹 |
| 布料脏得假 | 脏迹没有层次 | 分底层/中层/顶层三层脏 |
| 皮肤像蜡 | Base Color 太单一 | 多层色彩叠加,加血色和瑕疵 |
| 整体发灰 | AO 遮罩用过头 | 减少 AO 遮罩强度,检查导出设置 |
5.2 烘焙接缝与噪点的排查思路
烘焙出问题是家常便饭,我的排查顺序是:
- 先看高低模是否重合:位置偏移是接缝的头号原因。
- 再看 UV 岛间距:间距不够会导致边缘渗色,看起来像接缝。
- 然后看射线距离:太短投不全细节,太长会投到不该投的地方。
- 最后看抗锯齿:噪点多一般是抗锯齿不够,加到 8x 试试。
如果以上都排除了还有接缝,那可能是高低模的拓扑差异太大,某些区域射线投射不到。这种情况只能手动补,或者调整高模。
5.3 图层太多导致卡顿的优化技巧
SP 图层堆到几十层之后会明显卡顿,我的优化经验是:
- 合并同类图层:确定不再改动的细节层可以合并,减少实时计算量。
- 降低预览分辨率:编辑时用 1K 或 2K 预览,导出时再切 4K。
- 关闭不必要的通道:只显示当前在编辑的通道,减少 GPU 负担。
- 用文件夹分组:把同一部件的图层放进文件夹,可以整体开关,也方便管理。
提示:合并图层前一定要另存一份工程文件,SP 的合并是不可逆的。我吃过这个亏,合并完发现要改,只能重做。
5.4 导出后引擎里效果不一致的排查
SP 里看着好好的,进引擎就变样,通常是这几个原因:
- 色彩空间不对:Base Color 要用 sRGB,法线和 ORM 要用 Linear,搞反了颜色就偏。
- 打包顺序错了:不同引擎的 ORM 通道顺序不同,导错就全乱。
- 法线贴图的绿通道方向:DirectX 和 OpenGL 的绿通道是反的,引擎设置要对上。
- 粗糙度被反转:Unity 用的是 Smoothness,等于 1 减 Roughness,别忘了转。
我一般会在导出后先在引擎里建一个测试球,把贴图贴上去看一眼,确认没问题再上角色。这个习惯帮我省了无数次返工。
6. 我个人的一些实操心得
做武士角色纹理这些年,最大的体会是:PBR 工作流的上限不在软件操作,而在对真实材质的观察。你得多看真东西——真铁生锈是什么颜色,真皮用久了是什么光泽,真布磨破了边缘是什么状态。SP 只是工具,脑子里没有真实的参照,工具再好也做不出好东西。
另一个心得是别追求一步到位。我现在的习惯是先快速铺一遍大关系,导出进引擎看整体效果,再回头抠细节。很多人一上来就死磕某个局部,结果整体关系崩了,局部再精致也白搭。纹理是服务于角色整体的,不是单独拿出来欣赏的。
最后分享一个小技巧:建一个自己的材质库。把做过的金属、皮革、布料材质存成智能材质,下次遇到类似需求直接调用再改,效率能翻好几倍。我现在的库里有几十套常用材质,新项目起步阶段基本靠它们撑场面,省下的时间用来抠叙事细节,这才是真正拉开差距的地方。