第一次打开ArmorPaint,我盯着那个干净得几乎不像3D软件的界面愣了十几秒。没有默认材质球、没有模板工程、没有一堆浮动面板,整个窗口就一块大视口加几个侧边栏。但真正让我坐直的是接下来那个动作:把一整个细节密集的武器模型拖进去,选择笔刷,直接在高模表面上开画,那种跟手的流畅度确实有点颠覆认知。
这篇文章想聊的,就是ArmorPaint这套免费开源的GPU纹理绘制工具:它解决什么问题、工作原理是什么、一条能直接复制的PBR贴图工作流,以及我实际用下来真正踩过的坑。适合的人群很明确——独立游戏开发者、Blender用户、被订阅制劝退的学生,以及那些不想再被庞大软件压得喘不过气的人。
1. 为什么这个免费工具,敢跟几十G的PBR软件正面碰
先说结论:ArmorPaint的开发者Lubos Lenco,同时也是Armory 3D引擎的作者。这层背景非常关键——它天然继承了游戏引擎那种“要快、要实时、要在有限硬件预算里榨出效果”的思路。而ArmorPaint的底层是Rust,渲染后端走wgpu,也就是在Windows、Linux、macOS上通过Vulkan、DX12、Metal这些现代图形API来统一调度GPU。这不是普通的跨平台套壳,而是整条绘制管线在设计上就锚定了GPU优先。
1.1 全程GPU运算,这才是“快”的根本原因
传统3D绘制软件,表面上看你是在GPU视口里涂,但实际上每一笔都意味着CPU要读取相关像素、叠加笔刷内核、写回纹理缓存,再上传给GPU。当画布是4K、8K,或者分辨率更高的纹理集时,CPU就成了瓶颈。我曾经用其他软件画4096分辨率的贴图,笔刷半径越大越卡,偶尔还需要等待几秒的延迟。
ArmorPaint反着来:让纹理常驻显存,把笔刷合成、图层混合、蒙版计算全部做成GPU端的shader内核,CPU只管发指令。我实测下来,普通独显上绘制4096分辨率的贴图,笔刷跟手程度和画布大小几乎无关。更夸张的是,这类非破坏式图层系统可以做到实时重算,我修改一个填充层的颜色,所有与它关联的遮罩、叠加结果瞬间跟着更新,不必像以前那样反复手动Flatten。
我承认,我一开始对“免费”两个字是充满戒备的。后来真正上手才明白,ArmorPaint跟Substance Painter并不是同一个物种在两个价格点上的关系,而是采用了完全不同的技术路线。Substance Painter本身也非常成熟和强大,图层堆栈、智能材质、导出预设、批量自动化这些能力经过十多年积累,在工业级流程里依然是硬通货。ArmorPaint想做的是用GPU把交互体验做到极致,然后用一套简单、开放、足够现代的技术栈,把PBR纹理绘制这件原本被商业工具垄断的事情拉回到创作本身。
1.2 真正打动我的,不是免费,而是这套工具链的开放性
我个人的偏好是:工具链越开放越好。Blender建模、Godot/Unity做引擎、Krita画概念图,这一整套免费方案里,ArmorPaint补上了非常重要的一环——让“直接在高模上画PBR材质”这件事不再依赖商业订阅。
ArmorPaint对我来说解决的不只是预算问题,更多是心理上的低负担。Substance Painter那种动辄几十G的资产库、材质库、指纹库,看着很美,但我的独立项目根本用不完,反而每次打开都被这些预设绑架,总觉得自己还需要更多素材才能开工。ArmorPaint的默认状态几乎是空的,这反而逼着我老老实实从图层、遮罩、材质节点这些基础概念入手,搞清楚一个效果究竟是怎么生成的。
如果要一句话说清楚它的定位:它是一把趁手、轻量、现代的“数字喷枪”,不是一间什么都有的“材料超市”。
2. 从导入模型到导出贴图,一条能直接复制的ArmorPaint工作流
我这个流程实际操作下来非常顺,适合作为新手入门的标准路线。整个过程分为五步:准备模型、设置画布、烘焙底图、图层绘制、导出贴图。每步都有一些值得讲的细节。
2.1 准备模型:UV展开质量决定你的绘制下限
先说准备工作。ArmorPaint当然可以导入FBX、OBJ、glTF,但导入之前我强烈建议在DCC软件里把UV理清楚。如果你的模型UV有大量重叠、拉伸或者超限,ArmorPaint虽然不会崩溃,但后续的每个环节都会让你痛苦加倍——这跟画贴图之前把画布裁好是一个道理。
一个简单的检查标准:UV岛不能有重叠,左右镜像也该拆开,除非你故意要对称绘制。还有就是给UV留边距,防止相邻材质区域出现渗透。我在Blender里习惯开UV岛边距检查,确保每块展开的UV区域之间有足够空隙。这个习惯是从ArmorPaint里吃了一次亏之后才养成的,具体坑后面专门说。
另外,模型尺寸最好统一到一个正常比例。ArmorPaint烘焙AO、曲率时,模型尺度对世界空间参数有影响,如果单位混乱,烘焙结果会出现某些区域过黑或者过白的情况。
2.2 导入与画布分辨率:一开始就别犹豫
导入模型时,软件会弹出一个选择绘制分辨率的界面。这里的选择会直接决定后面所有图层的基准大小。别抱着“反正画完还能改”的心态:虽然ArmorPaint支持后续调整纹理集大小,但每次重设分辨率,所有基于纹理的图层都需要重新生成,工程越大耗时越明显。
我的经验是,普通独立游戏道具、角色,4096起步就够了;如果只是做快速原型和风格化低模,2048完全够用。8K这种档位留给真正需要贴脸特写的场景,因为高分辨率带来的不是单纯的精度,还有显存压力、笔刷响应速度的下降,以及导出文件体积的爆炸。
导入之后还有一个容易被忽略的点:ArmorPaint会以模型本身作为绘制目标,不需要额外生成什么低模高模匹配关系。它支持直接在原有模型基础上绘制,这对个人开发者来说非常友好,省掉了传统流程里高低模烘焙、生成法线贴图之后再进SP的环节。
2.3 烘焙AO和曲率:相当于给手绘打底稿
画之前,我会先去烘焙面板把基础贴图给出来。常用的是AO、曲率、厚度、世界空间法线。AO能告诉你哪些地方该暗下去,曲率能帮你把模型的高光区和磨损区划分出来。烘焙这一步,ArmorPaint是纯GPU算的,高密度模型在合适配置下也能很快完成。操作上,点击对应贴图类型,调整采样参数,然后点一下Bake,几分钟内就能拿到一张用于绘制的“底图”。
为什么先烘焙AO和曲率?类比一下:你不可能直接在空白油画布上硬画一个精细机械结构,而是要先用素描把明暗体积定下来。AO就是这个素描关系,而曲率相当于一张“分区地图”,告诉我哪些表面向外凸、哪些向内凹。做金属边缘磨损表现的时候,只要把曲率贴图连到蒙版上,再叠一层亮色填充,磨损效果就自动沿着高曲率区域走,不需要一笔一笔画。
烘焙时的参数一般保持默认就能获得不错的结果。AO的采样距离可以适当调整,避免大面积遮挡导致整体过黑;曲率贴图则要注意平滑度和对比度,太生硬的话后面做遮罩时会出现很明显的区域边界。
2.4 图层与填色:搭一套非破坏式材质结构
ArmorPaint的图层体系概念上和Photoshop很像,但有它自己的特殊玩法。图层类型有填充层、绘制层、遮罩层,每个填充层可以绑定纯色、图形纹理,甚至是一个材质节点生成的程序纹理。这意味着一把刀柄上的木质纹理,完全可以通过程序噪声和颜色节点组合出来,不需要外部贴图,而且随时可改参数。
我的图层习惯是:最下层放AO滤镜或暗色填充层,用来建立全局明暗;上面一层放基础颜色填充,可以是纯色也可以是程序纹理;再往上是局部手绘层,负责画脏污、高光、破损等等;最顶部放曲率或法线驱动的边缘高亮。整套结构全都是非破坏式的,改起来非常省心。
比如我画一个带木柄和金属刀刃的短刀:先建一个填充层,选一个暖棕色,把粗糙度拉到0.8左右,这就是木柄的基础材质;再建一个填充层,给刀刃一个中灰色,金属度拉到0.9,粗糙度0.3。接着用笔刷选个暗色直接在木柄上顺手画几道磨损,调整图层的透明度,让痕迹自然地融入底色。边缘高光就用之前烘焙的曲率贴图来控制。
这一步会把ArmorPaint的优势发挥得特别明显:想换木柄颜色,直接改填充层的色值,整把刀的所有木纹、磨损、阴影同时跟着变;想加强金属反光,动一下粗糙度滑块就看到视口里实时更新。我以前在传统绘制流程里改一次整体配色需要重新画半天,现在几秒钟搞定。
2.5 导出贴图:匹配不同引擎的命名和颜色空间
绘制完成后,导出面板会把所有可见图层展平成最终纹理,并输出一套PBR贴图:Base Color、Roughness、Metalness、AO、Normal等。我通常导出一套PNG,命名按照引擎习惯来——Unity里用Base Map + Metallic + Smoothness这个组合,UE里喜欢把Occlusion/Roughness/Metallic打包成一张ORM,Blender则是直接用Color和Non-Color两种颜色空间区分。
这里必须多说一句:贴图导出去之后颜色不对,大多数时候不是ArmorPaint的问题,而是引擎里的颜色空间设置错了。Base Color必须设为sRGB(或者Color),Roughness、Metalness、AO、Normal必须设为Non-Color/线性数据。如果你把金属度贴图当普通彩色贴图导入,整个模型看起来会像刷了一层塑料,金属完全不亮、粗糙度完全失效。这个坑真的能卡住一整天。
ArmorPaint还支持导出多个纹理集和不同格式,具体格式取决于目标平台。我做PC端项目一般选PNG,保证质量;做移动端才会考虑压缩格式或者缩到2048分辨率。
3. 用惯Substance Painter的人,上手后最该适应的三个差异点
我周围不少朋友是从Substance Painter转到ArmorPaint的,大家吐槽的点高度一致:素材少了、功能少了、UI太素了。但深入用下来,会发现这些差异背后各有各的道理。
3.1 交互界面:面板变少了,思路反而更清楚
Substance Painter的界面密度很高,功能区域多、图层样式多、默认资源一大堆。ArmorPaint的界面设计明显借鉴了现代数字绘画软件的清新风格:中间是视口,左侧是图层和节点面板,右侧是工具参数。没有多余的东西。
第一次使用的人可能觉得功能藏太深,但只要跑通一遍流程,你会发现这个界面是有意为之的。它把核心链路——导入、烘焙、分层、笔刷、导出——放得非常显眼,所有高级功能也都是围绕这条链路组织起来的,不容易迷路。对于只想要“快速把一个模型画好”的人来说,这种减法体验反而珍贵。
3.2 材质系统:节点能力和可控性到了什么程度
ArmorPaint的节点材质系统我单独拿出来说。它不是摆设,而是可以正经干活的程序化材质编辑器。你可以创建噪声纹理,叠加颜色渐变,再接上混合因子,生成一整套带划痕、脏迹、渐变色的表面效果。而且因为整个计算都在GPU上,调整节点参数时视口里的反馈几乎是实时的。
相比Substance Painter的图层堆栈,ArmorPaint的节点玩法更接近Blender的Shader Editor,但范围限定在“材质”这个抽象层里。它很适合做风格化材质和单对象材质表现,做复杂材质库管理的话确实没有SP那种可视化堆栈方便。这个差异取决于你的工作类型:如果是做一套统一的游戏武器库,节点系统够用且效率很高;如果是给客户反复改混合材质预设,那还是要考虑更工业化的方案。
我个人的做法是:90%的风格化道具材质直接用ArmorPaint节点搭,遇到需要精细照片扫描感、专门分层调控的资产,才会回到传统PBR软件里处理。
3.3 生态差距:资产库和自动化,是SP多年积累的优势
这是ArmorPaint目前真正吃亏的地方。Substance社区沉淀了海量智能材质、笔刷预设、导出模板,一个锈迹金属材质拉下来直接就能用,这是它过去十年积累出来的护城河。ArmorPaint在这方面还比较空白,虽然官方提供了示例工程和材质节点,但想复现SP那种高品质材质资产还需要自己动手搭。
自动化脚本的能力也是SP胜出。SP有完整的Python脚本API,大团队可以批量处理资产,接入自定义导出管线。ArmorPaint目前的自动化能力简单很多,更多是围绕编辑操作本身。如果你需要每天批量处理成百上千个资产,那ArmorPaint短时间内的确替代不了SP。
| 维度 | ArmorPaint | Substance Painter |
|---|---|---|
| 价格 | 开源免费 | 订阅制,价格不低 |
| 技术路线 | GPU原生绘制,速度快 | CPU+GPU混合,成熟稳定 |
| 材质生态 | 节点系统灵活,资产少 | 海量智能材质与预设 |
| 自动化脚本 | 有限 | 强大且成熟的Python API |
| 学习曲线 | 一小时可上手 | 功能多,初期可能被界面淹没 |
| 最适合场景 | 独立项目、风格化、快速原型 | 工业级流程、团队协作、批量生产 |
这张表格不是说谁全面碾压谁,而是说两个工具的世界观不一样。ArmorPaint适合从零开始搭材质、想搞清楚每一层效果是怎么来的创作者;SP适合追求效率、需要开箱即用海量资源的生产环境。
4. 我在实际项目中踩过的坑,以及完整的排查思路
每款软件都有它的小脾气,ArmorPaint也不例外。下面这几个问题是我实际项目中遇到的,都给出了根因和解决办法,希望能帮你少走弯路。
4.1 UV重叠导致笔触“串台”的定位过程
这是我进的第一个大坑。现象是:我明明在模型的正面画一道划痕,结果背面和对称面也跟着出现同样的划痕,有些地方还出现在完全不相关的位置。一开始我以为是软件bug,还去官方论坛翻了一圈,后来逐层排查下来,根因是我模型的UV很多壳发生了重叠。
ArmorPaint在纹理空间里画一个像素,就等于同时写到了重叠在一起的多个UV区域。视觉上就表现为“串台”到模型其他地方去了。排查链路是这样的:先在ArmorPaint里打开UV检查显示,重叠区域会以高亮颜色标出;然后回到Blender/Maya里找到对应重叠的UV壳,重新展开排列;最后重新导入确认问题消失。对于实在不能重展的复杂模型,我的退路是把物体按材质ID拆开,分多个模型处理。这个问题解决之后,绘制体验完全是另一回事。
4.2 手绘板压力丢失:多半是输入后端的问题
另一个常见问题是手绘板画不出压感,线条永远是恒定的宽度。我第一次遇到的时候还以为是ArmorPaint不支持压感,后来查了官方文档和社区帖子才发现它完全支持,只是Windows下有个输入后端的兼容问题。
解决方案不复杂:到软件的输入设置里,在Windows Ink和WinTab之间切换一下,再回到画布试试。Linux下如果遇到同样问题,多半是系统没有正确暴露Tablet协议,或者手绘板驱动没装好。压感识别恢复之后,笔刷的流量、半径都会跟随笔压变化,手绘体验才算真正立起来。顺带一提,如果你的笔刷设置了硬度、流量这些参数,却始终感觉变化不明显,也先检查一下压感曲线是不是被调成了线性曲线,很多默认设置下尾部力度会很轻。
4.3 分辨率不够用?先别急着开8K
画到一半发现细节放不进去,第一反应往往是开更高画布分辨率。但我的经验是,8K在ArmorPaint里会带来明显的显存负担,所有图层都在GPU里同步更新,很多老显卡直接就开始喘了。
更合理的做法是把模型拆成多个纹理集,按材质分组输出不同分辨率的贴图,或者用程序纹理和遮罩的组合来增加细节感,而不是单纯堆像素。比如给一块盾牌表面加裂纹,用划痕纹理配合曲率遮罩控制范围,效果比把整张4K拉大到8K后手动画几十条裂缝更自然,也更吃性能。这个习惯让我用同样的显卡画出了明显更细腻的风格化材质。
4.4 导出后的颜色空间问题:很多人栽在这里但以为是软件问题
导出贴图后,在Blender里看对,到了Unity里发灰,或者反过来。这个问题我一开始也误以为是ArmorPaint导出质量不行。后来检查一遍项目设置才确认是颜色空间配错了。
ArmorPaint导出时对Base Color默认走sRGB输出,而Roughness、Metalness、AO、Normal这些数据必须被引擎当作线性数据使用。你在Blender节点编辑器里如果不把对应贴图的颜色空间改成Non-Color,整个PBR表现就会完全崩掉。金属度贴图被做了伽马校正,金属表面就不再反光,粗糙度也失去层次感。解决办法就是记住一条铁律:只有颜色贴图用sRGB,其他所有数据贴图一律Non-Color。这条规则放之四海而皆准。
5. 最后说点掏心窝的建议
我现在的完整流程是:Blender做模型、展UV,ArmorPaint负责烘焙和纹理绘制,最后装配到Unity/Godot里做光照验证。ArmorPaint在整个链路里承担的是“绘制画板”的角色,它没有变成工作流里的一站式巨无霸,但它解决了一个非常核心的痛点:以零成本、低干扰的方式做高品质PBR贴图。
说点掏心窝的话。我不推荐你因为“免费”就强行换工具,如果你的核心工作是每天处理上百个资产、需要大量自动化脚本和团队共享资产库,那些成熟商业软件的工业生态确实难以替代。但如果你跟我一样,做独立项目、做风格化内容、做早期原型验证,ArmorPaint值得花一个下午认真试试。免费、开源、还快,最重要的是它让我重新找回了“打开软件就想画点什么”的冲动。
最后分享一个小技巧:作者团队提供的在线文档和示例工程很齐全。但我的建议是不要一上来研究每个按钮,先照着一把武器做一遍烘焙到分层的完整流程,再动手画几笔,比起对着教程看十遍都管用。因为ArmorPaint这套工具,很多东西只有落笔之后才真正理解它为什么要这样设计。