ArmorPaint实战:GPU实时PBR贴图绘制与多引擎导出指南
2026/9/14 20:58:23 网站建设 项目流程

ArmorPaint这个名字,最初是一个朋友甩给我让我“有空玩玩”的。当时我正被两件事折磨:一是Substance Painter的订阅价格对业余项目来说实在不友好,二是用Blender自带的Texture Paint画低模武器时,那个视口刷新速度和图层体验,实在让人提不起劲儿。后来才搞清楚,这是一款基于Rust编写、完全跑在GPU上的三维纹理绘制软件,能用实时渲染的方式直接在模型表面画PBR贴图,图层、蒙版、材质节点一套下来,很多原本要在Photoshop里苦熬的流程全部省掉了。

这篇东西不打算写成官方文档搬运,而是把我从零开始用ArmorPaint做完几个完整项目后的真实经验整理出来。内容包括:它到底解决什么问题、上手前必须建立的几个核心概念、一套能直接照抄的低模道具PBR贴图流程、我踩过的坑,以及如何把成品顺畅导出到Blender、Unity这些目标引擎。适合谁看?想找免费替代Substance Painter方案的人、对GPU实时绘制感兴趣的开发者,以及所有做低模、做道具、做独立游戏但不想在贴图工具上花太多时间的人。

1. ArmorPaint不是“穷人的Substance Painter”,它的核心逻辑完全不同

1.1 它到底是什么定位

ArmorPaint是由Armory 3D引擎作者Lubos Lenco发起的一个开源项目,整个软件用Rust编写,底层走wgpu这套图形抽象,能在Vulkan、Metal、DX12上运行。它的核心做法很直接:所有绘制、预览、烘焙操作都在GPU上实时完成,你在模型表面落一笔,立刻就能看到带光照反馈的最终质感,而不是像传统流程那样画完还得切到渲染器里看一遍。

很多人把它当成Substance Painter的“平替”,我觉得这个类比其实不准确。ArmorPaint不像SP那样背靠庞大的智能材质库和商业生态,它的优势在另外几个方向:轻、快、实时、开源,以及和Armory引擎共享同一套材质节点语法。

我的实际感受是:它更接近“把Photoshop搬到3D模型上”,配合节点材质后又能玩出很多程序化生成的花样。

1.2 和几款主流方案放在一起看

对比维度ArmorPaintSubstance PainterBlender Texture Paint
价格开源免费,也提供Steam付费支持版订阅制,价格较高完全免费
实时视口基于GPU的实时光照预览,响应很快也需要强GPU,预览效果好视口和绘制预览偏弱
图层能力图层、蒙版、填充、智能材质节点非常成熟,生态丰富图层功能较基础
材质节点有节点编辑器,可做程序化材质有智能材质,但面向特定流程没有独立节点材质绘制编辑器
引擎导出内置Blender/Unity/Unreal/Godot等预设有全套引擎导出通道需要手动搭节点
学习成本熟悉PS图层逻辑就能很快上手功能复杂,学习周期长学习成本低但上限也低
GPU要求需要支持Vulkan/Metal/DX12的现代GPU越高越好CPU/GPU都行,但实时性差

这个表格是我个人感受的综合体,不是跑分结果。重点想说的是:选择工具之前先想清楚自己的痛点到底是什么。如果你需要的是上百种带智能遮罩的预设材质,ArmorPaint可能会让你不满足;如果你只是想把手里几十个低模道具快速做成能进引擎的PBR贴图,那ArmorPaint是效率极高的选择。

1.3 我实测后的适配人群判断

用了一年之后,我认为ArmorPaint最适合这几类人:

  • 独立游戏开发者或业余做3D内容的人,需要频繁给低模、道具、场景物件出贴图;
  • 喜欢开源工具链、希望在Blender之外有一个高效绘制软件的人;
  • 使用Armory 3D引擎做项目的人,这套绘制节点可以和引擎直接联动;
  • 想理解PBR材质和图层逻辑的初学者,因为它把概念暴露得非常直观。

不太适合的人也有:需要多人协作在超大项目里统一管理材质资产、依赖庞大材质库快速出效果、需要大量视频教程支撑的人,ArmorPaint的社区生态目前确实偏薄,多数问题得靠GitHub Issues和文档自解决。

2. 上手前必须搞懂的三个概念:纹理集、UV、通道与图层

2.1 纹理集(Texture Set)到底在设置什么

很多人第一次打开ArmorPaint,新建文档时会看到一个“纹理集”数量的选项。我当时没当回事,之后才发现这个选择决定了整个工作流的组织方式。

