开源PBR材质绘制工具ArmorPaint:轻量替代Substance Painter的工作流实践
2026/9/14 18:37:17 网站建设 项目流程

如果你是个经常在 Blender 和游戏引擎之间来回搬运资产的 3D 美术,armorpaint 这个名字大概率已经被某个开源讨论区的老哥安利过不下三次。我第一次听到它是在某个线上 Game Jam 的语音频道里,有人喊了一句“别用盗版 SP 了,ArmorPaint 免费的,直接下”。坦白说,我当时没太当回事,毕竟 Substance Painter 的生态太成熟了,教程满天飞,公司项目里也都是它。但当我真的花一个下午把 ArmorPaint 跑通之后,我开始重新审视自己那套“买不起就找绿色版”的流程到底图什么。

ArmorPaint 是一个独立的 3D 纹理绘制软件,由 Armory3D 引擎团队维护,主打实时 PBR 材质绘制,支持图层、程序化材质节点、遮罩和烘焙。简单说,它填补了 Blender 自带 Texture Paint 和 Substance Painter 之间的空档:比 Blender 那套更适合做游戏资产,又比 SP 轻量太多,而且开源免费、可以商用。适合独立开发者、学生、接外包的自由美术,以及想摆脱订阅制的从业者。下面我按自己的实际操作路径,把这套工作流掰开揉碎讲清楚。

1. ArmorPaint 的定位:为什么要拿它替代 Substance Painter

1.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 核心操作链:从导入模型到画出一条污渍

跑通基础流程其实只用四步:

  1. 准备一个带 UV 的模型,OBJ、FBX、glTF 都可以。重点是把模型放在原点附近,坐标不对的话后面烘焙 AO 会很难受。
  2. 在 File 菜单里导入模型。拖拽文件到视口通常也能直接导入,但拖拽偶尔会丢失默认缩放比例,所以我更习惯用菜单导入,确保单位一致。
  3. 在右侧纹理集面板创建一个新纹理集,勾选你需要的几个通道,比如 Base Color、Roughness、Metallic、Normal,尺寸可以先设 2048×2048。如果电脑显存紧张,1024 起步也没问题。
  4. 新建一个图层,选一个基础笔刷,调整颜色,直接在模型表面画。你会发现,同一笔下去,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 或 Blender

4.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 里试验成本很低,多试几次就能找到适合自己项目的一条稳定流程。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询