材质与贴图这件事,在游戏美术流程里一直是个“看起来简单、做起来要命”的环节。模型建完只是骨架,真正让角色和场景有说服力的,是表面那层颜色、粗糙度、金属感、法线细节。很多人第一次接触贴图绘制,都是从 Blender 自带的纹理绘制模式起步的,画两笔就发现:笔刷不够用、图层管理缺失、粒子笔刷没有、遮罩逻辑简陋,稍微复杂一点的 PBR 材质就得来回切软件。ArmorPaint 就是在这个缝隙里长出来的工具——它脱胎于 Blender 生态,却把“材质绘制”这件事单独拎出来做深做透,开源、跨平台、支持 PBR 工作流,还能和 Blender 之间来回导模型、导贴图。这篇内容适合三类人看:刚学完 Blender 基础想进阶材质的新手、被 Substance Painter 订阅费劝退的独立开发者、以及想搞清楚开源贴图工具到底能不能进生产管线的技术美术。我会从它和 Blender 的关系讲起,把安装、笔刷、图层、遮罩、烘焙、导出这一整条链路拆开,再补上我实际用下来踩过的坑和提速技巧。
1. ArmorPaint 到底解决了 Blender 用户的哪个痛点
1.1 Blender 自带纹理绘制的天花板在哪
Blender 的 Texture Paint 模式不是不能用,而是它的定位一直是“够用就好”。你可以在视口里直接往模型上涂颜色,配合 Stencil 贴图也能做出一些细节,但一旦进入真正的 PBR 材质制作,问题就集中爆发了。第一,图层系统几乎不存在,Blender 的纹理槽是扁平的,你想做“底层皮革 + 中层磨损 + 顶层灰尘”这种叠加逻辑,只能靠多个纹理槽手动混合,节点树越接越乱。第二,笔刷引擎偏基础,缺少粒子笔刷、物理笔刷、克隆笔刷这些在 Substance Painter 里已经标配的功能,画石头、画草地、画布料边缘的时候效率差距非常明显。第三,遮罩和材质 ID 的联动很弱,你想“只在金属边缘画锈”,得自己烘一张遮罩图再手动加载,流程割裂。
ArmorPaint 的思路不是替代 Blender 的建模和渲染,而是把“绘制”这一段单独拿出来,做成一个专注、轻量、开源的独立工具。它底层用的是 Kha 框架和 Haxe 语言,渲染走的是自己的一套 PBR 管线,支持金属度/粗糙度工作流,也支持法线、AO、曲率、材质 ID 这些常用遮罩通道。换句话说,Blender 负责把模型和 UV 准备好,ArmorPaint 负责把材质画出来,最后贴图再回到 Blender 或者游戏引擎里用。这个分工在独立开发和小团队里非常实用,因为你不必为了画贴图去背一整套庞大的商业软件授权。
1.2 脱胎于 Blender 生态意味着什么
“脱胎于 Blender”这句话不是营销话术,它体现在几个很实际的地方。ArmorPaint 的模型导入格式对 Blender 用户极其友好,.obj和.fbx都能直接吃,UV 布局只要在 Blender 里展好,导进去就能画。更重要的是它的节点式材质系统和 Blender 的 Shader 思路一脉相承,如果你熟悉 Blender 的 Principled BSDF,理解 ArmorPaint 的材质输出会非常快——基础色、金属度、粗糙度、法线、高度、AO,这几个通道的对应关系几乎是直译的。对于已经习惯 Blender 节点逻辑的人来说,学习成本被压得很低。
另一个隐性好处是社区重叠。Blender 用户群体里大量讨论 UV、烘焙、法线、PBR 的帖子,很多经验可以直接迁移到 ArmorPaint 上。比如“如何在 Blender 里烘一张干净的 AO 图”“如何用 Smart UV Project 快速展 UV”,这些操作在 ArmorPaint 工作流里同样是前置步骤。你不需要重新学一套完全陌生的术语体系,只需要把 Blender 里已经会的东西,换一个更专注绘制的界面去执行。
1.3 开源这件事对独立开发者的实际价值
开源在工具选型里经常被当成“免费”的同义词,但它的真正价值在于可控性和可扩展性。ArmorPaint 的源码是公开的,这意味着如果你团队里有懂 Haxe 或者愿意折腾的人,可以针对自己的项目做定制。比如你想加一个特定项目的材质预设、想改笔刷的默认衰减曲线、想接入自己的资产管理系统,理论上都有路径。商业软件你只能等官方更新,开源工具你可以自己动手。
当然,开源也意味着你要接受它的一些不完美:文档不如商业软件完善,某些高级功能需要自己摸索,版本迭代节奏取决于社区活跃度。但对于预算有限、又不想在材质环节妥协太多的独立团队来说,这个取舍是划算的。我见过不少小团队的做法是:主力用 ArmorPaint 画基础材质和手绘细节,遇到特别复杂的毛发或者特殊材质再考虑其他方案,整体成本压得很低。
2. 从 Blender 到 ArmorPaint 的模型与 UV 准备
2.1 导出前必须检查的三件事
很多人第一次把模型导进 ArmorPaint 发现画不了,问题往往出在导出前的准备上。第一件事是应用所有修改器。Blender 里的细分、镜像、阵列这些修改器如果不应用,导出的.obj或.fbx可能和你视口里看到的完全不一样,UV 也会错位。第二件事是确认 UV 没有重叠。ArmorPaint 的绘制是基于 UV 空间的,如果两个面共用同一块 UV 区域,你画一边另一边也会跟着变。用 Blender 的 UV Editor 检查一下,必要时用Ctrl + A全选 UV 然后UV > Pack Islands重新排布。第三件事是法线方向统一。在 Blender 里选中模型进入编辑模式,Shift + N重新计算外侧法线,避免导进去之后模型表面出现黑面或者光照异常。
导出格式我一般优先选.obj,因为它的兼容性最稳,ArmorPaint 对.obj的解析也最成熟。.fbx虽然能带更多信息,但偶尔会遇到缩放或者轴向的问题。导出.obj的时候记得勾选Write Materials和Triangulated Faces,前者保证材质槽信息不丢,后者避免四边形在 ArmorPaint 里出现奇怪的三角化。缩放保持默认的 1.0,轴向用-Z Forward, Y Up,这是 Blender 和大多数工具之间的通用约定。
2.2 UV 布局对绘制效率的直接影响
UV 展得好不好,直接决定你在 ArmorPaint 里画得顺不顺。一个常见的误区是“UV 只要不重叠就行”,但实际上 UV 的密度均匀性和接缝位置对绘制体验影响巨大。如果某个区域 UV 被拉得特别大,你画一笔在视口里看起来很短,实际在 UV 空间里覆盖了很大面积,笔刷的像素密度就对不上,细节会糊。反过来,UV 太小的区域你很难画进去细节。
我的习惯是在 Blender 里用Smart UV Project打底,角度阈值设 66 度左右,然后手动调整接缝。接缝尽量藏在不容易被看到的地方,比如角色腋下、大腿内侧、道具的底面。对于需要对称的模型,可以只展一半 UV,另一半用镜像,但要注意 ArmorPaint 里画的时候对称轴要对准。UV 的边距(Margin)建议留 4 到 8 个像素,太小了烘焙的时候容易溢色,太大了浪费 UV 空间。如果你打算烘 AO 或者曲率图,边距还要再留大一点,因为烘焙算法会在边缘采样。
2.3 烘焙遮罩图:AO、曲率、材质 ID 的生成逻辑
ArmorPaint 支持导入外部烘焙的遮罩图,也内置了部分烘焙能力,但实际生产中我更推荐在 Blender 或者专门的烘焙工具里先把 AO、曲率、材质 ID 烘好。原因是 Blender 的烘焙流程更可控,你可以调整采样数、光线距离、笼子(Cage)设置,出来的图更干净。AO 图的烘焙逻辑是从每个像素点向半球方向发射光线,统计被遮挡的比例,所以模型如果有内部结构或者缝隙,AO 会自然变暗,这个信息在画脏迹和阴影时非常有用。
曲率图(Curvature)本质上是法线变化率的可视化,凸起的地方偏白,凹陷的地方偏黑。它在 ArmorPaint 里主要用来做边缘磨损和缝隙积灰——凸边刷金属磨损,凹缝刷污垢,这是让材质“讲故事”的关键。材质 ID 图则是把不同材质区域用纯色区分开,比如金属部分给红色、皮革部分给绿色、布料给蓝色,导入 ArmorPaint 后可以用颜色选择快速建立遮罩。烘焙这三张图的时候,分辨率建议和最终贴图一致,比如 2K 或 4K,格式用 PNG 或者 TIFF,避免 JPEG 的压缩伪影影响遮罩精度。
3. ArmorPaint 的笔刷、图层与遮罩实战
3.1 笔刷引擎的核心参数怎么调
ArmorPaint 的笔刷系统比 Blender 自带纹理绘制丰富得多,核心参数集中在半径、硬度、强度、间距、抖动这几个维度。半径和硬度不用多说,和大多数绘图软件一致。间距(Spacing)是很多人忽略的参数,它决定笔刷在拖动时多久落一个印子。画硬表面细节时间距可以设小一点,比如 0.05,让笔迹连续;画颗粒感材质时间距调大,比如 0.3,让每个笔触之间有间隙,形成自然的颗粒分布。抖动(Jitter)分位置抖动和旋转抖动,画石头、草地、锈迹的时候打开位置抖动,笔刷落点会随机偏移,避免出现明显的重复图案。
ArmorPaint 还支持粒子笔刷,这是它相对 Blender 的一大优势。粒子笔刷的原理是每次落笔时在笔刷范围内随机撒一批小图,这些小图可以是石子、叶片、划痕、灰尘颗粒。你可以控制粒子的数量、大小范围、旋转范围、透明度范围。我画角色靴子上的泥点时,会用一个圆形软笔刷打底,再叠一层粒子笔刷撒泥点,最后用遮罩限制在鞋底和鞋面下半部分,出来的效果比纯手绘自然很多。粒子笔刷的图源可以自己准备,PNG 带透明通道,尺寸不用太大,256 或 512 就够,太大了反而拖性能。
3.2 图层混合模式与不透明度的配合
ArmorPaint 的图层系统和 Photoshop 类似,支持正常、正片叠底、叠加、滤色、柔光等混合模式,每个图层可以单独调不透明度。这个系统看起来简单,但用好了能省大量手绘时间。我的常用套路是:底层铺基础色,用正常模式;第二层加整体脏迹,用正片叠底,不透明度 30% 到 50%;第三层加高光磨损,用叠加或者柔光,不透明度 20% 到 40%;第四层加局部细节,用正常模式,配合遮罩只作用在特定区域。
这里有个关键技巧:不要在一个图层上画太多东西。很多人习惯在一个图层上从底画到顶,结果想改中间某一步的时候只能重画。正确的做法是按“材质层”拆分,比如皮革底色一层、皮革纹理一层、皮革磨损一层、皮革污渍一层,每层都可以独立调不透明度和混合模式。图层多了之后用文件夹分组,按材质区域或者按绘制阶段分,找起来快。ArmorPaint 的图层还支持克隆和复制,做对称材质或者重复元素时非常方便。
3.3 遮罩的四种建立方式与适用场景
遮罩是 ArmorPaint 里最值得花时间研究的模块,它决定了你画的细节能不能“长在对的地方”。第一种是手绘遮罩,直接用笔刷在遮罩层上涂,适合局部微调,比如只想给角色左肩加一块磨损。第二种是颜色遮罩,基于材质 ID 图或者基础色图,用吸管选一个颜色,容差范围内自动生成遮罩,适合按材质区域批量处理。第三种是AO 遮罩,导入烘焙好的 AO 图,用它的灰度值控制遮罩强度,凹缝自动变暗,适合画积灰和阴影。第四种是曲率遮罩,导入曲率图,凸边自动变白,适合画边缘磨损和金属高光。
实际用的时候这四种经常组合。比如画一把旧铁剑:先用颜色遮罩选中金属区域,叠一层 AO 遮罩让缝隙变暗,再叠一层曲率遮罩让刃口变亮,最后用手绘遮罩在特定位置补几道划痕。这个组合逻辑和 Substance Painter 的 Smart Mask 思路是一致的,只是 ArmorPaint 里需要你手动把图导进来。遮罩的容差和对比度可以调,容差决定颜色匹配的宽松程度,对比度决定遮罩边缘的软硬,这两个参数多试几次就有手感了。
4. 材质通道输出与 Blender 回导验证
4.1 PBR 通道的导出设置
ArmorPaint 画完之后,导出的是按通道拆分的贴图,常见的有 Base Color、Metallic、Roughness、Normal、Height、AO、Emissive。导出格式建议用 PNG,位深 8 位对大多数游戏项目够用,如果项目要求高精度可以导 16 位。分辨率根据项目定,手游 1K 到 2K,端游和主机 2K 到 4K,影视级可能上 8K,但 8K 对显存和绘制性能压力都很大,非必要不上。导出路径建议按“模型名_通道名_分辨率”的规则命名,比如sword_basecolor_2k.png,后期在引擎里批量导入的时候不容易乱。
有一个细节要注意:ArmorPaint 导出的法线图默认是 OpenGL 格式(绿通道朝上),而 Blender 和 Unity 用的也是 OpenGL 格式,所以直接导进去没问题。但如果你用的是 Unreal,它默认是 DirectX 格式(绿通道朝下),需要在 ArmorPaint 导出时勾选翻转绿通道,或者在 Unreal 里用节点翻转。这个坑我踩过,法线图导进 Unreal 之后光照完全不对,凸起变凹陷,排查了半天才发现是格式问题。粗糙度和金属度图在 ArmorPaint 里是分开导的,有些引擎支持打包成一张图的不同通道,这个按项目规范来。
4.2 在 Blender 里重建材质节点验证效果
贴图导回 Blender 之后,不要直接往模型上一贴就完事,建议手动接一遍 Principled BSDF 节点,确认每个通道都对得上。Base Color 接基础色,Metallic 接金属度,Roughness 接粗糙度,Normal 经过 Normal Map 节点接法线,AO 可以接一个 Mix 节点和基础色相乘,模拟环境光遮蔽。接完之后在 Cycles 或者 Eevee 里渲染一张测试图,重点看三个地方:金属区域的反射是否合理、粗糙度变化是否有层次、法线细节是否清晰。
如果发现某个通道不对,先检查贴图的色彩空间。Base Color、Emissive、AO 这些是 sRGB 色彩空间,Metallic、Roughness、Normal、Height 是 Non-Color 色彩空间。Blender 里导入贴图后,在 Image Editor 的 Color Space 下拉菜单里改,改错了会导致颜色发灰或者法线失效。这个检查步骤看起来繁琐,但能帮你提前发现 90% 的回导问题,比在引擎里调试快得多。
4.3 游戏引擎里的最终校验清单
贴图进引擎之后,还有一轮校验要做。以 Unity 为例,导入贴图后要检查 Texture Type 是否正确,法线图要设成 Normal Map,其他通道设成 Default。sRGB 选项要和 Blender 里保持一致,Base Color 勾选 sRGB,Metallic 和 Roughness 取消勾选。压缩格式根据平台选,PC 用 DXT5 或者 BC7,移动端用 ASTC。如果项目用了 URP 或者 HDRP,材质的 Shader 要选对应的 Lit Shader,然后把贴图槽位对号入座。
在引擎里转一圈模型,重点看不同光照角度下的表现。金属区域在强光下应该有明显的高光反射,粗糙区域应该是漫反射,法线细节在侧光下最明显。如果发现某个区域过亮或者过暗,回到 ArmorPaint 里调对应的通道,重新导出。这个迭代过程可能来回几次,但每次都能让材质更接近你想要的效果。我一般会在引擎里搭一个简单的测试场景,放几个不同角度的光源,这样校验起来更直观。
5. 实际项目中的提速技巧与常见坑
5.1 笔刷预设和材质库的积累
ArmorPaint 支持保存笔刷预设和材质预设,这是长期使用必须建立的资产。笔刷预设可以按用途分类,比如“硬表面划痕”“布料纹理”“皮肤细节”“石头颗粒”,每个预设调好半径、硬度、间距、抖动、粒子参数,用的时候直接切。材质预设则是把调好的图层组合存下来,比如“旧金属”“湿皮革”“脏布料”,新项目遇到类似材质直接套用,改改颜色和遮罩就能用。我自己的库里有二十多个笔刷预设和十来个材质预设,新项目启动的时候能省掉大量重复调参的时间。
积累这些预设的关键是边做边存。每次调出一个满意的笔刷或者材质,立刻存成预设,不要想着“下次再存”。因为下次你很可能忘了当时的具体参数。预设文件可以导出备份,换电脑或者团队协作的时候直接导入。ArmorPaint 的预设文件不大,一个笔刷预设几 KB,一个材质预设可能几百 KB,攒多了也不占地方。
5.2 大分辨率贴图的性能优化
4K 贴图在 ArmorPaint 里绘制的时候,如果图层多了、笔刷大了,可能会卡顿。优化的思路有几个:第一,分层绘制,不要一次性把所有图层都打开,画哪层开哪层,其他层暂时隐藏。第二,降低视口预览分辨率,ArmorPaint 的视口渲染和最终贴图分辨率是分开的,视口可以设低一点,导出的时候再按高分辨率导。第三,合并已完成图层,如果某个区域的材质已经定稿,把相关图层合并成一个,减少实时计算量。第四,关闭不必要的通道预览,只显示你当前在画的通道,比如画基础色的时候把法线和粗糙度预览关掉。
还有一个容易被忽略的点是显存占用。4K 贴图每个通道大概占 64MB 显存,如果你同时开了 Base Color、Metallic、Roughness、Normal、Height、AO 六个通道,就是接近 400MB,再加上图层缓存,很容易吃满中端显卡的显存。解决办法是画的时候只加载当前需要的通道,其他通道用低分辨率代理,导出的时候再切回全分辨率。这个操作在 ArmorPaint 的设置里可以调,具体路径在 Preferences 的 Texture 选项里。
5.3 跨软件协作时的命名与版本管理
独立开发者经常一个人兼多个角色,模型、贴图、引擎来回切,文件命名和版本管理如果不规范,很快就会乱。我的习惯是给每个资产建一个文件夹,里面分model、texture、bake、export四个子文件夹。模型文件用资产名_v版本号.blend,贴图用资产名_通道名_分辨率_版本号.png,烘焙图用资产名_ao_分辨率.png这种格式。版本号用两位数,比如v01、v02,每次大改就加一。这样即使过了几个月回头看,也能快速找到对应版本。
ArmorPaint 的项目文件是.arm格式,保存的时候建议和模型文件放在一起,命名对应。.arm文件里保存了图层、遮罩、笔刷设置,但不包含导入的贴图资源,所以如果你移动了烘焙图的位置,重新打开项目可能会丢遮罩。解决办法是把所有资源放在项目文件夹内,用相对路径引用,或者导出的时候把资源一起打包。这个坑我在换电脑的时候踩过,遮罩全丢了,只能重新烘重新连,浪费了大半天。
5.4 常见报错与排查思路
ArmorPaint 用下来最常见的几个问题:模型导进去是黑的,通常是法线反了或者材质槽没写,回 Blender 检查法线和导出设置。笔刷画不上去,先看当前选中的图层是不是被锁定了,再看遮罩是不是全黑,最后看笔刷的通道选择是不是对的——ArmorPaint 的笔刷可以指定只画某个通道,如果选错了通道,你在基础色层上画半天,实际画到法线层去了。导出贴图是空的,检查一下图层可见性和导出通道的勾选,有时候图层被隐藏了但导出设置里还勾着,导出来就是空白。
还有一个偶发问题是导入大模型时卡死。ArmorPaint 对模型面数有一定容忍度,但几十万面的模型导进去会非常慢。解决办法是在 Blender 里先做减面,或者把模型拆成几个部分分别导入。如果项目确实需要高面数模型,可以考虑在 Blender 里先烘好法线,用低模在 ArmorPaint 里画,高模的细节通过法线图带进去。这个思路和传统的“低模+高模烘焙”流程是一致的,只是把绘制环节放在了低模上。
6. 把 ArmorPaint 放进真实生产管线的判断
6.1 什么项目适合用它
ArmorPaint 最适合的是中小规模的游戏项目和独立开发。角色、道具、场景物件这些常规资产,它的功能完全够用,PBR 工作流、图层遮罩、粒子笔刷这些核心能力都在。风格化项目尤其合适,因为手绘成分多,ArmorPaint 的笔刷系统比 Blender 顺手很多。写实项目也能做,但如果你需要大量程序化材质、复杂的材质函数、或者和 Substance 生态深度绑定的工作流,ArmorPaint 可能会显得单薄一些。
另一个适合的场景是教学和原型验证。开源、免费、跨平台,学生和爱好者可以零成本上手,学到的 PBR 概念和图层逻辑是通用的,以后换到商业软件也能迁移。原型阶段用 ArmorPaint 快速出材质效果,验证美术风格,比一开始就上重型工具灵活得多。
6.2 什么情况下该考虑替代方案
如果你的项目需要高度程序化的材质生成,比如根据模型曲率自动生成磨损、根据世界坐标生成积雪、根据高度生成植被分布,ArmorPaint 的节点系统相对简单,可能满足不了。这种情况下 Substance Designer 或者 Houdini 的材质系统更合适。如果团队已经深度使用 Adobe 生态,素材库、预设、协作流程都在 Substance 体系里,换到 ArmorPaint 的迁移成本可能不划算。还有就是影视级高精度需求,8K 以上贴图、多层材质混合、复杂的置换细节,ArmorPaint 的性能和功能边界会比较明显。
但话说回来,工具选型从来不是非此即彼。我见过不少团队的做法是混合使用:主力材质用 ArmorPaint 画,特殊材质用其他工具补,最后在引擎里统一。开源工具的价值不在于它全能,而在于它在你需要的那一段流程里够用、可控、不添堵。
6.3 我个人的使用节奏与心得
用了这段时间,我的节奏基本固定下来了:Blender 里建模、展 UV、烘 AO 和曲率,导出.obj进 ArmorPaint,先铺基础色,再叠脏迹和磨损,用遮罩控制范围,粒子笔刷补细节,最后导出贴图回 Blender 接节点验证,没问题再进引擎。整个流程走顺之后,一个中等复杂度的道具从建模到材质完成,大概能控制在几个小时以内,比纯手绘或者来回切软件快不少。
最值得分享的心得是:不要追求一次画到位。材质绘制是个迭代过程,第一遍铺大色块,第二遍加明暗和脏迹,第三遍补细节和磨损,每遍都退远看整体效果。ArmorPaint 的图层系统让这种迭代变得很轻松,你可以随时回到任何一层调整,不用担心破坏其他层。另外,多存版本,每次大改之前另存一个.arm文件,改坏了随时回退。这个习惯帮我省过好几次重画的时间。工具是死的,流程和习惯是活的,把这两样理顺了,ArmorPaint 这种开源工具才能真正变成生产力。