可以这样理解:一个纹理集就是一组配套的PBR贴图的打包单位。比如做一个角色,身体、衣服、武器如果分别想用不同分辨率的贴图,就需要拆成三个纹理集,每个纹理集自带Base Color、Metalness、Roughness、Normal等一组通道,导出时也会各自产出一套贴图文件。

第一次做项目时我建议克制一点:能用1个纹理集就先不要拆成多个,把不同部件的UV摊进同一张UV空间里。多纹理集意味着显存占用更高、图层管理更复杂、导出文件更多,对新手来说没必要。

分辨率的选择也是同理。纹理集分辨率直接决定这张贴图在显存里的开销,2048对于大多数低模道具绰绰有余。只有那种需要特写、或者模型本身细节非常多的物件,才值得上4096。

2.2 UV展开是ArmorPaint里最不能偷懒的环节

ArmorPaint本身不提供自动展UV的功能,它假定你导入的模型已经有一张干净、无重叠、低拉伸的UV。

这一点比很多人的预期更严格。UV若存在重叠,绘制时两处区域会互相影响,你在模型这一面画的锈迹,另一面可能突然冒出来一块;UV区域拉伸过大,笔刷落上去的形状会变形。

我的固定做法是:在Blender里完成建模以后先进入UV Editing工作区,把各个部件摊平;然后开启“显示拉伸”着色方式,确保拉伸程度显示为深蓝色;确认没有重叠后,先导出一次OBJ,导入ArmorPaint里试画两笔,检查笔触形变是否正常,再继续往下做。

这一步不熟练的建议在Blender里多花点时间,因为ArmorPaint里的绘制体验很舒服,但前提是UV要扎实。

2.3 PBR通道和图层的关系:它不是单纯PhotoShop,但理解了图层就懂了一半

ArmorPaint的绘制模型非常像Photoshop。你可以在软件里建立一个纯色填充层,在上面叠加一个带噪点纹理的材质层,再给这个材质层加一个黑色蒙版,用白色笔刷在模型表面擦出想要显示的区域。

关键区别在于:图层的输出不是单一的RGB,而是对应到了PBR的每个通道。同一个图层可以只输出颜色,也可以同时输出金属度、粗糙度和法线信息。这意味着你不需要“一个贴图画一遍”,而是可以通过图层之间的叠加和蒙版控制不同通道的联动变化。

比如金属生锈这个效果:木头柄是Base Color层加高粗糙度;斧头金属部分是另一个填充层,Metalness设置为1,Roughness设为0.3;锈迹是一个额外的材质层,颜色偏棕红,Roughness很高,然后用一个低透明度笔画作为蒙版,擦在哪里哪里就“生锈”。

这种工作流,本质上和你在Photoshop里给照片加质感叠层是一模一样的思维,只不过每一层的影响范围不再由像素边界决定,而是由模型表面的蒙版决定。

3. 完整实战:一把战损斧头的PBR贴图制作流程

3.1 在Blender里准备模型并导出OBJ

先讲模型准备。我通常使用一个比较简单的道具模型来做演示,比如一把斧头:金属斧头部分、木头手柄、缠绕的皮革这样三个部件。

在Blender里需要做的是:

  • 拆UV并尽可能减少UV岛之间的接缝落在太明显的位置;
  • 给三个部件分别指定三个材质槽,方便之后在ArmorPaint里用材质ID来区分;
  • 应用物体的缩放和旋转(Ctrl+A 选择All Transforms),否则导入ArmorPaint后可能出现轴向不对、笔刷方向歪掉的问题;
  • 导出为OBJ格式,导出时勾选“应用修改器”和“仅选中物体”防止带入没必要的对象。

OBJ在ArmorPaint的导入选项里可以选择平滑角度,默认数值通常就够用。导入后先旋转、拖拽观察一段时间,确认布线方向和UV接缝是否符合自己的预期。

3.2 创建文档:一个纹理集还是三个?

我在这个演示项目里选择了一个纹理集、2048分辨率。因为斧头整体是一个可以摊在整张UV里的物体,一个纹理集足够了。

新建文档时要选择“模型 + 纹理集数”,选1个就好。之后在右侧的纹理集设置里可以看到对应的贴图通道列表。它们默认会生成Base Color、Metalness、Roughness、Normal等空纹理,我看了一遍确认无误后就开始工作了。

