1. 项目缘起与整体设计思路
1.1 为什么选择 Substance Painter 做 AAA 武士角色纹理
做角色纹理这些年,我经手的项目从手游低模到影视级高模都有,但真正让我觉得“工具选对了,效率翻倍”的,还是 Substance Painter 这套 PBR 工作流。这次的项目是一个 AAA 级别的武士角色,要求是能在 UE5 里直接跑 Lumen 和 Nanite,贴图精度和材质逻辑都得经得起特写镜头的考验。
先说为什么不用传统的手绘贴图或者 Blender 里直接画。传统流程最大的问题是“不可复用”和“不可迭代”——你画完一套 4K 贴图,导演说“甲片换成青铜质感”,你就得从头再来一遍。而 Substance Painter 的 PBR 工作流核心优势在于非破坏性编辑和程序化材质:基础材质层、磨损层、污渍层、边缘高光层各自独立,改一个参数,整张图自动重算。这对 AAA 项目里频繁的版本迭代来说,是救命级别的能力。
另一个关键考量是跨软件一致性。Substance Painter 导出的贴图遵循标准的 PBR 金属度-粗糙度工作流,Albedo、Normal、Roughness、Metallic、AO 这几张贴图丢进 UE5、Unity、Blender Cycles 里,只要色彩空间设置对,表现基本一致。我试过在 Blender 里用重复纹理节点做程序化材质,虽然灵活,但导出到游戏引擎时经常出现色彩空间错乱、法线方向反了这类破事,排查起来非常折磨。
注意:Substance Painter 的 PBR 工作流默认是金属度-粗糙度(Metallic-Roughness)体系,不是高光-光泽度(Specular-Glossiness)。如果你接手的项目用的是后者,导出时需要做一次转换,否则金属材质会看起来像塑料。
1.2 武士角色的材质拆解与图层规划
拿到这个武士角色,我第一件事不是打开 SP 就往上画,而是先做材质分区。这个角色的视觉复杂度主要来自四个部分:甲片(金属)、布料(棉麻内衬)、皮革(束带和护腕)、皮肤(面部和手部)。每个部分的 PBR 参数逻辑完全不同,混在一起画必乱。
我的图层规划是这样的:最底层是基础材质层,用填充图层加材质球,确定每个区域的大致颜色和粗糙度范围;往上是程序化细节层,用 SP 自带的生成器(Generator)加噪波、金属边缘磨损、灰尘积累;再往上是手绘修正层,针对特定区域做局部调整,比如甲片上的刀痕、布料上的缝线;最顶层是全局调整层,统一色温、对比度和 AO 强度。
这个顺序不能乱。我见过有人一上来就手绘细节,画到一半发现基础色不对,想改就得把所有手绘层全部重做。正确的做法是从大到小、从程序到手动,先保证大关系正确,再往里塞细节。
1.3 项目文件与资源准备清单
在正式开始之前,我习惯把资源整理清楚,避免做到一半找不到东西。这个项目需要准备的文件包括:
- 高模:ZBrush 雕刻的武士高模,细分级别在 6-7 级,面数约 2000 万,用于烘焙法线和 AO。
- 低模:Maya 或 Blender 拓扑的低模,面数控制在 3-5 万三角面,UV 展开要保证纹理密度均匀,甲片区域适当放大。
- 参考图:找了三组参考——日本战国甲胄实物照片、电影《最后的武士》剧照、以及几款 AAA 游戏里的武士角色截图,用来确定材质色调和磨损程度。
- SP 工程模板:我提前建了一个 4K 分辨率的工程模板,色彩空间设为 sRGB,法线格式设为 OpenGL(UE5 用),省得每次新建工程都要调。
提示:UV 展开时,甲片和布料要分在不同的 UDIM 瓦片里,不然后期导出贴图时分辨率不够用。我一般把甲片放在 1001,布料放在 1002,皮肤单独放 1003。
2. 核心细节解析与实操要点
2.1 PBR 贴图通道的底层逻辑
很多人用 SP 画了很久,但对 PBR 每个通道到底控制什么还是一知半解。这里我用最直白的方式说清楚:Albedo(基础色)只负责“这是什么颜色”,不能带任何光影信息,阴影和高光由引擎根据光照实时计算;Roughness(粗糙度)控制表面微观凹凸程度,值越低越像镜子,值越高越像磨砂;Metallic(金属度)是个非黑即白的通道,金属是 1,非金属是 0,中间值只用在金属生锈或半金属材质上;Normal(法线)存储表面凹凸方向,用来在低模上模拟高模细节;AO(环境光遮蔽)模拟缝隙和角落的阴影,增强体积感。
这里有个新手最容易踩的坑:把阴影画进 Albedo 里。我见过太多人把甲片缝隙的暗部直接画在基础色上,结果引擎一打光,那些暗部就变成了“脏色”,整个材质看起来像发霉。正确的做法是 Albedo 保持干净,阴影交给 AO 和引擎的光照系统。
另一个关键点是色彩空间。Albedo 和 AO 用 sRGB,Roughness、Metallic、Normal 用 Linear。这个设置错了,贴图在引擎里的表现会完全不对。SP 导出时有个“Config”选项,选对模板(比如 UE5 的模板),它会自动帮你分配色彩空间。
2.2 金属甲片的磨损与做旧逻辑
武士甲片是这个角色的视觉核心,也是最难画的部分。金属材质的 PBR 逻辑和布料完全不同:金属的 Albedo 其实是反射色,铁是灰白色,铜是橙红色,金是黄色;金属的 Roughness 决定反射清晰度,抛光金属 Roughness 在 0.1-0.2,旧金属在 0.4-0.6;金属的 Metallic 永远是 1,除非表面有油漆或严重氧化。
我做甲片磨损的流程是这样的:先铺一层基础金属材质,Roughness 给 0.3 左右,模拟“有点旧但还没生锈”的状态;然后用 SP 的Metal Edge Wear 生成器,基于曲率贴图在边缘自动生成磨损,露出底层更亮的金属;接着用Dirt 生成器在凹陷处堆积灰尘和污渍,Roughness 调高到 0.7 左右;最后手绘几道刀痕和凹坑,用 Normal 通道加深,Albedo 稍微提亮边缘。
实操心得:金属磨损不要做得太均匀。我一般会把生成器的“Seed”参数多换几次,找到最自然的那一版。另外,甲片连接处的磨损要比甲片表面重,因为那里摩擦最多。
2.3 布料与皮革的材质区分
布料和皮革在 PBR 里都属于非金属,但粗糙度和法线细节差别很大。棉麻布料的 Roughness 在 0.8-0.95,几乎不反光,法线要做出编织纹理;皮革的 Roughness 在 0.5-0.7,有一点柔和的反射,法线要做出毛孔和褶皱。
我处理布料的方法是:先用 SP 的Fabric 生成器铺一层基础编织纹理,然后用Curvature 贴图在褶皱处加深颜色,模拟“穿久了”的脏旧感。皮革则用Leather 生成器加毛孔,再用Dirt 生成器在束带边缘做磨损。
这里有个细节:布料的 Albedo 不要用纯色。真实的布料因为纤维密度不同,颜色会有微妙的深浅变化。我一般会在 Albedo 层上叠一个低对比度的噪波,透明度调到 10%-15%,看起来就自然多了。
2.4 皮肤材质的次表面散射模拟
皮肤是 PBR 里最特殊的材质,因为它有次表面散射(SSS)——光线穿透皮肤表层,在内部散射后再出来,所以皮肤看起来是“半透明”的。SP 本身不直接支持 SSS 渲染,但我们可以通过贴图通道来模拟:Albedo 用偏红的肤色,Roughness 在 0.4-0.6 之间(皮肤有油脂,不是完全哑光),Normal 做出毛孔和细纹,AO 在眼窝、鼻翼、嘴角加深。
如果引擎支持 SSS(比如 UE5 的 Subsurface Profile),还需要额外导出一张Thickness 贴图,用来控制光线穿透的深度。耳朵、鼻翼这些薄的地方 Thickness 值低,光线容易穿透;脸颊、额头这些厚的地方 Thickness 值高。
注意:皮肤的 Albedo 千万不要画得太红或太黄,否则在引擎里打光后会像“发烧”或“黄疸”。我一般用色板取真实照片的肤色,然后饱和度降 10% 左右。
3. 实操过程与核心环节实现
3.1 高模烘焙与贴图匹配
烘焙是 SP 工作流里最容易被忽视但最影响最终效果的环节。我的烘焙流程是:在 SP 里新建工程,导入低模,然后选择“Bake Mesh Maps”,把高模拖进去,设置好Max Frontal Distance和Max Rear Distance(一般给 0.05-0.1,根据模型尺寸调整),然后烘焙 Normal、AO、Curvature、Position、Thickness 这几张图。
这里的关键参数是Anti-aliasing要开到 4x 或 8x,不然法线贴图会有锯齿。另外,Match 选项要选 “By Mesh Name”,这样 SP 会自动把高模和低模的对应部分匹配上,不用手动对齐。
烘焙完成后,我会先检查一遍法线贴图有没有明显的接缝或错误。常见的错误包括:UV 接缝处法线断裂、高模低模匹配错位、烘焙距离不够导致细节丢失。发现问题就调整参数重新烘焙,不要将就,不然后面画得再好也救不回来。
3.2 基础材质层的搭建与参数设置
烘焙没问题后,开始搭基础材质层。我的做法是:先给每个材质区域建一个Fill Layer,分别指定金属、布料、皮革、皮肤的材质球。然后调整每个材质球的Base Color、Roughness、Metallic参数。
以甲片为例,我用的参数是:Base Color 给一个偏冷的灰白色(RGB 约 180, 185, 190),Roughness 给 0.35,Metallic 给 1.0。布料的话,Base Color 给深蓝色(RGB 约 40, 50, 70),Roughness 给 0.9,Metallic 给 0.0。
这个阶段不用追求完美,先把大关系定下来。我一般会在这个阶段花 20-30 分钟,反复调整参数,直到在 SP 的默认光照下看起来舒服为止。
3.3 程序化生成器的叠加与蒙版控制
基础层搭好后,开始叠程序化细节。SP 的生成器系统非常强大,但很多人用不好,原因是蒙版没控制好。我的做法是:每个生成器都配一个Black Mask,然后用Curvature、AO、Position这些贴图来控制蒙版的分布。
比如做金属边缘磨损,我会给 Metal Edge Wear 生成器配一个 Black Mask,然后在 Mask 里加一个 Curvature 贴图,把“凸起”的部分刷白,这样磨损就只出现在边缘。再比如做灰尘积累,我会用 AO 贴图反相后作为蒙版,让灰尘只出现在凹陷处。
实操心得:生成器的参数不要一次调到位,先给一个大概的值,然后通过蒙版的透明度来控制强度。这样后期调整更方便,不用反复改生成器参数。
3.4 手绘修正与细节强化
程序化生成器能搞定 80% 的细节,但剩下的 20% 必须手绘。这个武士角色我手绘的部分主要包括:甲片上的刀痕和凹坑、布料上的缝线和破损、皮革束带的边缘磨损、面部的疤痕和胡茬。
手绘时我一般用Soft Brush加Pressure控制,笔刷透明度给 30%-50%,一层一层叠。刀痕的做法是:先用深色画一道凹痕,然后在凹痕边缘用亮色提亮,模拟“金属被刮开”的效果。缝线的做法是:用细笔刷画一条深色线,然后在旁边画一条亮色线,模拟“线凸起”的效果。
这个阶段最考验耐心,我一般会花 3-4 个小时在手绘上。但这也是最能体现“人味”的地方,程序化生成器做出来的东西再精细,也缺少这种“手工感”。
3.5 导出贴图与引擎对接
画完后,导出贴图。SP 的导出模板我一般选UE5 (Packed),它会自动把 Roughness、Metallic、AO 打包到一张贴图的 R、G、B 通道里,节省显存。导出分辨率选 4K,格式选 PNG 或 TGA。
导出后,在 UE5 里建一个Material,把贴图连上去。Albedo 连 Base Color,Normal 连 Normal,Packed 贴图的 R 连 Roughness、G 连 Metallic、B 连 AO。然后根据引擎的光照系统微调参数,比如 Lumen 下 Roughness 要稍微调低一点,因为 Lumen 的反射比传统光照更亮。
提示:如果引擎里看起来太暗或太亮,先检查色彩空间设置,再检查光照强度。不要一上来就改贴图,那样会越改越乱。
4. 常见问题与排查技巧实录
4.1 法线贴图接缝与翻转问题
法线贴图出问题是最常见的,表现包括:UV 接缝处有黑线或亮线、法线方向反了导致凹凸颠倒、不同软件之间法线格式不兼容。排查思路是:先确认 SP 的法线格式(OpenGL 还是 DirectX),再确认引擎的法线格式,两者必须一致。如果接缝有问题,检查烘焙时的Max Frontal Distance是否够大,或者 UV 接缝是否对齐。
我遇到过一次法线翻转的问题,排查了半天才发现是 SP 导出时选了 DirectX 格式,而 UE5 用的是 OpenGL。改过来就好了。所以导出前一定要确认格式,这个坑我踩过不止一次。
4.2 金属材质在引擎里发灰发暗
金属在 SP 里看着很亮,丢进引擎却发灰发暗,原因通常是Metallic 通道没连对或者Roughness 太高。金属的反射依赖环境光照,如果引擎里没有反射球或 Lumen,金属就会看起来像塑料。解决办法是:确认 Metallic 贴图连到了正确的通道,Roughness 不要超过 0.6,然后在引擎里加一个反射球或开启 Lumen。
另一个可能的原因是Albedo 太暗。金属的 Albedo 是反射色,如果给得太暗,反射也会暗。我一般把金属的 Albedo 亮度控制在 150-220 之间(8 位色深)。
4.3 贴图分辨率与显存占用的平衡
4K 贴图很爽,但显存占用也很吓人。一个角色用 5 张 4K 贴图,显存占用大约 500MB-800MB。如果场景里有 10 个角色,显存直接爆掉。我的做法是:主角用 4K,配角用 2K,远景角色用 1K。另外,Roughness、Metallic、AO 可以打包到一张贴图里,节省 2/3 的显存。
如果项目要求更高,可以考虑UDIM或者虚拟纹理。UDIM 把模型分成多个瓦片,每个瓦片单独给分辨率,适合大面积的角色。虚拟纹理则是按需加载,只加载镜头里能看到的部分,适合开放世界。
4.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 法线接缝有黑线 | 烘焙距离不够 | 检查 Max Frontal Distance | 增大到 0.1-0.15 |
| 金属发灰发暗 | Metallic 没连对 | 检查材质节点 | 确认 Metallic 通道连接 |
| 贴图在引擎里偏色 | 色彩空间错误 | 检查 sRGB/Linear 设置 | Albedo 用 sRGB,其他用 Linear |
| 布料看起来像塑料 | Roughness 太低 | 检查 Roughness 值 | 调到 0.8 以上 |
| 皮肤像发烧 | Albedo 太红 | 检查肤色饱和度 | 降饱和度 10%-15% |
| 导出贴图太大 | 分辨率过高 | 检查导出设置 | 配角用 2K,远景用 1K |
最后再分享一个小技巧:SP 里有个“Export Preset”功能,可以把常用的导出设置存成模板,下次直接调用,不用每次重新配。我存了三个模板:UE5、Unity、Blender,切换项目时直接选,省了不少时间。
这个武士角色的纹理我前后做了大概两周,其中烘焙和基础层花了 3 天,程序化细节 4 天,手绘修正 5 天,导出和引擎调试 2 天。最耗时的其实是手绘修正,但也是最出效果的部分。如果你也在做类似的 AAA 角色,我的建议是:不要急着画细节,先把大关系和 PBR 逻辑搞对,后面的事半功倍。