1. 项目缘起与整体设计思路
1.1 为什么选择 Substance Painter 做 AAA 武士角色纹理
做角色纹理这些年,我经手的项目从手游低模到影视级高模都有,但真正让我觉得“工具选对了,效率翻倍”的,还是 Substance Painter 这套 PBR 工作流。这次的项目是一个 AAA 级别的武士角色,要求是能在 UE5 里直接跑实时渲染,同时还要能输出离线渲染用的高精度贴图。说白了,就是一套纹理资产要同时满足游戏引擎和影视预览两个场景。
为什么不用传统的手绘贴图流程?原因很简单:武士这个题材太吃材质细节了。盔甲上的甲片、绳索、皮革、金属磨损、漆面剥落,这些东西如果全靠手绘,一个角色少说也要两三周,而且改起来极其痛苦。Substance Painter 的图层系统和智能材质能让我把“磨损逻辑”和“材质基底”分开处理,改一个参数就能全局更新,这是手绘流程做不到的。
另一个关键点是 PBR。现在但凡涉及实时渲染的项目,PBR 基本是标配。但很多人对 PBR 的理解还停留在“画个金属度贴图就完事了”,实际上 PBR 的核心是让材质在不同光照环境下都有物理正确的表现。武士盔甲在阳光下和篝火旁的反光完全不同,这种一致性靠手绘是没法保证的。
1.2 整体工作流的拆解逻辑
我把整个纹理流程拆成了四个阶段:模型准备与 UV 规划、基础材质铺设、细节雕刻与磨损叠加、最终输出与引擎验证。这四个阶段不是随便分的,每个阶段都有明确的输入和输出,避免返工。
模型准备阶段的核心是 UV。很多人觉得 UV 是模型师的事,纹理师不用管,这个想法在 AAA 项目里会吃大亏。武士角色的盔甲有大量重叠结构,如果 UV 没有按材质区域分块,后期在 Painter 里做遮罩会非常痛苦。我的习惯是要求模型师至少按“金属区、皮革区、布料区、皮肤区”四类分 UV 岛,并且保证每个岛的纹素密度一致。
基础材质铺设阶段,我不用 Painter 自带的预设材质直接往上怼,而是先建一个“材质基底库”。比如金属基底我会有三套:抛光钢、锻打铁、氧化青铜。每套基底都调好基础色、粗糙度、金属度,后面所有盔甲部件都从这个库里派生。这样做的好处是整体色调统一,不会出现这块甲片偏蓝那块偏黄的情况。
细节雕刻与磨损叠加是耗时最长的阶段,也是最考验经验的地方。磨损不是随便拿个笔刷乱涂,而是要符合物理逻辑。武士盔甲的磨损集中在肩甲、胸甲边缘、护腕内侧这些高频接触区域,而且磨损程度要跟角色的战斗经历匹配。我会在 Painter 里用“曲率遮罩+位置遮罩+手绘修正”三层叠加的方式来做,后面会详细讲。
最终输出阶段,除了常规的 BaseColor、Normal、Roughness、Metallic、AO 这五张图,我还会额外输出一张 Height 图用于后续可能的置换需求。输出格式统一用 16 位 PNG,虽然文件大,但能避免色带问题。
1.3 方案选型的几个关键取舍
这里说几个我在方案选型时纠结过的点,可能对你有参考价值。
第一个是是否用 UDIM。UDIM 的好处是分辨率高,武士角色如果全身用一张 UV 图,4K 分辨率下盔甲细节根本不够看。但 UDIM 的代价是文件管理复杂,而且 UE5 对 UDIM 的支持虽然有了,但工作流还是不如单 UV 图顺畅。我最后的方案是:主体盔甲用 UDIM(3 个 Tile),皮肤和布料用单 UV 图。这样既保证了关键区域的分辨率,又控制了整体复杂度。
第二个是是否用 Substance Designer 配合。Designer 可以做程序化材质,理论上更灵活。但武士盔甲的磨损模式其实是有规律的,用 Painter 的智能遮罩加手绘修正已经足够,上 Designer 反而增加了学习成本和迭代时间。我的建议是:如果你的项目有大量重复性材质需求(比如一排士兵),那 Designer 值得投入;如果是单个主角,Painter 足够。
第三个是法线贴图的烘焙方式。我试过在 Painter 里直接烘焙,也试过在 Marmoset Toolbag 里烘焙再导入。实测下来,Marmoset 的烘焙质量更稳,尤其是处理盔甲边缘的硬边时,Painter 自带的烘焙偶尔会出现法线接缝。所以我的流程是:Marmoset 烘焙法线+AO+曲率图,然后导入 Painter 作为基础贴图。
2. 核心细节解析与实操要点
2.1 UV 规划的硬性标准与检查清单
UV 没做好,后面全是坑。我给模型师的 UV 要求具体到以下几点:
- 纹素密度统一:主体盔甲区域 1024 像素/米,皮肤区域 2048 像素/米,布料区域 512 像素/米。这个密度是根据最终在 UE5 里的观看距离定的,主角在第三人称视角下,盔甲占屏幕比例最大,所以密度最高。
- UV 岛间距:至少 4 个像素,防止烘焙时边缘溢出。武士盔甲的甲片边缘很薄,间距不够的话法线烘焙会出现黑边。
- 接缝位置:所有接缝必须藏在结构转折处或视觉盲区。比如肩甲的接缝放在腋下,护腕的接缝放在内侧。这个要求听起来简单,但实际做的时候模型师经常把接缝放在正面,后期纹理师要花大量时间修接缝。
- 对称性处理:武士角色左右对称,但纹理不能完全对称。我的做法是 UV 左右对称,但纹理在 Painter 里用镜像图层加手绘修正,保证左右磨损程度有差异。
检查 UV 的时候,我会在 Painter 里先贴一张棋盘格,然后旋转视角看有没有拉伸。拉伸严重的区域必须让模型师回去改,不能将就。我见过太多项目因为 UV 拉伸导致纹理模糊,最后只能降分辨率重做。
2.2 材质基底库的搭建方法
材质基底库是我在多个项目里积累下来的,这里分享武士角色用到的几个核心基底。
抛光钢:BaseColor 用 (0.56, 0.57, 0.58),Roughness 0.15,Metallic 1.0。这个参数是实测出来的,在 UE5 的默认光照下,这个粗糙度能让盔甲有清晰的高光反射,但不会像镜子一样刺眼。
锻打铁:BaseColor (0.42, 0.40, 0.38),Roughness 0.45,Metallic 1.0。锻打铁的粗糙度要高一些,因为表面有锤击痕迹。我会在 Painter 里叠加一层噪波作为粗糙度变化。
氧化青铜:BaseColor (0.35, 0.48, 0.42),Roughness 0.55,Metallic 0.8。青铜的金属度不能给 1.0,因为氧化层是绝缘体。这个参数很多人会搞错,导致青铜看起来像塑料。
皮革:BaseColor (0.18, 0.12, 0.08),Roughness 0.65,Metallic 0.0。皮革的粗糙度变化很大,我会用 Painter 的“皮革”智能材质叠加一层细节。
布料:BaseColor (0.12, 0.10, 0.09),Roughness 0.85,Metallic 0.0。武士的内衬布料是深色麻布,粗糙度要高,避免反光。
搭建基底库的时候,我会在 Painter 里建一个“基底”图层组,每个基底是一个填充图层加遮罩。这样后面做具体部件的时候,直接复制基底图层,改遮罩就行。
2.3 磨损逻辑的物理依据与实现
磨损是武士角色纹理的灵魂。没有磨损的盔甲看起来像玩具,磨损过度的盔甲又像废铁。我的磨损逻辑基于三个维度:接触频率、摩擦方向、环境暴露。
接触频率决定磨损位置。肩甲顶部、胸甲边缘、护腕内侧、膝盖甲这些地方是高频接触区,磨损最重。我会用 Painter 的“曲率遮罩”先选出凸起区域,再用“位置遮罩”限制在特定高度范围。
摩擦方向决定磨损形状。武士挥刀时,护腕内侧会有纵向摩擦痕迹;行走时,大腿甲会有横向摩擦痕迹。这个用 Painter 的“方向模糊”滤镜可以实现,把噪波沿特定方向拉伸。
环境暴露决定磨损颜色。长期暴露在外的金属会氧化发暗,被布料遮盖的金属则保持光亮。我会用 AO 贴图作为遮罩,AO 值高的区域(凹陷处)减少氧化,AO 值低的区域(凸起处)增加氧化。
具体操作上,我在 Painter 里建了三个磨损图层:基础磨损层(曲率遮罩+噪波)、方向磨损层(方向模糊+手绘修正)、氧化层(AO 遮罩+颜色叠加)。三层叠加后,再用手绘笔刷在关键区域做修正。比如胸甲正中间有一道刀痕,这个刀痕的磨损边缘要锐利,内部要露出底层金属色,这种细节只能手绘。
2.4 法线贴图的烘焙与修正
法线贴图的质量直接决定盔甲的立体感。我的烘焙流程是:Marmoset 烘焙高模到低模,输出 4K 法线图,然后导入 Painter 作为基础。
烘焙的时候有几个参数很关键:
- Skew 值:武士盔甲的甲片有厚度,Skew 值要给到 2-3 像素,防止边缘出现硬切。
- Ray Distance:根据高低模的差异调整,一般给 0.5-1.0 厘米。太大容易把周围的结构烘进来,太小会丢失细节。
- Antialiasing:开到 4x 以上,减少锯齿。
烘焙完成后,我会在 Painter 里用法线图层叠加细节法线。比如甲片表面的锤击痕迹、皮革的纹理、布料的编织纹路。这些细节法线用 Painter 自带的材质生成,不用额外做高模。
注意:法线贴图的绿色通道方向要跟引擎匹配。UE5 是 OpenGL 标准(绿通道向上),Unity 是 DirectX 标准(绿通道向下)。如果搞反了,盔甲的光照会完全错误。
3. 实操过程与核心环节实现
3.1 项目初始化与贴图集设置
打开 Substance Painter,新建项目,导入低模 FBX。这里有个细节:导入的时候要勾选“保留 UV 接缝”,否则 Painter 会自动合并 UV 岛,导致后续遮罩失效。
贴图集设置根据 UV 分块来。我的武士角色分了四个贴图集:盔甲主体(4K)、皮肤(2K)、布料(2K)、配件(2K)。每个贴图集的输出格式单独设置,盔甲主体用 16 位 PNG,其他用 8 位 PNG 节省空间。
项目设置里,把“法线贴图格式”设为 OpenGL,“粗糙度/金属度工作流”设为 Metallic。这两个设置如果搞错,后面所有材质都要重做。
3.2 基础材质铺设的完整步骤
第一步,导入烘焙好的法线、AO、曲率、位置贴图。在 Painter 的“纹理集设置”里,把这些贴图分别指定到对应的通道。
第二步,建基底图层组。以盔甲主体为例,我先建一个“金属基底”组,里面放一个填充图层,BaseColor 设为抛光钢的参数。然后给这个组加一个黑色遮罩,用“颜色选择遮罩”选出所有金属区域。
第三步,叠加材质变化。在金属基底组上面,新建一个“锻打铁”填充图层,用噪波遮罩控制混合区域。这样盔甲上就有了抛光钢和锻打铁的过渡,看起来更自然。
第四步,处理皮革和布料。皮革用 Painter 自带的“皮革”智能材质,调整参数后叠加到护腕、腰带区域。布料用“织物”智能材质,叠加到内衬区域。
第五步,整体色调校正。在所有材质图层上面,加一个“颜色校正”调整图层,微调色相、饱和度、对比度。这一步是为了让所有材质在同一个光照环境下看起来协调。
3.3 磨损与细节的叠加实操
磨损叠加是分区域进行的。我以胸甲为例,讲一下具体操作。
胸甲的磨损集中在三个区域:边缘、中心凸起、刀痕处。
边缘磨损:用曲率遮罩选出边缘,然后叠加一层“金属磨损”智能材质。这个智能材质会自动生成划痕和氧化效果。调整参数让磨损程度适中,不要太过。
中心凸起磨损:用位置遮罩选出胸甲中心区域,叠加一层“抛光”效果。因为中心区域是受击打最多的,金属会被磨得更亮。这里我把粗糙度降低到 0.08,金属度保持 1.0。
刀痕:用手绘笔刷在胸甲上画一道刀痕。笔刷用“硬边圆头”,颜色选底层金属色。画完后,在刀痕图层上加一个“斜面”滤镜,让刀痕边缘有立体感。最后在刀痕周围加一圈“锈迹”效果,模拟氧化。
实操心得:磨损图层不要一次画到位,要分层叠加。先画大面积的磨损,再画中等细节,最后画局部特写。这样改起来方便,不会牵一发而动全身。
3.4 输出配置与引擎验证
输出的时候,我建了一个自定义输出模板,包含以下贴图:
| 贴图名称 | 格式 | 用途 |
|---|---|---|
| BaseColor | PNG 16位 | 基础颜色 |
| Normal | PNG 16位 | 法线 |
| Roughness | PNG 16位 | 粗糙度 |
| Metallic | PNG 16位 | 金属度 |
| AO | PNG 16位 | 环境光遮蔽 |
| Height | PNG 16位 | 高度(备用) |
输出完成后,导入 UE5 验证。在 UE5 里建一个材质,把贴图连上去,然后用不同的光照环境测试。我会重点看三个地方:金属高光是否自然、磨损过渡是否平滑、法线细节是否清晰。
如果发现金属高光太强,就回 Painter 调高粗糙度;如果磨损过渡生硬,就回 Painter 加一层模糊;如果法线细节丢失,就检查输出分辨率是否够。
4. 常见问题与排查技巧实录
4.1 法线接缝与黑边问题
法线接缝是 Painter 工作流里最常见的问题。表现是 UV 岛边缘出现黑线或亮线,光照下特别明显。
原因通常有三个:UV 岛间距不够、烘焙时 Skew 值太小、法线贴图格式不匹配。
排查步骤:先在 Painter 里关掉所有材质图层,只显示法线贴图。如果接缝还在,说明是烘焙问题;如果接缝消失,说明是材质图层的问题。
解决方法:UV 岛间距至少 4 像素;烘焙 Skew 值给到 2-3 像素;确认法线格式跟引擎匹配。如果还不行,就在 Painter 里用“法线修复”滤镜手动修接缝。
4.2 材质看起来像塑料的排查
金属看起来像塑料,通常是粗糙度或金属度设置错误。
排查清单:
- 金属度是否给到 1.0(纯金属)或 0.8-0.9(氧化金属)
- 粗糙度是否在合理范围(抛光金属 0.1-0.2,锻打金属 0.4-0.6)
- BaseColor 是否过亮(金属的 BaseColor 不应该超过 0.7)
- 是否有环境光遮蔽贴图影响
我遇到过一次,盔甲在 UE5 里看起来像塑料,排查了半天发现是金属度贴图输出时被压缩成了 8 位,导致数值精度不够。改成 16 位后问题解决。
4.3 纹理在引擎里模糊的排查
纹理模糊通常是分辨率或压缩设置的问题。
排查步骤:先在 Painter 里检查输出分辨率是否够(盔甲主体至少 4K);然后在 UE5 里检查纹理压缩设置,BaseColor 用“默认”压缩,Normal 用“法线贴图”压缩,Roughness/Metallic 用“灰度”压缩;最后检查 Mipmap 设置,如果角色在远处模糊,可能是 Mipmap 生成有问题。
避坑技巧:UE5 的纹理压缩对法线贴图特别敏感,如果法线贴图压缩过度,盔甲细节会完全丢失。我的做法是法线贴图用“法线贴图”压缩,并且把“压缩质量”调到最高。
4.4 常见问题速查表
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 法线接缝黑边 | UV 间距不够/Skew 太小 | 增加 UV 间距,调整 Skew |
| 金属像塑料 | 金属度/粗糙度错误 | 检查参数,确认 16 位输出 |
| 纹理模糊 | 分辨率不够/压缩过度 | 提高分辨率,调整压缩设置 |
| 磨损不自然 | 遮罩太生硬 | 叠加噪波,手绘修正 |
| 颜色偏差 | 色彩空间错误 | 确认 sRGB 和 Linear 设置 |
| 烘焙失败 | 高低模不匹配 | 检查高低模命名和位置 |
4.5 性能优化与文件管理
AAA 项目的纹理文件动辄几个 G,文件管理很重要。我的做法是:每个贴图集单独一个文件夹,文件夹里按“输出日期_版本号”命名。比如“20240520_v03”。每次修改后输出新版本,不覆盖旧版本。这样如果改坏了可以随时回滚。
性能优化方面,我会在 Painter 里把不用的图层合并,减少实时计算量。输出的时候,如果某些贴图在引擎里用不到(比如 Height),就不输出,节省空间。
个人经验:Substance Painter 的“智能材质”虽然方便,但不要滥用。每个智能材质都会增加计算量,图层多了之后 Painter 会卡。我的习惯是智能材质用完后,如果不再调整,就栅格化,减少实时计算。
5. 工具选型与版本管理
5.1 Substance Painter 版本选择
我目前用的是 Substance Painter 2023 版本。这个版本对 UDIM 的支持比较稳定,而且新增的“路径遮罩”功能对做磨损很有帮助。不建议用太老的版本,因为老版本对 16 位输出的支持有问题,容易出现色带。
如果你用的是订阅版,记得定期更新,但不要追最新版。新版本刚出来的时候往往有 Bug,等一两个小版本更新后再升级比较稳。
5.2 辅助工具推荐
除了 Painter,我还会用几个辅助工具:
- Marmoset Toolbag:烘焙法线和 AO,质量比 Painter 自带的好。
- Photoshop:后期微调贴图,比如修接缝、调色。
- UE5:最终验证,确保纹理在引擎里表现正确。
- PureRef:参考图管理,做武士盔甲的时候我收集了几十张参考图,用 PureRef 整理。
5.3 版本管理与协作
如果是团队协作,我会用 Perforce 管理纹理文件。每个贴图集一个仓库,提交的时候写清楚修改内容。如果是个人项目,用 Git LFS 也行,但 Git 对大文件的支持不如 Perforce。
协作的时候,我会把 Painter 项目文件也提交上去,这样其他人可以接着改。但要注意,Painter 项目文件很大,提交前最好清理一下历史记录。
6. 从项目里总结的几条硬核经验
做武士角色纹理这个项目,前后花了大概三周时间,中间踩了不少坑。这里分享几条我觉得最有价值的经验。
第一条:UV 决定上限,纹理决定下限。UV 没做好,纹理做得再细也没用。我见过太多项目因为 UV 问题导致纹理模糊,最后只能降分辨率重做。所以项目开始前,一定要花时间检查 UV。
第二条:磨损要有逻辑,不能乱涂。磨损的位置、形状、颜色都要有物理依据。我习惯在画磨损之前,先想清楚这个角色经历过什么战斗,哪些部位会磨损,磨损程度如何。想清楚了再动手,比边画边想效率高得多。
第三条:输出格式很重要。16 位 PNG 虽然大,但能避免色带。我试过用 8 位 JPG 输出,结果在引擎里金属高光出现了明显的色带,只能重做。所以关键贴图一定要用 16 位。
第四条:引擎验证不能省。Painter 里的预览和引擎里的最终效果往往有差异。我每次输出后都会导入 UE5 验证,发现问题及时回改。如果等到所有贴图都做完再验证,改起来就麻烦了。
第五条:文件管理要规范。AAA 项目的纹理文件很多,如果没有规范的命名和版本管理,很容易搞混。我的做法是每个贴图集单独文件夹,按日期和版本号命名,每次修改输出新版本,不覆盖旧版本。
最后再分享一个小技巧:在 Painter 里做磨损的时候,可以先用“填充图层+遮罩”的方式做一版大效果,然后把这个效果导出为贴图,再重新导入作为基础。这样做的好处是,后续的细节叠加不会影响大效果,改起来更方便。这个技巧是我在一个影视项目里学到的,用在游戏项目里同样有效。