
1. ArmorPaint 是什么一个被严重低估的开源 PBR 纹理绘制工作流核心ArmorPaint 不是 Photoshop 的 3D 插件也不是 Substance Painter 的平价替代品——它根本就不是“替代品”。它是从零开始、为现代 PBRPhysically Based Rendering管线量身打造的实时 GPU 加速纹理绘制引擎。我第一次在 Blender 社区看到有人用它给一个低模战车模型画锈迹时整个流程快得让我怀疑显示器刷新率被调高了笔刷拖动无延迟法线贴图实时重投影粗糙度通道直接用滑块调节导出的 .png 文件里Albedo、Normal、Roughness、Metallic 四张图自动按标准命名打包进 zip。这背后没有 Adobe 的订阅制没有 Foundry 的授权服务器只有一个 GitHub 仓库和一份 MIT 协议声明。它的关键词不是“免费”而是“零中间层”。传统纹理绘制工具比如早期版本的 Substance Painter需要先烘焙 UV 展开、再导入贴图集、再设置材质球、再预览——ArmorPaint 把这个链条砍掉了三步你导入一个 OBJ 或 GLB 模型它立刻生成默认 PBR 材质并进入绘制模式你选中一个面片笔刷就只影响该区域你切换到 Normal 通道画笔就自动转为法线偏移模式连 ZBrush 那种手动切换笔刷类型的步骤都省了。这不是功能简化而是对 PBR 工作流本质的重新理解贴图不是独立图像而是模型表面物理属性的直接映射。所以 ArmorPaint 的 UI 里没有“图层”概念只有“通道”Channel——Albedo、Normal、Roughness、Metallic、Emission、Opacity每个通道对应渲染器里一个物理参数你画的每一笔都在改写材质的物理定义。这解释了为什么它的 GitHub star 数在三年内从 2000 跳到 18000却依然没出现在主流教程平台首页它不迎合“零基础学建模”的流量逻辑而是精准服务那些已经卡在 PBR 流程瓶颈里的中级用户——比如用 Blender 做完建模和 UV却卡在 Substance Painter 启动慢、烘焙卡顿、导出命名混乱的环节比如 Unity 开发者想快速给原型模型加质感但又不想为单次使用买年费授权比如独立游戏团队需要把美术资产管线压进 Git 版本控制而 Substance 的 .spp 文件根本没法 diff。ArmorPaint 的存在本质上是在回答一个问题当 GPU 算力足够强、WebGL/OpenGL 4.5 成为标配、PBR 标准早已固化时我们为什么还要用十年前的软件架构来处理贴图提示ArmorPaint 不是万能的。它不支持程序化纹理生成如 Substance 的节点系统不做 UV 自动展开需外部工具预处理也不提供复杂的材质混合逻辑。它的哲学是“做一件事做到极致”——把“手绘式 PBR 贴图创作”这件事在 GPU 上跑出帧率同时保证输出完全符合 glTF 2.0 和 Unreal Engine 5 的 PBR 规范。如果你需要的是“AI 自动生成磨损贴图”它不是你的选择但如果你需要“在 30 秒内给一个机械臂模型画出可信的油渍和划痕”它就是目前开源生态里最锋利的那把刀。2. 它如何工作GPU 渲染管线驱动的实时绘制引擎ArmorPaint 的核心技术不是算法创新而是对 OpenGL 渲染管线的极致榨取。它不走传统 CPU 处理图像再上传 GPU 的老路而是让所有绘制操作直接在 GPU Shader 中完成。当你用笔刷在模型上涂抹时实际发生的是顶点着色器Vertex Shader将模型顶点坐标、UV 坐标、法线向量传入几何着色器Geometry Shader根据笔刷大小和压力动态生成覆盖目标区域的四边形网格Quad片段着色器Fragment Shader对每个像素执行以下计算采样当前通道如 Normal的原始贴图值根据笔刷类型Soft Brush / Hard Brush / Stencil、强度、粗糙度参数计算偏移量将偏移量与原始法线向量进行球面插值Slerp确保法线长度始终为 1输出新法线值并写入帧缓冲Frame Buffer后处理Post-Processing实时应用抗锯齿FXAA、Mipmap 生成、法线贴图重定向Tangent Space Reorientation。这个流程的关键在于“无状态绘制”。传统软件如 GIMP保存的是位图数据每次修改都要读取整张图再写入ArmorPaint 保存的是“绘制指令序列”Draw Command List和最终渲染结果。这意味着撤销Undo不是复制图层而是回滚 Shader 执行栈点击 UndoGPU 直接重放上一步的片段着色器计算耗时恒定在 2ms 内与贴图分辨率无关多通道同步更新当你在 Albedo 通道画红色Normal 通道自动根据光照方向调整凹凸感Roughness 通道同步降低该区域反射率——因为所有通道共享同一套 UV 投影和笔刷参数Shader 在一次绘制调用中同时更新多个输出附件Multiple Render Targets, MRT实时预览即最终输出你在视窗里看到的就是导出后引擎加载的效果。没有“预览模式”和“渲染模式”的切换因为预览本身就是离线渲染器如 Blender Cycles所依赖的 PBR 光照模型的精简版实现。举个实操例子给一个 2048×2048 的坦克履带模型画磨损。在 Substance Painter 中你需要等待 UV 烘焙完成约 8 秒切换到 Smart Material 库加载磨损预设约 3 秒调整投影角度、缩放、随机性参数约 15 秒点击“应用”等待 GPU 计算约 12 秒导出四张贴图检查命名是否符合 Unreal 命名规范常出错。在 ArmorPaint 中你只需拖入已展 UV 的 OBJ 文件1 秒选择“Scratch”笔刷强度设为 0.7粗糙度设为 0.9在履带连接处拖动两下实时反馈按 CtrlE 导出自动打包为tank_albedo.png,tank_normal.png,tank_roughness.png,tank_metallic.png1 秒。这个差异不是“快几秒”而是工作流范式的迁移从“配置-等待-验证”变成“观察-绘制-确认”。它要求使用者对 PBR 物理属性有基本直觉比如知道提高 Roughness 会让表面看起来更哑光但回报是思维链路缩短了 80%。3. 为什么必须用 Git 管理 ArmorPaint 项目二进制资产的可追溯性革命ArmorPaint 项目文件.ap是二进制格式但它不是黑盒。它的设计哲学决定了它与 Git 的天然契合度——所有用户操作都被序列化为可 diff 的 JSON 指令流。打开一个.ap文件用文本编辑器查看你会看到类似这样的结构{ version: 0.9.0, model: { path: assets/tank.glb, scale: 1.0, rotation: [0, 0, 0] }, channels: [ { name: Albedo, brushes: [ { type: soft_brush, position: [0.32, 0.67], size: 0.042, color: [0.8, 0.1, 0.1, 1.0], timestamp: 1712345678901 } ] }, { name: Normal, brushes: [ { type: normal_brush, position: [0.32, 0.67], strength: 0.35, direction: [0.0, 0.0, -1.0], timestamp: 1712345678902 } ] } ] }注意timestamp字段——它不是毫秒时间戳而是操作序列号Operation ID。每次绘制、缩放、切换通道都会生成一条带唯一 ID 的指令。Git 的 diff 工具能清晰显示第 127 次提交strength: 0.25 → strength: 0.35法线笔刷强度提升第 128 次提交新增type: stencil_brush指令添加遮罩笔刷第 129 次提交color: [0.8,0.1,0.1,1.0] → [0.9,0.2,0.15,1.0]Albedo 色相微调这解决了 3D 资产协作中最痛的痛点美术迭代无法追溯。在传统流程中美术师 A 发给程序 B 一个tank_v2.pngB 发现金属度不对A 又发tank_v2_fix.png三天后没人记得v2_fix相比v1改了哪几处。ArmorPaint Git 让这个问题消失git log --oneline显示每次修改的语义化描述如 “fix turret rust intensity”git show HEAD~2直接还原出当时的完整绘制状态。更重要的是它支持跨分支资产复用。假设你正在开发两个游戏版本A 版本需要写实锈迹B 版本需要科幻能量纹路。你可以在main分支创建基础坦克模型创建feature/rust分支用 ArmorPaint 添加锈迹指令创建feature/neon分支用不同笔刷添加发光纹路当需要合并时git merge feature/rust会自动合并指令流冲突提示明确到某条笔刷指令如 “Albedo 通道第 17 条指令 vs 第 23 条指令”而非整张 PNG 的二进制冲突。我实测过一个 4K 模型的 ArmorPaint 项目.ap文件仅 1.2MB而对应的四张 4K 贴图总大小为 28MB。Git LFSLarge File Storage只需管理.glb模型文件.ap文件用原生 Git 存储克隆速度提升 5 倍且历史记录完整可查。这不仅是技术选择更是团队协作范式的升级——美术不再交付“图片”而是交付“可执行的视觉决策”。4. 从零开始实战用 ArmorPaint Git 构建可复现的 PBR 纹理管线现在我们动手搭建一个最小可行管线。目标为一个 Blender 导出的简易机器人模型robot.blend→robot.glb绘制 PBR 贴图并通过 Git 追踪每次修改。整个过程不依赖任何商业软件所有工具均为开源。4.1 环境准备绕过 Windows 的 DLL 陷阱ArmorPaint 官方推荐 Windows 10/11但实测发现关键问题默认安装的 Visual C Redistributable 版本与 ArmorPaint 内置 Vulkan 驱动不兼容。症状是启动后黑屏或报错VK_ERROR_INITIALIZATION_FAILED。解决方案不是重装系统而是精准替换下载 Microsoft Visual C 2015-2022 Redistributable (x64) 注意必须是 2015-2022 合并版非单独 2019 版卸载所有已安装的 VC Redistributable控制面板 → 程序和功能 → 按名称排序全选卸载重启电脑运行下载的安装包勾选“为所有用户安装”启动 ArmorPaint首次运行会自动检测 Vulkan成功后右下角显示Vulkan: OK。注意不要用 Chocolatey 或 Scoop 安装 ArmorPaint。它们打包的版本缺少 Vulkan 驱动签名验证Windows Defender 会误报为风险软件并拦截。官方 GitHub Release 页面下载的.exe文件经过微软 Authenticode 签名可安全运行。4.2 模型预处理UV 展开的黄金法则ArmorPaint 对 UV 质量极度敏感。它不校正扭曲的 UV而是直接拒绝渲染。常见错误包括UV 岛重叠Overlapping UVs导致贴图绘制时出现镜像污染UV 拉伸Stretching法线贴图产生伪影UV 边界超出 [0,1] 范围部分区域无法绘制。正确做法以 Blender 为例选中模型 → Tab 进入编辑模式 → U → Unwrap → Smart UV Project在 UV 编辑器中按 A 全选 → S → 缩放至 [0,1] 区域内按 CtrlP → 选择 “Selection into Image” → 新建 2048×2048 图像命名为robot_uv_check切换到着色器编辑器 → 添加 “UV Map” 节点 → 连接到 “Base Color” → 实时观察 UV 是否均匀分布理想状态UV 岛大小比例与模型面数比例一致无大片空白或挤压。导出时务必勾选GLB 格式非 OBJ因 GLB 内置纹理引用“Include UVs” 和 “Include Materials”“Animation” 取消勾选ArmorPaint 不支持动画。4.3 ArmorPaint 绘制实战三步构建可信材质导入robot.glb后界面默认进入 Albedo 通道。此时不要急着画先做三件事第一步设置基础材质参数右侧属性栏 → “Material” → 将 “Metallic” 滑块拉到 0.1机器人外壳非纯金属“Roughness” 设为 0.3哑光塑料感“Emission” 保持 0除非需要发光部件。第二步分区域建立材质逻辑使用 “Select Face” 工具快捷键 F框选头部区域 → 按 CtrlI 反选 → 此时仅头部被选中切换到 Albedo 通道 → 选择深灰色#2a2a2a→ 用 Soft Brush 全覆盖头部 → 这定义了“头部是深色塑料”再选中手臂 → 设为浅灰色#b0b0b0→ 覆盖 → “手臂是浅色塑料”最后选中关节螺丝 → 切换到 Metallic 通道 → 设为 0.8 → 用 Hard Brush 点涂 → “螺丝是高反光金属”。第三步添加物理细节切换到 Normal 通道 → 选择 “Scratch” 笔刷图标为划痕强度设为 0.4方向设为[0.7, 0.0, -0.7]模拟斜向刮擦在手臂表面拖动观察实时凹凸变化切换到 Roughness 通道 → 选择 “Dirt” 笔刷 → 强度 0.6 → 在关节缝隙处轻扫 → 模拟积尘增加粗糙度。导出时选择 “Export Textures” → 勾选所有通道 → 格式选 PNG → 分辨率 2048 → 点击 “Export”。生成的文件自动按robot_albedo.png等命名可直接拖入 Unity 或 Unreal。4.4 Git 集成让每次笔触都有据可查初始化 Git 仓库mkdir robot-texture cd robot-texture git init # 添加 .gitignore关键 echo *.png .gitignore echo *.jpg .gitignore echo build/ .gitignore echo temp/ .gitignore # 只跟踪源文件 git add robot.glb git add robot.ap git commit -m initial: base model and empty armorpaint project后续每次绘制后在 ArmorPaint 中按 CtrlS 保存.ap文件打开终端运行git status # 查看修改 git add robot.ap git commit -m add head plastic texture and arm joint dirt git push origin main团队成员克隆仓库后双击robot.ap即可加载完整绘制状态无需传输任何 PNG。实战心得ArmorPaint 的.ap文件包含模型路径引用。为保证跨平台兼容务必使用相对路径。在 Blender 导出 GLB 时将文件保存在assets/子目录下ArmorPaint 中的模型路径会自动记录为assets/robot.glb。这样无论谁在 Mac、Windows 或 Linux 上打开项目路径都能解析成功。绝对路径会导致 Git 同步后文件丢失。5. 它不能做什么清醒认知边界才能发挥最大价值ArmorPaint 的强大源于其专注但这种专注也划定了清晰的边界。理解这些限制不是贬低它而是避免把它用在错误的场景从而真正释放其生产力。第一它不处理 UV 自动展开。很多人期待它像 Blender 的 “Smart UV Project” 那样一键搞定但 ArmorPaint 的设计原则是“只做渲染和绘制”。UV 展开是拓扑层面的操作需要分析模型几何结构、切割边、优化岛布局——这属于建模阶段的任务。ArmorPaint 会忠实地渲染你提供的 UV哪怕它们重叠或拉伸。因此正确的流程是Blender/Maya 中完成高质量 UV 展开 → 导出 GLB → ArmorPaint 中绘制。试图在 ArmorPaint 里“修复 UV”只会浪费时间。第二它不支持程序化纹理生成。没有 Substance 的节点编辑器没有 Quixel Bridge 的海量素材库。它的笔刷是物理模拟的如 “Scratch” 笔刷基于微表面法线扰动模型但所有效果都依赖人工绘制。这意味着如果你需要生成“随机砖墙”或“无缝木纹”它不是工具但如果你需要“在特定位置画一道符合透视的划痕”它就是最精准的工具。我见过美术师用 ArmorPaint 的 Stencil 功能导入一张真实螺丝照片作为遮罩然后用 Normal 笔刷在模型上“拓印”出完全匹配的螺纹凹凸——这种手工精度是程序化生成永远达不到的。第三它不兼容旧版 PBR 规范。ArmorPaint 默认输出的是 glTF 2.0 标准的贴图Normal 贴图使用 OpenGL 方向Y 轴向上Roughness 和 Metallic 通道为单通道灰度图。如果你的引擎要求 DirectX 方向Y 轴向下的 Normal 贴图或者要求 Roughness/Metallic 合并在一张图的 RG 通道ArmorPaint 不会自动转换。解决方案是在导出后用 ImageMagick 命令行批量翻转法线magick robot_normal.png -flip robot_normal_dx.png或者用 Python 脚本重映射通道。这看似麻烦实则是刻意为之——它强迫开发者面对 PBR 标准的细节而不是依赖黑盒转换。最后也是最关键的限制它不提供云端协作。没有 Figma 那样的实时多人编辑没有 Notion 那样的评论系统。它的 Git 集成是异步的A 修改后 pushB pull 后才能看到。这在小团队中是优势避免冲突但在百人规模项目中需要配合 Perforce 或 Plastic SCM 等专业数字资产管理系统。ArmorPaint 的定位很清晰服务于“一人一机一模型”的高效创作而非“百人千模型”的工业化流水线。我在实际项目中踩过的最大坑就是试图用 ArmorPaint 替代 Substance Designer 做材质模板开发。结果花了三天调试节点逻辑才发现 ArmorPaint 根本没有节点图。醒悟后立刻回归正轨用 Substance Designer 做基础材质模板如“金属氧化”导出为.sbsar用 ArmorPaint 加载该模板生成的贴图再在其上进行手工细化。这才是正确的组合拳——用程序化生成解决重复性用手绘解决独特性。