这里有一个值得记住的经验:2048和4096的差别在视口实时绘制时非常明显。如果你的显卡显存不超过8G,开4096再叠几十个图层,视口会明显变重,最后我在压力测试下甚至出现过几秒一卡的状况。低模道具真的没必要追求4K,2048贴到游戏场景里足够。

3.3 用材质ID快速区分区域,而不是手动刷蒙版

很多新手一上来就手动用画笔刷蒙版区分不同部件的范围,效率很低。我推荐的做法是先在Blender里分好材质槽,进入ArmorPaint后用顶部的Bake功能烘焙一张Material ID贴图,这张图上不同部件会显示不同颜色。

然后回到材质节点编辑器,把这张Material ID贴图作为一个图像输入,配合一个颜色阈值节点来生成蒙版,就能自动选中斧头头部的范围。把这个蒙版绑定到金属材质层上,金属层就只会出现在斧头头部;木头手柄和皮革缠绕同理,每一部分都能精确控制范围,不用一遍遍手动涂。

这套方法第一次配置时看着有点复杂,但一旦理解了“用贴图的颜色来驱动蒙版范围”这个思路,之后做任何复杂模型都会觉得非常顺手。

3.4 构建材质:给斧头加磨损和锈迹

基础材质分层我这样安排:

  • 第1层:木头手柄的BasColor和Roughness。用一个填充层,颜色选偏暗的棕黄色,粗糙度设为0.75左右,让木头有哑光感。
  • 第2层:皮革缠绕。在木头手柄靠下段做一个深棕色填充层,遮盖范围少一点,再通过一个基于坐标轴或蒙版的渐变来控制其只存在于手柄下半段。
  • 第3层:金属斧头。金属材质层的颜色选冷灰,Metalness设为1.0,Roughness设为0.25,营造较硬的金属表面。
  • 第4层:磨损层。这是最出效果的一步。我用一个白色噪声纹理作为这个层的蒙版,让金属层的Roughness在边缘处变高、颜色变暗,模拟漆面或者金属氧化层磨损后露出底层材质的感觉。噪声的缩放值需要根据模型大小反复试,找到“磨损集中在边缘和突出结构附近”的那个平衡点。

画完以后,我在斧头刃口位置用一笔细长的深色笔画,作为非常明显的使用痕迹。ArmorPaint的笔刷支持数位板压力感应,把手压力关掉、调低流量,就能画出一段自然的深浅变化。

3.5 导出前的检查与最终输出

导出前我通常会在视口里转几圈,打开一盏方向光从侧面打过来,确认粗糙度和法线变化在光照下是否自然。ArmorPaint支持多光源和HDR环境光,我在视口里会放一个中性色环境光,让金属质感看起来尽量接近最终引擎效果。

导出时选中目标引擎预设(这里选Blender),确认输出路径和文件名,软件会把Base Color、Metalness、Roughness、Normal等贴图一次性输出。选择Blender预设时,法线贴图会按OpenGL方向生成,导入Blender后直接连接到Principled BSDF的Normal输入即可。

4. 真实踩坑合集:ArmorPaint里最容易翻车的四个点

4.1 UV接缝处的颜色渗漏

这是我最开始做项目时最头疼的问题。UV接缝处的颜色似乎总是会“渗”到旁边的UV岛里去,明明在模型上画了一条笔直的深色线,导出后在接缝附近就会出现一块边缘不干净的颜色。

后来排查明白,原因是贴图导出时如果边缘没有做足够的像素扩展(padding),相邻UV岛在采样贴图时会把边界外的颜色也采进去。我的解决方法是:在导出设置里把边缘扩展值从默认调整到16像素左右。做完这个操作以后,接缝渗色的问题几乎消失了。

另外一个辅助方案是在Blender里展UV时使用“导出UV布局图”时设置合适的外扩边距。但最省事的还是ArmorPaint导出面板里那一个边缘扩展参数,先把它调大,效果不满意再考虑在Blender里修UV。

4.2 4K纹理集加多图层的显存压力

有一位用户群的兄弟问过我,为什么他的机器配置看起来不差,但ArmorPaint画起来特别卡。我一看截图,纹理集分辨率4096,图层堆了二十多个,视口还开着最高质量的阴影和实时环境光。

ArmorPaint把每个纹理集和每个图层都常驻显存来保证实时反馈,所以显存占用比Blender这种按需加载的方案高很多。我的建议是:

  • 低模道具统一用2048;
  • 堆图层的过程中适时用“合并可见图层”(Flatten / Merge)来减少图层数;
  • 保存一个单独的备份文件再合并,以防调回去。
  • 不需要实时观察光效细节时,可以适当降低视口质量选项,等出图前再开高。

