1. 为什么我会从 Blender 转向 ArmorPaint 做贴图
做游戏美术这行的朋友大概都有过这种体验:模型在 Blender 里雕得挺满意,一进贴图环节就开始头疼。Blender 自带的纹理绘制功能这几年确实进步不小,尤其是 2.8 之后的版本,纹理绘制模式加上蜡笔工具,应付一些简单项目完全够用。但真到了需要处理多通道 PBR 材质、需要实时预览复杂 Shader 效果、需要在大尺寸贴图上反复涂抹的时候,Blender 的纹理绘制就开始力不从心了——笔刷延迟、图层管理缺失、遮罩系统简陋,这些问题在项目复杂度上来之后会成倍放大。
ArmorPaint 就是在这个节点进入我视野的。它脱胎于 Armor3D 项目,是一个完全开源的材质绘制工具,核心定位非常明确:用 GPU 加速的实时渲染管线,让美术在 3D 模型表面直接绘制 PBR 材质,支持图层、遮罩、粒子笔刷、程序化纹理节点,而且能直接导入 Blender 导出的 FBX 或 OBJ 模型,画完导出贴图再回到 Blender 或游戏引擎里使用。整个流程非常顺滑,最关键的是它开源免费,源码在 GitHub 上完全公开,你可以自己编译、自己改 Shader、自己加功能。
我第一次用 ArmorPaint 是在一个独立游戏项目里,当时需要给一批硬表面道具做旧化处理。Blender 里做磨损边缘和积灰效果,要么靠顶点色配合程序化节点,要么手动绘制遮罩,效率很低。ArmorPaint 的粒子笔刷和材质层系统让我在半天内就完成了原本需要两三天的工作量。从那以后,我的贴图流程基本就固定下来了:Blender 负责建模和 UV 展开,ArmorPaint 负责材质绘制和贴图输出,最后回到 Blender 或直接进引擎做最终调整。
这篇文章我会从实际使用角度出发,把 ArmorPaint 的核心机制、工作流、实操细节和踩过的坑都讲清楚。不管你是刚接触 PBR 贴图的新手,还是想从 Substance Painter 迁移过来的老手,应该都能找到有用的东西。
2. ArmorPaint 的核心机制与方案选型逻辑
2.1 为什么选择开源方案而不是商业软件
市面上做 PBR 贴图绘制的工具,最主流的是 Substance Painter,功能确实强大,生态也成熟。但它的订阅制对独立开发者和小团队来说是一笔持续开销,而且它的文件格式和 Shader 系统是封闭的,你没法深入底层去改东西。ArmorPaint 走的是另一条路:核心用 Haxe 语言编写,渲染层用 Kha 框架,底层跑在 GPU 上,整个项目在 GitHub 上开源,采用 zlib/libpng 许可证,这意味着你可以自由使用、修改、甚至商用。
从技术架构上看,ArmorPaint 的渲染管线是基于物理的实时渲染,支持金属度-粗糙度工作流,也支持高光-光泽度工作流。它的材质系统用节点图组织,每个材质层可以有自己的颜色、法线、粗糙度、金属度、高度、AO 等通道,层与层之间通过遮罩和混合模式叠加。这个设计思路和 Substance Painter 的层系统非常接近,但 ArmorPaint 的节点系统更底层,你可以直接看到每个通道的计算过程,甚至可以自己写 Shader 节点。
我选择 ArmorPaint 的另一个重要原因是它对 Blender 的友好程度。Blender 导出的 FBX 模型,只要 UV 没问题,直接拖进 ArmorPaint 就能用。ArmorPaint 还支持导入 Blender 的相机和光照信息,虽然这个功能在实际使用中我很少用到,但对于需要精确匹配渲染视角的场景来说很有价值。另外,ArmorPaint 的贴图导出格式非常灵活,支持 PNG、JPEG、EXR 等常见格式,通道打包方式也可以自定义,方便适配 Unity、Unreal、Godot 等不同引擎的贴图规范。
2.2 GPU 加速带来的实时绘制体验
ArmorPaint 最让我满意的地方是它的实时性。它的渲染完全跑在 GPU 上,笔刷的每一次涂抹都会立即反映在模型表面,没有明显的延迟。这背后是 Kha 框架的底层图形抽象在起作用,它把 OpenGL、DirectX、Metal、Vulkan 这些图形 API 统一封装,ArmorPaint 只需要调用 Kha 的接口就能在不同平台上获得接近原生的性能。
具体来说,ArmorPaint 的绘制流程是这样的:模型加载后,顶点数据和 UV 信息被上传到 GPU;每一层材质对应一组纹理,包括颜色、法线、粗糙度等通道;当你用笔刷在模型表面绘制时,笔刷的位置会被投影到 UV 空间,然后在对应的纹理区域进行混合操作。这个过程完全在 GPU 的 Fragment Shader 里完成,所以速度非常快。我实测在 4K 贴图上用半径 200 像素的笔刷连续涂抹,帧率依然能稳定在 60fps 以上,这个性能表现对于日常绘制来说完全够用。
不过 GPU 加速也带来了一些限制。比如 ArmorPaint 对显存的要求比较高,如果你同时打开多个 4K 甚至 8K 的贴图项目,显存占用会迅速上升。我的显卡是 RTX 3060,12GB 显存,同时处理三个 4K 项目基本就是极限了。另外,ArmorPaint 的撤销系统是基于 GPU 状态快照的,撤销步数受显存限制,默认好像是 16 步,可以在设置里调整,但调太高会吃显存。这一点和 CPU 端的撤销系统不太一样,需要适应一下。
2.3 节点系统与图层系统的分工
ArmorPaint 的材质系统分成两个层面:图层系统和节点系统。图层系统负责组织材质的叠加关系,每个图层可以理解为一个独立的材质层,有自己的通道数据和遮罩。节点系统则负责生成具体的纹理内容,比如程序化噪声、渐变、纹理采样、颜色调整等。
这种分工的好处是灵活。你可以用图层系统快速搭建材质的基本结构,比如底层是基础色,中间层是磨损,顶层是积灰;然后用节点系统为每一层生成复杂的遮罩或纹理。举个例子,我要做一个金属表面的划痕效果,可以在图层系统里新建一个划痕层,然后在节点系统里用噪声节点加方向模糊生成划痕纹理,再通过曲线节点调整对比度,最后输出到划痕层的遮罩通道。整个过程是可视化的,每个节点的参数都可以实时调整,效果立即反馈在模型上。
节点系统的另一个用途是创建自定义的材质模板。比如我经常需要做一批风格统一的道具,就可以把常用的材质结构做成节点组,保存为预设,下次直接调用。ArmorPaint 的节点组支持嵌套,你可以把复杂的节点网络封装成一个节点,保持节点图的整洁。这个功能在大型项目中非常实用,能显著减少重复劳动。
3. 从 Blender 到 ArmorPaint 的完整工作流拆解
3.1 Blender 端的模型准备与 UV 展开要点
在 Blender 里准备模型,有几个关键点直接决定后续在 ArmorPaint 里的绘制体验。首先是 UV 展开,这是整个流程的基础。ArmorPaint 的笔刷是基于 UV 空间投影的,如果 UV 有重叠、拉伸或者接缝处理不当,绘制时就会出现笔刷错位、纹理拉伸、接缝处颜色不连续等问题。
我的习惯是在 Blender 里用 Smart UV Project 做初步展开,然后手动调整接缝位置。接缝尽量藏在模型的背面、底面或者结构转折处,避免出现在视觉焦点区域。UV 岛的间距要留够,一般建议至少 4 到 8 个像素的边距,防止绘制时笔刷溢出到相邻的 UV 岛。对于硬表面模型,我会用 Mark Seam 手动标记接缝,然后用 Unwrap 展开,这样能获得更规整的 UV 布局。
UV 展开完成后,需要检查 UV 的缩放比例是否统一。如果不同部分的 UV 缩放不一致,在 ArmorPaint 里绘制同样大小的笔刷,实际在模型表面留下的痕迹大小会不一样。Blender 里可以用 UV 编辑器里的 Average Island Scale 功能来统一缩放,然后再手动微调。另外,建议在 Blender 里给模型赋予一个基础的材质,至少设置一个基础色,这样导入 ArmorPaint 后能有一个初始的视觉参考。
模型导出格式我一般选 FBX,因为 ArmorPaint 对 FBX 的支持最稳定。导出时注意勾选 Apply Modifiers,确保所有修改器都被应用。如果你的模型有多个材质槽,ArmorPaint 会为每个材质槽创建独立的图层组,这个逻辑和 Blender 是一致的。导出路径尽量用英文,避免中文路径导致的兼容性问题。
3.2 ArmorPaint 的项目创建与模型导入
打开 ArmorPaint 后,新建项目的方式有两种:一种是直接导入模型文件,另一种是从模板创建。我一般选第一种,因为模板项目里的默认材质层往往需要删掉重来。导入模型后,ArmorPaint 会自动根据模型的材质槽创建对应的图层组,每个图层组里有一个默认的填充层。
导入模型后第一件事是检查 UV 和法线。ArmorPaint 的视图模式可以切换到 UV 视图,检查 UV 布局是否和 Blender 里一致。如果发现 UV 有问题,需要回到 Blender 重新调整。法线方向也很重要,如果模型法线反了,ArmorPaint 里的光照会看起来很奇怪,笔刷的投影也会出错。Blender 里可以用 Shift+N 重新计算法线,导出前确保法线方向正确。
接下来是设置项目的贴图分辨率。ArmorPaint 支持从 1K 到 8K 的分辨率,我一般用 2K 做草稿,最终输出用 4K。分辨率越高,显存占用越大,绘制时的笔刷延迟也会增加。如果你的显卡显存有限,建议先用低分辨率完成大部分绘制,最后再切换到高分辨率做细节。ArmorPaint 支持在项目设置里随时调整分辨率,但注意调整分辨率会重新采样现有纹理,可能会损失一些细节。
3.3 材质层系统的搭建与遮罩逻辑
ArmorPaint 的图层系统和 Photoshop 的图层概念类似,但每个图层包含的是 PBR 通道数据,而不是单纯的像素颜色。每个图层可以设置自己的颜色、法线、粗糙度、金属度、高度、AO 等通道,层与层之间通过混合模式叠加。默认的混合模式是 Normal,还有 Multiply、Overlay、Screen 等常见模式。
搭建材质层的基本逻辑是:底层放基础材质,比如金属底漆、塑料基底、木材底色;中间层放磨损、划痕、污渍等效果;顶层放积灰、水渍、边缘高光等细节。每一层都需要一个遮罩来控制影响范围,遮罩可以是手绘的,也可以是程序化生成的。
手绘遮罩就是用笔刷在遮罩通道上涂抹,白色表示完全显示,黑色表示完全隐藏,灰色表示半透明。ArmorPaint 的笔刷系统支持压感,如果你有数位板,可以通过压感控制笔刷的力度和大小。程序化遮罩则是用节点系统生成,比如用噪声节点生成随机磨损,用渐变节点生成从上到下的积灰效果,用曲率节点生成边缘磨损。曲率遮罩是硬表面做旧的神器,它能自动识别模型的凸起边缘,在这些区域生成磨损效果,非常自然。
3.4 笔刷系统的深度使用技巧
ArmorPaint 的笔刷系统是我用得最多的功能,这里展开讲几个关键技巧。首先是笔刷的 Alpha 贴图,ArmorPaint 内置了一些基础笔刷,但真正好用的是自定义 Alpha。你可以把 Photoshop 里做的笔刷图案导出为 PNG,然后在 ArmorPaint 里加载为笔刷 Alpha。我常用的 Alpha 包括划痕、噪点、布料纹理、皮肤毛孔等,这些 Alpha 配合不同的笔刷参数能产生非常丰富的效果。
笔刷的 Falloff 曲线决定了笔刷边缘的衰减方式。默认的平滑衰减适合大多数情况,但做硬边效果时可以用线性衰减,做柔和过渡时可以用指数衰减。笔刷的 Jitter 参数可以给笔刷位置和旋转添加随机偏移,做自然磨损时非常有用。比如做金属表面的随机划痕,开启位置和旋转的 Jitter,配合划痕 Alpha,一笔下去就能生成一片自然的划痕群。
笔刷的 Erase 模式相当于橡皮擦,但它的作用对象是当前图层的遮罩通道。按住 Ctrl 键临时切换到 Erase 模式,这个快捷键和 Photoshop 一致,用起来很顺手。另外,ArmorPaint 支持笔刷的对称绘制,做角色模型时特别方便,开启 X 轴对称后,画一边另一边自动镜像。
3.5 节点系统的进阶用法
节点系统是 ArmorPaint 区别于普通贴图软件的核心竞争力。它的节点库包括生成器节点(噪声、渐变、形状)、过滤器节点(模糊、锐化、扭曲)、颜色节点(曲线、色阶、混合)、输入节点(纹理、UV、位置)等。你可以把这些节点自由组合,生成几乎任何想要的纹理效果。
举个例子,我要做一个生锈的金属效果。首先用 Perlin 噪声节点生成基础锈斑,然后用 Color Ramp 节点调整锈斑的密度和对比度,接着用 Warp 节点给锈斑添加扭曲,模拟锈蚀的不规则边缘,最后用 Curve 节点调整颜色,从亮橙色到暗棕色。整个节点网络可以保存为预设,下次直接调用。ArmorPaint 的节点系统还支持遮罩输入,你可以把曲率遮罩、AO 遮罩、位置遮罩等作为节点网络的输入,让程序化纹理只在特定区域生成。
节点系统的另一个高级用法是创建自定义的材质混合。比如我要做一个湿润表面的效果,可以用节点系统生成一个水渍遮罩,然后把这个遮罩连接到粗糙度通道的反向输入,这样水渍区域的粗糙度会降低,看起来更光滑。这种基于物理的材质调整,在 ArmorPaint 里只需要几个节点就能实现,而且效果非常真实。
4. 实操案例:硬表面道具的做旧材质全流程
4.1 项目准备与基础材质铺设
我拿一个典型的科幻风格金属箱子来演示整个流程。模型在 Blender 里已经完成了 UV 展开,导出为 FBX。在 ArmorPaint 里导入模型后,首先设置项目分辨率为 2K,后续再升到 4K。模型有两个材质槽:箱体金属和把手塑料。
先处理箱体金属。在对应的图层组里,新建一个填充层,设置基础色为深灰色,金属度设为 1.0,粗糙度设为 0.4。这个作为金属底漆。然后新建第二个填充层,设置基础色为稍亮的灰色,金属度 1.0,粗糙度 0.3,用噪声节点生成遮罩,模拟金属表面的轻微色差。这一步的目的是打破纯色的单调感,让金属看起来更自然。
接下来处理把手塑料。新建填充层,基础色设为黑色,金属度 0.0,粗糙度 0.6。塑料的粗糙度一般比金属高,但也不能太高,否则看起来像橡胶。然后加一层微弱的噪声遮罩,让塑料表面有细微的质感变化。
4.2 边缘磨损与划痕的绘制
边缘磨损是硬表面做旧的关键。我新建一个填充层,基础色设为亮银色,金属度 1.0,粗糙度 0.2,然后用曲率节点生成遮罩。曲率节点会自动识别模型的凸起边缘,在这些区域生成白色遮罩,凹陷区域生成黑色遮罩。把曲率遮罩连接到磨损层的遮罩通道,边缘磨损效果就出来了。
不过曲率遮罩的默认参数往往需要调整。ArmorPaint 的曲率节点有 Radius 和 Contrast 两个关键参数。Radius 控制曲率计算的采样半径,值越大,识别到的边缘越宽;Contrast 控制遮罩的对比度,值越大,边缘越锐利。我一般先把 Radius 调到 0.05 左右,Contrast 调到 0.5,然后根据效果微调。如果边缘磨损太均匀,可以在曲率遮罩后面加一个噪声节点,用噪声的灰度值调制曲率遮罩,让磨损有随机的不连续性。
划痕的绘制用笔刷完成。选择一个细长的划痕 Alpha,笔刷大小调到 20 像素左右,开启位置和旋转 Jitter,Jitter 值设为 0.3 左右。在箱体的侧面和顶面随机涂抹,模拟使用过程中的刮擦。划痕层的颜色设为亮银色,金属度 1.0,粗糙度 0.15,比边缘磨损更光滑一些,因为划痕通常是新鲜暴露的金属。涂抹时注意力度变化,有些划痕深一些,有些浅一些,这样更自然。
4.3 积灰与污渍的程序化生成
积灰效果我用节点系统生成。新建一个填充层,基础色设为浅灰色,金属度 0.0,粗糙度 0.9。然后用节点系统创建一个积灰遮罩:先用 Position 节点获取模型的世界坐标,然后用 Separate XYZ 节点提取 Y 轴(垂直方向),接着用 Map Range 节点把 Y 轴的值映射到 0 到 1 之间,最后用 Color Ramp 节点调整过渡曲线。这个节点网络的逻辑是:模型顶部的区域 Y 值高,遮罩为白色,积灰显示;底部的区域 Y 值低,遮罩为黑色,积灰隐藏。
为了让积灰更自然,我在 Position 节点后面加了一个 Noise 节点,用噪声扰动 Y 轴的值,这样积灰的边缘就不会是一条直线,而是有自然的起伏。噪声的 Scale 参数设为 5 左右,Detail 设为 3,这样既有大尺度的起伏,也有小尺度的细节。最后把积灰遮罩连接到填充层的遮罩通道,积灰效果就完成了。
污渍效果用类似的思路,但遮罩的生成逻辑不同。我用 AO 节点生成遮罩,AO 值低的区域(也就是模型的缝隙和凹陷处)显示污渍。AO 节点的 Radius 参数控制采样范围,我一般设为 0.1 左右。污渍层的颜色设为深棕色,粗糙度 0.8,金属度 0.0。为了让污渍有层次感,我在 AO 遮罩后面加了一个噪声节点,用噪声调制 AO 遮罩的强度,这样污渍的分布就不会太均匀。
4.4 贴图导出与引擎适配
所有材质层完成后,就可以导出贴图了。ArmorPaint 的导出设置非常灵活,你可以选择导出的通道、格式、位深和打包方式。我一般导出以下通道:Base Color、Normal、Roughness、Metallic、AO、Height。格式选 PNG,位深 8 位(如果做影视级渲染可以用 16 位 EXR)。
通道打包方式根据目标引擎来定。Unity 的 Standard Shader 需要 Metallic 和 Smoothness 打包在同一张贴图的 R 和 A 通道,ArmorPaint 的导出预设里有对应的选项。Unreal 的打包方式不同,Metallic、Roughness、AO 分别打包在 R、G、B 通道。Godot 的 ORM 贴图也是类似的打包逻辑。ArmorPaint 支持自定义打包,你可以把任意通道映射到输出贴图的任意通道,非常灵活。
导出前记得检查贴图的命名和路径。我习惯用模型名加通道名的命名方式,比如 Crate_BaseColor.png、Crate_Normal.png,这样在引擎里导入时不容易搞混。导出路径建议用英文,避免中文路径导致的兼容性问题。
5. 常见问题排查与性能优化经验
5.1 笔刷延迟与显存占用的平衡
ArmorPaint 用久了最容易遇到的问题就是笔刷延迟。表现是笔刷移动时,模型表面的纹理更新跟不上,有明显的滞后感。这个问题通常和显存占用有关。ArmorPaint 的每个图层、每个通道都对应一张纹理,图层越多、分辨率越高,显存占用越大。当显存接近满载时,GPU 的纹理交换会变慢,导致笔刷延迟。
我的解决思路是分层管理。绘制初期用 1K 或 2K 分辨率,图层数量控制在 10 层以内。完成大部分绘制后,把不需要再调整的图层合并,减少图层数量。最后再切换到 4K 分辨率做细节。ArmorPaint 的图层合并功能在图层右键菜单里,合并后的图层会保留所有通道数据,不会损失信息。
另外,ArmorPaint 的设置里有一个 Undo Steps 参数,默认是 16。这个参数控制撤销步数,每一步都会占用显存。如果你的显存比较紧张,可以把 Undo Steps 降到 8 或 4。虽然撤销步数少了不太方便,但能显著降低显存占用。我一般在绘制阶段设为 16,导出前设为 4,释放显存。
5.2 UV 接缝处的绘制技巧
UV 接缝是贴图绘制的老大难问题。ArmorPaint 里处理接缝有几个技巧。首先是笔刷的 Wrap 模式,开启后笔刷在 UV 边界处会自动环绕,绘制跨接缝的纹理时不会出现断裂。这个模式在笔刷设置里可以找到,做无缝纹理时非常有用。
其次是接缝的后期处理。如果接缝处有明显的颜色不连续,可以用 Blur 笔刷在接缝两侧轻轻涂抹,让颜色过渡更自然。ArmorPaint 的 Blur 笔刷在笔刷列表里,它的作用是对当前图层的像素进行模糊处理。涂抹时注意力度要轻,否则会把细节也模糊掉。
还有一个技巧是在 Blender 里做 UV 的时候就把接缝藏好。接缝尽量放在模型的背面、底面或者结构转折处,避免出现在视觉焦点区域。如果接缝必须出现在显眼位置,可以在接缝处设计一个结构线或者装饰条,用几何体来掩盖接缝。
5.3 节点系统的调试与优化
节点系统虽然强大,但节点网络复杂了之后,调试和优化就成了问题。ArmorPaint 的节点系统没有内置的性能分析工具,你只能通过观察视图的帧率来判断节点网络的性能开销。如果帧率明显下降,说明节点网络太复杂了。
我的优化经验是:尽量用低分辨率的节点生成遮罩,然后用 Resize 节点放大。比如噪声节点默认生成 2K 的纹理,如果你只需要一个粗略的遮罩,可以把噪声节点的分辨率设为 512,然后用 Resize 节点放大到 2K。这样能显著降低 GPU 的计算量。另外,节点网络里的 Blur 节点和 Warp 节点开销比较大,能少用就少用。如果必须用,尽量降低采样质量。
节点网络的另一个问题是可读性。复杂的节点网络很容易变成一团乱麻,过几天自己都看不懂。我的习惯是用 Frame 节点把相关的节点框在一起,加上注释。ArmorPaint 的 Frame 节点可以自定义颜色和标签,用不同颜色区分不同的功能模块,比如红色框是遮罩生成,蓝色框是颜色调整,绿色框是纹理采样。这样节点图看起来就清晰多了。
5.4 跨平台兼容性与文件管理
ArmorPaint 支持 Windows、Linux、macOS 三个平台,项目文件是 .arm 格式。跨平台使用时需要注意几点。首先是路径问题,ArmorPaint 的项目文件里保存的是相对路径,如果你把项目文件移动到其他目录,贴图和模型可能会丢失。建议把项目文件、模型、贴图放在同一个文件夹里,整体移动。
其次是版本兼容性。ArmorPaint 的更新比较频繁,新版本可能会修改项目文件的格式。如果你用旧版本打开新版本创建的项目,可能会遇到兼容性问题。我的习惯是每个项目完成后,导出一份最终的贴图,同时保存一份项目文件的备份。这样即使以后 ArmorPaint 的版本不兼容了,至少贴图还在,可以重新导入到其他软件里继续编辑。
最后是文件大小。ArmorPaint 的项目文件会保存所有图层的纹理数据,文件大小可能达到几百 MB 甚至几个 GB。如果硬盘空间紧张,可以在项目完成后删除一些中间图层,或者把项目文件压缩保存。ArmorPaint 支持导出项目为压缩包,压缩率还不错,能省不少空间。
6. 从 ArmorPaint 到游戏引擎的贴图管线衔接
6.1 Unity 的 Standard Shader 适配
Unity 的 Standard Shader 使用金属度-光滑度工作流,贴图打包方式和 ArmorPaint 的默认输出略有不同。Standard Shader 的 Metallic 贴图里,R 通道是金属度,A 通道是光滑度。光滑度是粗糙度的反向值,也就是 1 减去粗糙度。ArmorPaint 导出时可以选择 Smoothness 通道,它会自动计算粗糙度的反向值,然后打包到 A 通道。
具体操作是在 ArmorPaint 的导出设置里,选择 Unity 的导出预设,或者手动配置通道映射:Base Color 映射到 Albedo,Normal 映射到 Normal,Metallic 映射到 Metallic 的 R 通道,Smoothness 映射到 Metallic 的 A 通道,AO 映射到 Occlusion。Height 贴图 Unity 的 Standard Shader 不用,但如果你用了视差贴图或者曲面细分,可以单独导入。
导入 Unity 后,记得把 Normal 贴图的 Texture Type 设为 Normal Map,否则法线效果会不对。Metallic 贴图的 Texture Type 设为 Default,sRGB 选项要取消勾选,因为金属度和光滑度是线性数据,不是颜色数据。Base Color 和 AO 贴图保持 sRGB 勾选。这些设置看起来琐碎,但直接影响最终的渲染效果,不能马虎。
6.2 Unreal 的材质节点连接
Unreal 的材质系统更灵活,贴图打包方式也不同。Unreal 通常把 Metallic、Roughness、AO 打包在一张贴图的 R、G、B 通道,这张贴图一般叫 ORM 或者 MRA。ArmorPaint 导出时可以选择 Unreal 的导出预设,它会自动把这三个通道打包好。
在 Unreal 的材质编辑器里,你需要创建一个材质,然后添加 Texture Sample 节点,把 ORM 贴图连上去。然后用 Component Mask 节点分离 R、G、B 通道,分别连接到 Metallic、Roughness、AO 输入。Base Color 和 Normal 贴图单独连接。Unreal 的 Normal 贴图需要设置 Compression Settings 为 Normalmap,否则法线效果会出错。
Unreal 的材质系统还支持一些高级特性,比如曲面细分、视差遮蔽、清漆层等。ArmorPaint 导出的 Height 贴图可以用在曲面细分或者视差遮蔽上,增加模型的表面细节。清漆层效果可以用 ArmorPaint 的 Clear Coat 通道导出,然后在 Unreal 里连接到 Clear Coat 输入。这些高级特性在写实渲染里很有用,但会增加渲染开销,需要根据项目需求权衡。
6.3 Godot 的 ORM 贴图与 Shader 适配
Godot 4 的 StandardMaterial3D 也使用 ORM 贴图,打包方式和 Unreal 类似。ArmorPaint 导出的 ORM 贴图可以直接用在 Godot 里。Godot 的材质设置里,把 ORM 贴图连接到 ORM 输入,Base Color 连接到 Albedo,Normal 连接到 Normal。Godot 的 Normal 贴图需要设置 Import 选项里的 Normal Map 为 Enable,否则法线效果不对。
Godot 的 Shader 系统比较开放,你可以自己写 Shader 来实现更复杂的材质效果。ArmorPaint 导出的通道贴图可以自由组合,比如你可以把 Height 贴图用在顶点位移上,把 AO 贴图用在环境光遮蔽上,把 Roughness 贴图用在屏幕空间反射的粗糙度输入上。Godot 的 Shader 文档比较完善,社区也有很多现成的 Shader 可以参考。
Godot 的一个小坑是贴图的 sRGB 设置。Base Color 和 AO 贴图需要开启 sRGB,Metallic、Roughness、Normal、Height 贴图需要关闭 sRGB。如果设置错了,渲染出来的颜色会偏亮或偏暗,金属感也会不对。这个设置在 Godot 的 Import 面板里可以调整,导入贴图后记得检查一下。
6.4 贴图管线的自动化与批处理
如果你经常需要处理大量模型的贴图,手动导出和导入会很繁琐。ArmorPaint 支持命令行导出,你可以写一个脚本,批量处理项目文件,自动导出贴图。ArmorPaint 的命令行参数在官方文档里有说明,基本用法是指定项目文件和导出路径,然后调用导出命令。
Unity 和 Unreal 也支持贴图导入的自动化。Unity 有 AssetPostprocessor,你可以写一个脚本,在贴图导入时自动设置 Texture Type、sRGB、压缩格式等参数。Unreal 有 Python 脚本接口,可以批量导入贴图并创建材质。这些自动化手段在大型项目里能省不少时间,建议花点精力研究一下。
我自己写过一个 Unity 的 AssetPostprocessor 脚本,逻辑是检查贴图文件名,如果包含 _BaseColor 就设为 sRGB 和 Default 类型,如果包含 _Normal 就设为 Normal Map 类型,如果包含 _ORM 就取消 sRGB 并设为 Default 类型。这个脚本虽然简单,但每次导入贴图时都能省去手动设置的麻烦,积少成多,效率提升很明显。
7. 我个人的使用体会与后续扩展思路
ArmorPaint 用了两年多,最大的感受是它在开源工具里做到了难得的完成度。它的核心功能已经非常稳定,图层系统、笔刷系统、节点系统都能满足日常的贴图绘制需求。当然它也有一些不足,比如 UI 的交互细节不如商业软件那么精致,某些高级功能(比如粒子笔刷的物理模拟)还比较基础,文档和教程也相对较少。但这些不足在开源免费的前提下完全可以接受,而且它的源码开放,你可以自己改,自己加功能,这种自由度是商业软件给不了的。
后续我打算深入研究一下 ArmorPaint 的 Shader 系统,看看能不能自定义一些特殊的材质效果,比如各向异性金属、次表面散射、清漆层等。ArmorPaint 的 Shader 是用 Kha 的 Shader 语言写的,语法类似 GLSL,有图形编程基础的话上手不难。另外,ArmorPaint 的插件系统也值得研究,它支持用 Haxe 写插件,可以扩展编辑器的功能,比如添加自定义的导出格式、自定义的笔刷类型等。
如果你也在用 ArmorPaint,或者正在考虑从其他贴图软件迁移过来,我的建议是先从一个小项目开始,熟悉它的图层逻辑和节点系统,然后再逐步应用到正式项目里。它的学习曲线不算陡峭,但需要一点耐心去适应它的工作方式。一旦上手之后,你会发现它的效率和灵活性在开源工具里是数一数二的。