开源PBR材质绘制工具ArmorPaint:轻量替代Substance Painter的工作流实践
如果你是个经常在 Blender 和游戏引擎之间来回搬运资产的 3D 美术armorpaint 这个名字大概率已经被某个开源讨论区的老哥安利过不下三次。我第一次听到它是在某个线上 Game Jam 的语音频道里有人喊了一句“别用盗版 SP 了ArmorPaint 免费的直接下”。坦白说我当时没太当回事毕竟 Substance Painter 的生态太成熟了教程满天飞公司项目里也都是它。但当我真的花一个下午把 ArmorPaint 跑通之后我开始重新审视自己那套“买不起就找绿色版”的流程到底图什么。ArmorPaint 是一个独立的 3D 纹理绘制软件由 Armory3D 引擎团队维护主打实时 PBR 材质绘制支持图层、程序化材质节点、遮罩和烘焙。简单说它填补了 Blender 自带 Texture Paint 和 Substance Painter 之间的空档比 Blender 那套更适合做游戏资产又比 SP 轻量太多而且开源免费、可以商用。适合独立开发者、学生、接外包的自由美术以及想摆脱订阅制的从业者。下面我按自己的实际操作路径把这套工作流掰开揉碎讲清楚。1. ArmorPaint 的定位为什么要拿它替代 Substance Painter1.1 从“Blender 里硬画”到“独立的 PBR 绘制工具”Blender 自带的 Texture Paint 其实一直在进步但当你面对一套 4096 分辨率的 PBR 贴图需要同时维护 Base Color、Roughness、Metallic、Normal 这些通道时它那种“一个纹理对应一个画笔画出来”的思路就有点太原始了。你只能在 UV 视口和 3D 视口之间反复横跳想调整粗糙度还得去 Shader Editor 里配节点效率低得让人想砸数位板。ArmorPaint 的思路跟 Substance Painter 更像把模型导入到一个独立环境里给它创建一组纹理然后在 3D 视口上直接用笔刷去画。所有通道、图层和遮罩都实时叠加显示在模型表面不需要你在几个编辑器窗口之间来回折腾。这种工作流最大的价值是“所见即所得”——你拖一个金属度渐变节点模型表面立刻就变亮不用等渲染器刷新。很多新手会问Blender 里明明也能做到类似效果为什么要单独用一个软件我的回答是工具越专注越好。ArmorPaint 把 99% 的界面都留给了绘制本身没有关键帧、没有渲染输出栈、没有动画曲线。打开它你就只做一件事画贴图。对于单帧游戏资产和硬表面道具这种专注能让你的注意力全都集中在材质表现上而不是被 Blender 的上下文切换打断。1.2 技术底牌Haxe 和 Iron 运行时决定了它的启动速度ArmorPaint 是用 Haxe 语言写的底层运行时是 Iron 框架。这回答了很多人第一次启动时的疑问“为什么这个工具启动这么快”对比 Substance Painter 那种偏重的 C 工程ArmorPaint 启动基本上三秒以内界面全屏显示视口没有欢迎页、启动引导、云端登录。你双击图标喝了口水它已经停在默认场景等你拖模型了。轻量不等于简陋。它自带基于物理的实时渲染视口能显示环境光、反射、AO、软阴影让你在绘制过程中看到的材质效果就非常接近最终引擎效果。我印象最深的是画金属拉丝时笔刷能把噪声纹理映射进高光反射里那种实时反馈是 Blender 内置绘制没有的。开源这件事还带来一个隐藏优势社区修复 bug 的速度往往比商业软件快。我遇到过某个版本在 AMD 显卡上花屏的问题去 GitHub Issues 逛了一圈发现隔天就有热心人提交了修复补丁并给出临时编译版。这种“出了问题能追到源码层面”的踏实感是闭源软件给不了的。1.3 它和 Substance Painter、Quixel Mixer 的真实差距我身边总有人问“既然 SP 那么强我为什么要用 ArmorPaint”我一般会先承认差距SP 的智能材质、智能遮罩、粒子笔刷、庞大的烘焙工具链以及丰富的资产库ArmorPaint 确实比不过。如果你是做 AAA 角色或大场景地编而且团队统一用 SP那就别换没有意义。但如果你是做独立游戏、风格化低模、硬表面道具或者只是需要一个轻量工具快速出图ArmorPaint 的优势就很明显。我用一个表格直观对比三款工具对比项ArmorPaintBlender Texture PaintSubstance Painter多通道图层支持有限完整程序化材质节点支持需要通过着色器节点间接实现支持 Smart Material实时 PBR 视口有有但偏编辑器化有且很强价格开源免费免费订阅制启动速度快中等偏慢学习成本低中高适合场景独立游戏、硬表面、风格化简单绘制、UV 调试AAA 质量资产可以看出ArmorPaint 和 SP 不是“谁完全替代谁”的关系而是两条不同成本曲线的选择。我自己对它的定位是出差、个人项目、快速原型阶段的主力工具Sp 则留着接需要 PSD 交付或超大纹理量资产的商业单。两者并存一点也不矛盾。2. 下载、启动和第一次上手30 分钟跑通基础流程2.1 选择哪个版本ArmorPaint 的发布渠道比较分散。官网首页会同时放 Steam 商店入口和 GitHub Release 链接。Steam 版的好处是自动更新适合不想折腾环境变量和依赖的人GitHub Release 则是纯绿色包解压就能用适合喜欢固定版本、不想被自动更新打乱工作流的人。我第一次下载时踩了坑直接搜“armorpaint 下载”进了第三方下载站装下来的版本又旧又夹带捆绑。后来才明白正路只有官网和 GitHub 的 Releases 页面别走任何镜像站。如果你对版本号没有执念就选 Latest Release而不是 Nightly。每天更新版可能刚合入新功能但往往也伴随着未调试完的渲染问题我自己被 Nightly 版的材质预览 bug 坑过一次之后就老实了。2.2 启动逻辑和界面布局启动 ArmorPaint 后你会先看到一个默认场景里面通常有个基础立方体或球体方便你快速试验材质。界面是单页布局中间是实时 3D 视口左侧是工具栏、笔刷设置和颜色选择右侧是图层堆栈和纹理集列表顶栏是文件、编辑、烘焙和导出菜单。没有传统意义上的多窗口拖拽全靠单一视口承载所有操作这一点和 Krita 整体布局有点像习惯后效率很高。如果你在虚拟机、老旧笔记本或某些 Linux 环境下打不开多半是 Vulkan 驱动不兼容。官方文档里有切换到 OpenGL 后端的说明具体做法可以通过命令行参数或启动器设置。遇到窗口闪退先查显卡驱动再查系统缺了什么运行库别第一时间赖软件。2.3 核心操作链从导入模型到画出一条污渍跑通基础流程其实只用四步准备一个带 UV 的模型OBJ、FBX、glTF 都可以。重点是把模型放在原点附近坐标不对的话后面烘焙 AO 会很难受。在 File 菜单里导入模型。拖拽文件到视口通常也能直接导入但拖拽偶尔会丢失默认缩放比例所以我更习惯用菜单导入确保单位一致。在右侧纹理集面板创建一个新纹理集勾选你需要的几个通道比如 Base Color、Roughness、Metallic、Normal尺寸可以先设 2048×2048。如果电脑显存紧张1024 起步也没问题。新建一个图层选一个基础笔刷调整颜色直接在模型表面画。你会发现同一笔下去Base Color 和 Roughness 两层的效果是分开的画在哪里、影响哪个通道都由当前激活的图层和通道决定。我建议你在正式画项目之前先在这个默认场景里把几个通道玩明白把 Roughness 拉到 0.2 会有什么反射表现Metallic 拉满后颜色反馈有什么变化Normal 图层上画黑色凹坑是什么效果。这十几分钟熟悉手感的时间能帮你省下后面大量返工。3. 图层、程序化节点和遮罩一套被低估的纹理生成系统3.1 图层系统不是像素图层而是通道堆栈ArmorPaint 的图层系统看起来像 Photoshop但底层逻辑大不相同。普通像素绘画的图层里存的是颜色然后通过混合模式叠加ArmorPaint 的每个图层可以包含多种通道数据比如这个图层里你既可以画 Base Color又可以同时只影响 Roughness 通道。图层的混合选项也更贴近 PBR 属性支持类似“正片叠底”“线性减淡”“叠加”等常用的模式但最终呈现的是不同贴图通道混出来的结果。我最常用的一个操作是画完底色后新建一个图层把混合模式设为“正片叠底”然后用一个随机噪声程序化节点作为这个图层的源再控制它的透明度。这样我可以在不破坏底色细节的前提下快速给大面积物体边缘叠加一层脏旧感。但注意图层数量不是越多越好。每个图层在实时视口里都要参与计算超过二三十层后你会明显感觉到笔刷延迟上升。我的经验是能用节点解决的问题就不要开新图层。3.2 程序化节点不是滤镜而是实时生成的贴图通道程序化节点是 ArmorPaint 最被低估的功能。你可以在一个图层上添加节点图把噪声、渐变、颜色校正、数学运算等节点连起来让这个图层像 Shader 一样实时生成纹理。这个概念很适合做过 Blender Shader Editor 的人你不是在“画”贴图而是在“编程”贴图。举个例子要给一把枪的握把做防滑纹路我不需要手动逐条画线条而是在 Roughness 通道上加一个高度噪声节点让它在高光区域产生随机起伏再通过一个遮罩限制在握把的上半部分。程序化节点在绘制过程中是实时生成的所以我可以随时调整噪声密度、对比度和颜色输出直到现场看起来满意为止。不过要提醒一点程序化图层在导出前需要被“栅格化”或“冻结”成普通位图否则外部引擎接收不到它的实时计算结果。ArmorPaint 里通常在图层右键菜单能找到类似 Flatten 或 Rasterize 的选项把节点层转成普通图层。我习惯在每次导出前把所有程序化图层都转成位图顺便检查一遍有没有意外透明的区域防止导出后才发现贴图缺失。3.3 遮罩和材质 ID不用手动套索也能精准绘制画贴图最怕的一件事就是选区不准。ArmorPaint 提供了几种遮罩方式来解决这个问题。最简单的是基于颜色遮罩根据模型表面已有纹理的颜色值来限定笔刷的可应用区域。你把遮罩设成“只影响金属色区域”笔刷就只会擦到金属质感的表面不会碰到旁边橡胶边缘。更常用的是材质 ID 遮罩。很多建模软件里可以给不同部件指定材质ArmorPaint 能读取这些材质分组把它们当作遮罩对象。比如绘制赛车车身时我想让左侧车门被锈蚀但如果直接画会画到车玻璃上。正确做法是先创建一个“门板”材质 ID 的遮罩图层再在这个遮罩层上用笔刷画出生锈区域两个条件同时满足才会真的影响最终的 Roughness 贴图。这一套组合逻辑和 Substance Painter 的“黑名单/白名单遮罩”思路异曲同工但理解起来反而更简单。4. 从烘焙到导出把贴图喂给 Unity、Godot 或 Blender4.1 烘焙前必须检查的几件事很多新手画完贴图、高高兴兴导出结果到引擎里一看模型上全是接缝裂缝第一反应是“ArmorPaint 导出有问题”其实问题大多出在 UV 和烘焙设置上。首先模型一定要有合理的 UV 展开。ArmorPaint 的烘焙依赖 UV如果你的 UV 岛之间没有 padding边距烘焙出的 AO 和 Normal 图很容易串色。通常我会在 Blender 里展开 UV 时把 Active Image 的 padding 设为 4 像素以上或者让每个 UV 岛间距保持在几个像素以上。其次烘焙 AO 前建议先给模型加一个轻微的光滑组或足够高的细分。因为 AO 是模拟环境光遮蔽模型面数太低会导致烘焙出的暗部一块一块的像掉进煤堆里。你可以用更高精度的“烘焙源模型”来产出 AO然后再把 AO 纹理映射到低模上这是游戏行业的常规流程。4.2 导出通道的选择和命名规范ArmorPaint 的导出流程是选择目标纹理集导出所有需要的通道图像。常见的导出配置大概是Base Color 对应引擎里的 Albedo存储颜色信息注意不要带光照。Roughness 存储粗糙度纯黑是镜面纯白是完全粗糙。Metallic 存储金属度大部分模型 0 到 1 之间不会有中间值。Normal 存储切线空间法线通常需要在引擎里设置为 Normal Map。AO 和 Cavity曲率可以作为附加贴图在引擎里通过乘法叠加进间接光或者后期效果。导出时我建议把文件名统一成“模型名_通道名”的格式比如 barrel_basecolor.png、barrel_roughness.png。引擎里连接材质时这些命名能让你一眼看清哪个贴图用到哪里尤其在多人协作时杂乱命名会浪费大量沟通成本。4.3 在 Blender 里还原 ArmorPaint 的实时效果把贴图带回 Blender 很简单新建一个 Principled BSDF 材质把 Base Color、Roughness、Metallic、Normal 分别接入对应输入点。但要注意ArmorPaint 视口显示的是它自己内置渲染器的结果环境和 Blender 默认灯光不同所以回到 Blender 后颜色会有肉眼可见的差异。我的经验是导出前先把 ArmorPaint 的环境光切换成和你引擎差不多的中性环境再调整一下整体曝光这样导出的贴图在外部渲染器里不会偏太多。如果你用的是 Blender 的 EEVEE建议把视口环境改成单色灰球关闭默认的 Studio Lighting这样对比 ArmorPaint 时才能看出真正的贴图差异。4.4 烘焙 AO 和曲率的实战注意点ArmorPaint 的 AO 烘焙我通常这样控制设置一个合理的半径值太大容易糊成一团太小细节全无。一般以模型的整体尺寸来估算比如一把 20cm 长的枪AO 半径设在 1-2cm 左右比较合理。曲率Curvature则用来生成边缘高光和掉漆区域半径越小越能捕捉锋利边缘。需要注意的是烘焙结果如果发现 UV 边界有白边或黑边先回 UV 编辑器把 padding 改大重新展开而不是在图像后期里硬修。边缘溢色问题最好的解决办法就是让 UV 岛之间留出足够间隙这一点在任何纹理工具里都适用ArmorPaint 也不例外。5. 我踩过的坑和现在的工作流习惯5.1 笔刷延迟突然变高先查这三点用 ArmorPaint 画大型模型时我心里评估笔刷延迟的优先级是纹理分辨率 图层数量 撤销缓冲。如果你把纹理集设成了 8192×8192又叠了十几层程序化节点再强的显卡也会明显卡顿。我的解决习惯是高分辨率贴图只在最终导出前切换日常绘制用 2048。绝大多数游戏资产在手机平台根本用不到 8192没必要提前为它浪费性能。图层数量超出 20 层就要考虑合并比如说把已经满意的阴影层和底色层合并成一个基础层后续只需要在这个合并层上继续编辑。5.2 UV 接缝处出现虚线状断裂这种问题十次有八次是 UV 岛间没留出血。ArmorPaint 绘制时笔刷会跨 UV 边界但导出时如果没有足够的边缘像素扩展引擎里就会在接缝位置出现明显的断裂。如果你在 ArmorPaint 里已经画完了才发现出血不够别慌可以重新导出纹理集导出设置里通常会有类似“Edge Padding”或“Dilation”的选项把扩张像素设大一些能救回一部分接缝问题。真正稳妥的做法是在建模阶段就保证 UV 岛间距充足。我一般在 Blender 里用 UV Packmaster 排完 UV 后会特意开启像素边距检测让每个岛的边缘至少有一圈像素是空白的再导入 ArmorPaint。5.3 Nightly 版本项目文件不兼容开源软件快速迭代的另一面是版本兼容性不稳。我曾经用某个 Nightly 版画了两天的项目隔天更新后打开直接提示版本过新无法加载。我还算幸运项目文件本体没损坏但版本回滚后界面布局设置全丢了。从那以后我的规则是个人项目用稳定版只在测试新功能时用 Nightly而且每个版本开始大改之前先手动备份一份工程文件。ArmorPaint 的工程文件不算大几百 MB 也很快就复制完放在网盘和移动硬盘各一份比任何自动同步都可靠。5.4 和团队协作时的文件交换策略如果你不是一个人干活文件格式始终是绕不开的坎。ArmorPaint 目前最省事的协作方式是导出一整套贴图作为交换格式同时保留一份 ArmorPaint 工程文件。你给队友贴图对方在任意引擎或 DCC 里都能正常使用你给自己留工程文件方便后续继续修改。我见过有人试图让队友也装上 ArmorPaint直接用工程文件互相改结果双方版本不一致开一次崩一次。所以我们团队现在的纪律是ArmorPaint 工程文件只在本地使用任何上传到版本库的资产都必须是引擎能直接识别的贴图格式。靠贴在工程文件上流程反而更顺。最后再说一个私藏小习惯画完一个资产后点一下“统计/压缩贴图”之类的功能具体入口看版本把纹理集重采样到目标分辨率再导出。这样既能减小包体又能逼自己检查到底哪些通道是真正需要的。很多新手导出时把 Emissive、Cavity、Opacity 全勾上结果引擎里 80% 都没接到材质球上纯属白占显存。这种“多不如少”的整理思路在 ArmorPaint 里试验成本很低多试几次就能找到适合自己项目的一条稳定流程。