4.3 法线贴图到Unity后方向不一致

这个坑几乎每个从ArmorPaint导出到Unity的人都会遇到。ArmorPaint视口里看是凸出的铆钉,导入Unity之后变成了凹陷的坑——原因就是法线贴图的方向约定不同。

OpenGL风格的法线贴图绿色通道朝上,DirectX风格的绿色通道朝下。传统Unity项目习惯用DirectX法线,Unreal在部分管线里也偏好DirectX约定,而Blender默认是OpenGL。

我的习惯是:导出时直接选Unity预设,ArmorPaint会把该调的方向调好。如果已经导出了OpenGL方向的贴图也不用慌,在Unity材质里换一个法线导入设置,或者手动在Photoshop里把Normal贴图的绿色通道反色,都能解决问题。表推荐:

目标环境推荐导出预设法线方向
BlenderBlenderOpenGL(绿通道向上)
UnityUnityDirectX(绿通道向下)
UnrealUnreal根据项目设置选择
GodotGodotOpenGL
ArmoryArmory与ArmorPaint一致

4.4 笔刷“不跟手”和压力感应的坑

关于如何提高mysensitivity,我要说一个很多人忽略的地方。ArmorPaint里笔刷是否跟手,一方面取决于GPU实时反馈的速度,另一方面和笔刷的“流量”和“间距”参数相关。

如果你用的是数位板,但笔刷在压力下没有明显粗细或透明度变化,需要检查输入设置里是否启用了压感。我一开始因为没打开压感开关,画线条永远是一个粗细,一度以为笔刷本身有问题。另外,如果延迟感很明显,可以把抗锯齿采样质量从“最高”调低一档,视觉差异很小但帧率确实能提上来,绘制体验好一个档次。

5. 从ArmorPaint到Blender、Unity、Unreal的工作流衔接

5.1 导出预设不只是改个名字

ArmorPaint的导出面板里提供Blender、Unity、Unreal、Godot等预设,很多人以为这只是改一下贴图后缀,其实不然。

不同引擎对PBR贴图的组织习惯差别很大:有的打包成一张ORM(将遮蔽、粗糙度、金属度合成到一张图),有的分开存放;法线方向如前所述也有差异;连贴图的色彩空间设置,不同引擎默认就不同。ArmorPaint的导出预设本质上就是在帮你把这些细节处理好,让导出的贴图能直接被目标引擎的材质球认出来。

我的建议很简单:别嫌它“多此一举”,导出前先确认自己正在做的是哪个引擎的项目,再选择对应预设。尤其不要在导出面板里看都不看就点“Export”。

5.2 命名规范值得一开始就养成

我见过不少项目贴图最终导出来叫“texture_001_col.png”“texture_001_rough.png”,在个人项目里倒没什么,一旦物件多了,后期找贴图真的痛苦。

我在ArmorPaint里习惯先给图层命名,再在导出设置里指定文件前缀,例如t_axe_。这样导出的文件就是t_axe_basecolor.pngt_axe_normal.pngt_axe_metalness.png,一眼就能看懂属于哪个模型。很多引擎支持自动识别贴图后缀来给你生成材质球,规范的命名能直接利用这个特性。

5.3 ArmorPaint和Armory 3D引擎的联动价值

最后说一个很多教程不讲的点:ArmorPaint的材质节点系统并不是孤立的,它和Armory 3D引擎共用同一套节点语法。你在ArmorPaint里通过节点编辑器生成的材质参数和连接关系,放到Armory 3D里可以直接继续修改。

这意味着,如果本身就在用Armory引擎做游戏,ArmorPaint不只是“纹理工具”,而是游戏材质系统里一个实时可视化编辑终端。画完贴图,回到引擎里看到的材质状态和你在ArmorPaint视口里调出来的几乎一致,没有“贴图是贴图、引擎是引擎”的割裂感。

对使用Armory做项目的人来说,这个联动就是我推荐ArmorPaint最充分的理由。

我个人实际用下来的体会是,ArmorPaint的成熟度已经足够支撑独立开发者每天的大量贴图工作,它那种“所见即所得”的实时绘制体验,才是真正让人回不去的点。如果你现在还在用传统方式给模型画贴图,花一个周末按这套流程跑通一个小道具,应该很快能感受到差别。后续如果再想深挖,我建议优先研究材质节点系统,那里面藏着的程序化思路,能让你的效率再上一个台阶。

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

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

立即咨询