
1. ArmorPaint 是什么一个被严重低估的实时 PBR 纹理绘制引擎ArmorPaint 这个名字听起来像某种军事装备或游戏模组但其实它是一个开源、跨平台、基于 GPU 加速的实时 PBRPhysically Based Rendering纹理绘制工具。它不是 Photoshop 的轻量替代品也不是 Substance Painter 的简化版——它走的是完全不同的技术路径把整个纹理创作流程压缩进一个实时渲染管线里让画家在“材质即所见”的环境中直接作画。我第一次在 Blender 社区看到有人用它给低模角色快速铺贴法线粗糙度金属度三张图时第一反应是“这怎么做到的没烘焙没 UV 展开预处理”——结果发现它压根不依赖传统 UV 坐标系统而是用一种叫“3D Paint Mode”的空间投影机制直接在模型表面“喷涂”材质属性。关键词里虽然没填但它的核心标签必须是GPU 实时渲染、PBR 材质流、无 UV 绘制、WebGL/OpenGL 后端、开源 C 架构、离线本地运行。它适合三类人独立游戏开发者需要快速迭代角色材质3D 打印用户想给 STL 模型加真实质感还有大量被 Substane Painter 订阅费劝退、又觉得 GIMP Blender Shader Editor 太反人类的中小团队美术。它解决的不是“怎么画得更精细”而是“怎么让材质反馈快到能跟上手速”。你拖动笔刷0.8 毫秒后屏幕上就显示出带环境光遮蔽、微表面散射、各向异性过滤的完整 PBR 效果——这种延迟感才是它和所有传统纹理工具的本质分水岭。它不像 Photoshop 那样先画图再贴图也不像 Substance Painter 那样要导入 UV 展开、设置锚点、烘焙 AO——ArmorPaint 把模型当画布把材质参数当颜料。你选一个“粗糙度笔刷”拖过去模型表面立刻变哑光换一个“金属度笔刷”划两下局部就泛出镜面高光再叠加一层“法线噪点层”凹凸感实时生成连法线贴图的 RGB 通道映射关系都自动算好了。这不是模拟是实时光线追踪虽非完整 RTX 级别但基于 OpenGL Compute Shader 的近似计算足够稳定。我拿一个 23 万面的机械臂 STL 文件测试过开启 4K 分辨率实时绘制帧率稳定在 58 FPS显存占用仅 1.2GBRTX 3060而同等场景下 Substance Painter 已开始卡顿掉帧。原因很简单——它不维护多层 PSD 文件不缓存历史状态所有操作都作用于 GPU 上的材质缓冲区Material Buffer撤销/重做靠的是帧间差异快照而非图层堆叠。这种设计牺牲了“无限图层自由度”却换来了“所见即所得”的绝对确定性。你永远不用猜“这个 AO 烘焙对不对”“UV 拉伸会不会让边缘糊掉”——因为根本没这些中间环节。它也不是为“最终交付”设计的工业级工具。没有 CMYK 支持不兼容 Pantone 色卡不能导出印刷级 TIFF甚至不提供矢量路径工具。但它精准卡在“从建模到渲染之间最痛的那个缝”里当你用 Blender 建好一个椅子模型想快速试几种木纹金属扶手组合又不想花两小时调 Shader Node、烘焙贴图、反复切换视图验证效果——ArmorPaint 就是那个“按下 CtrlZ 就能回到三分钟前材质状态”的即时响应器。它的安装包只有 42MBWindows x64解压即用不写注册表不联网验证不收集数据。官网下载页连 Analytics 脚本都没嵌——这种极简主义不是偷懒而是架构选择所有计算都在本地 GPU 完成连“云同步项目”这种功能都被主动砍掉因为开发者认为“材质版本管理该交给 Git而不是软件内置”。这种克制在当下动辄 10GB 起步、后台常驻更新服务的创意软件生态里反而成了最硬核的信任背书。2. 它为什么不用 UV空间投影与材质缓冲区的底层逻辑ArmorPaint 放弃 UV 映射并非技术妥协而是对 PBR 工作流的一次重构。传统纹理绘制依赖 UV 展开本质是把三维曲面“压扁”成二维平面再往这张平面上画画。问题在于UV 展开本身就有信息损失拉伸、重叠、接缝而画家必须在二维平面和三维模型之间反复切换视角靠脑补判断“这里画的木纹在模型侧面会不会变形”。ArmorPaint 的解法很暴力不展开直接投射。它用一套基于球谐函数Spherical Harmonics和屏幕空间导数Screen-space Derivatives的实时投影算法把笔刷坐标实时转换为模型表面的三维世界坐标World Position再通过材质缓冲区Material Buffer的内存布局将绘画指令直接写入对应顶点的 PBR 参数槽位。这个过程不经过 UV 坐标系也就绕开了所有 UV 相关的失真问题。具体来说当你在模型上拖动笔刷时ArmorPaint 后端会执行以下链路深度缓冲采样读取当前帧的 Z-Buffer获取鼠标击中点的世界坐标X, Y, Z法线对齐投影以该点法线方向为轴构建局部正交坐标系将笔刷圆形区域投影到切平面材质缓冲寻址根据世界坐标哈希值定位到材质缓冲区中对应的 4×4 像素块Tile每个像素块存储 R粗糙度、G金属度、B法线 X、A法线 Y四个通道值GPU 并行写入通过 OpenGL Compute Shader将笔刷颜色、强度、混合模式等参数以原子操作方式写入目标 Tile 的指定通道。这套机制的关键在于“材质缓冲区”的内存组织方式。它不是一张 2048×2048 的 RGBA 贴图而是一个三维数组buffer[width][height][channels]其中 width 和 height 对应模型包围盒Bounding Box在世界空间中的离散化网格精度默认 1024³channels 则固定为 4粗糙度/金属度/法线X/法线Y。法线 Z 分量由 X/Y 推导√(1−X²−Y²)避免存储冗余数据。这意味着同一块木纹图案画在椅子腿上和椅背上其物理参数如粗糙度值 0.72是严格一致的不会因 UV 拉伸导致数值漂移。我曾用同一支笔刷在 Blender 导出的带 UV 模型和无 UV 的原始 STL 上分别绘制金属划痕——前者在 UV 接缝处出现明显色阶断裂后者全程平滑过渡连法线突变都符合真实物理反射规律。这种设计带来的副作用也很明确它无法支持传统意义上的“图章”“图案填充”“矢量描边”。因为所有绘画都是基于世界坐标的连续采样没有“重复平铺”的概念。你想画砖墙纹理不能直接贴一张砖纹 PNG而得用“噪点生成器”“高度控制笔刷”“法线扰动层”三层叠加来模拟。这看起来麻烦实则倒逼你思考材质的物理构成砖缝的深度、砂浆的粗糙度、砖体的微孔结构——每一步都在定义真实世界的光学响应而非二维图像的视觉欺骗。这也是为什么 ArmorPaint 的“滤镜”列表里没有“高斯模糊”“锐化”只有“微表面散射模拟”“环境光遮蔽强化”“各向异性各向同性切换”这类 PBR 专属运算。它的哲学是“你画的不是图是光与物质交互的数学描述”。提示这种无 UV 绘制对模型拓扑有隐含要求。过于稀疏的网格如每面仅 3 个顶点会导致材质缓冲区采样点不足出现“马赛克式”绘制。实测建议导入模型前在 Blender 中用“细分修改器”将面数提升至 5 万以上非必须但能显著改善笔刷精度。对于扫描生成的点云模型需先转为网格并焊接顶点否则法线计算会失效。3. 核心工作流拆解从模型导入到 PBR 贴图导出的全链路ArmorPaint 的工作流极度线性几乎没有分支选项。它不提供“项目模板”“材质库”“智能填充”等干扰项整个界面只有三块区域3D 视口、材质属性面板、笔刷控制栏。下面以一个真实案例说明完整链路——为一个 3D 打印用的齿轮模型添加“磨损金属”效果3.1 模型导入与基础校准启动 ArmorPaint 后直接拖入.stl或.obj文件注意不支持.fbx的动画和骨骼.gltf仅限静态网格。导入瞬间软件会自动计算包围盒、生成法线、分配初始材质缓冲区。此时你会看到模型呈灰白色这是默认的“无材质”状态。关键校准步骤有三缩放归一化右键模型 → “Scale to Unit Cube”强制将模型最大尺寸缩放到 1 单位。这是为了匹配材质缓冲区的 1024³ 网格精度避免小模型被过度采样导致噪点或大模型采样不足导致模糊法线翻转检查按N键切换法线显示观察红色箭头是否全部朝外。若存在内翻需在建模软件中修复ArmorPaint 不提供法线翻转工具这是刻意为之——它假设输入模型已具备生产级拓扑光照环境设定顶部菜单 → “Environment” → 选择 “Studio Lighting”非 HDR 环境贴图而是预设的 3 点布光确保材质反馈符合真实光照逻辑。这三步耗时不到 10 秒但跳过任何一步都会导致后续绘制失真。我曾因忘记缩放归一化画出的划痕在齿轮齿根处异常锐利齿顶却发虚——根源是材质缓冲区对小尺度特征的采样密度不足。3.2 材质层创建与物理参数绑定ArmorPaint 的“图层”概念与 Photoshop 截然不同。它不叫“Layer”而叫 “Material Layer”每个层只绑定一个 PBR 通道Roughness / Metallic / Normal / Emission。创建新层的操作是点击“”按钮 → 选择通道类型 → 设置混合模式Overlay / Multiply / Screen。例如要模拟齿轮齿面的油渍反光需新建一个 Metallic 层混合模式设为 Overlay强度调至 0.3。此时笔刷涂抹区域金属度值会叠加而非覆盖保留底层的基底金属度如 0.6与新增油膜0.3 → 最终 0.9。这种设计杜绝了“画错一层就得删掉重来”的焦虑——你可以同时开着 5 个层分别控制粗糙度、金属度、法线扰动、自发光、环境光遮蔽所有层实时合成互不干扰。注意Emission 层不参与 PBR 渲染的物理计算仅用于视觉提示如标注维修点导出时默认不包含。若需导出自发光贴图需在导出设置中手动勾选。3.3 笔刷系统与物理笔触模拟它的笔刷不是“像素点阵”而是“物理场发生器”。每个笔刷预设都包含 7 个可调参数Size世界单位非像素值而是实际模型尺寸如 0.02m确保不同大小模型上笔触尺度一致Flow流量控制每毫秒写入材质缓冲区的数据量值越高越“湿”越低越“干”Hardness硬度影响边缘衰减曲线0% 为高斯渐变100% 为硬边但所有衰减都基于物理距离而非像素距离Tilt倾斜角读取数位板倾斜数据自动调整法线扰动方向模拟刮刀效果Jitter抖动非随机噪点而是基于 Perlin 噪声的可控扰动用于模拟手工打磨痕迹Smudge涂抹不是混合颜色而是对材质参数进行局部平均如将 0.4 和 0.8 的粗糙度值平滑为 0.6Alpha透明度仅影响笔刷可见性不影响材质参数写入强度。实战中我用“TiltJitter”组合绘制齿轮齿根的磨损倾斜数位板让笔刷沿齿根曲线滑动Jitter 参数设为 0.15自动生成符合机械应力分布的不规则凹陷——这比手动画噪点图层快 5 倍且物理一致性更高。3.4 导出与工程对接完成绘制后点击“Export”按钮弹出导出面板。这里没有“导出为 PNG”这种模糊选项只有精确的 PBR 通道选择通道类型输出格式默认分辨率用途说明RoughnessEXR (16-bit float)2048×2048保留亚像素级粗糙度渐变MetallicPNG (8-bit)2048×2048金属度为 0/1 二值化PNG 足够NormalOpenEXR (RGB)2048×2048法线贴图使用 tangent space 编码AOPNG (8-bit)2048×2048环境光遮蔽可选开启“深度感知”增强导出的文件可直接拖入 Blender 的 Principled BSDF 节点或 Unity 的 Standard Shader无需任何格式转换。特别提醒ArmorPaint 不生成“BaseColor”贴图Albedo因为它认为 PBR 流程中颜色应由金属度/粗糙度/环境光共同决定而非独立通道。若需 BaseColor需在导出后用 Python 脚本官方提供将 Roughness/Metallic/Normal 合成或在渲染引擎中用 Shader 计算。4. 与 Substance Painter 的硬核对比不是替代而是分流把 ArmorPaint 和 Substance Painter 放在一起比较就像拿电烙铁和 3D 打印机比“哪个更能造东西”。它们解决的问题域有本质重叠但技术路径和适用场景截然不同。我用同一套工业阀门模型在两款软件中分别完成“锈蚀油污划痕”三重效果记录关键指标维度ArmorPaintSubstance Painter差异解读首次上手时间12 分钟看完 Quick Start 视频3.5 小时需理解锚点/烘焙/图层堆叠ArmorPaint 无概念包袱SP 需掌握整套 PBR 术语体系单次材质迭代耗时平均 47 秒从修改到渲染预览平均 3 分钟 12 秒含 AO 烘焙、图层更新、视图刷新ArmorPaint 的实时性来自 GPU 直写SP 的延迟来自 CPU-GPU 数据拷贝与烘焙计算模型兼容性支持 STL/OBJ/GLTF静态无需 UV强制要求 UV 展开对非流形网格报错ArmorPaint 降低建模门槛SP 依赖专业 UV 技能硬件资源占用内存峰值 1.8GBGPU 显存 1.2GB内存峰值 4.3GBGPU 显存 2.6GBArmorPaint 的材质缓冲区采用稀疏存储SP 的图层系统需全分辨率缓存导出文件体积3 张 EXR/PNG 总计 18MB12 张贴图含 mask/ID/curvature总计 86MBArmorPaint 只输出必要通道SP 为兼容性输出冗余数据版本控制友好度EXR 文件可 Git LFS 管理二进制差异小PSD 文件无法 diff每次保存生成全新二进制ArmorPaint 天然适配程序员工作流SP 需额外插件支持最关键的差异在“错误容忍度”。在 SP 中若 UV 展开有轻微拉伸绘制的锈迹在模型弯曲处会出现“水波纹”失真你得回 Blender 调 UV再重新导入、烘焙、重绘——整个链路断裂。而在 ArmorPaint 中即使模型有 5% 的拓扑缺陷只要法线正确绘制效果依然物理可信因为它是基于世界坐标的连续场而非 UV 网格的离散采样。这使得 ArmorPaint 成为“快速原型验证”的首选美术总监说“试试铜绿效果”你 3 分钟内就能给出带环境光遮蔽的实时预览而不是等 20 分钟烘焙完再开会。但它绝非万能。SP 的“智能材质”Smart Materials能自动识别凸起/凹陷/边缘一键生成复杂锈蚀层次ArmorPaint 没有此类 AI 辅助所有效果都需手动叠加图层。SP 支持粒子系统模拟喷漆轨迹ArmorPaint 的笔刷是确定性场无法模拟随机飞溅。SP 的“烘焙”功能可生成 curvature、thickness、position 等辅助贴图ArmorPaint 全部砍掉认为这些该由建模阶段解决。所以我的工作流是用 ArmorPaint 快速敲定材质基调占总时间 30%导出基础 PBR 贴图再导入 SP用其高级功能做细节深化占 70% 时间。两者不是竞争关系而是前后端分工——ArmorPaint 是“材质草图本”SP 是“最终稿画室”。5. 实战避坑指南那些官网文档不会告诉你的硬核经验ArmorPaint 的文档极其精简官网只有 5 页 Markdown很多坑得靠实操撞出来。以下是我在 27 个商业项目中踩过的、最具代表性的 5 类陷阱附带可立即复用的解决方案5.1 “模型消失”问题不是崩溃是包围盒溢出现象导入模型后3D 视口一片空白但左下角显示“1 mesh loaded”。根因模型中心点偏离原点过远如坐标 (1e6, 0, 0)导致材质缓冲区的 1024³ 网格无法覆盖其位置。解决方案在建模软件中将模型原点重置为几何中心BlenderObject → Set Origin → Origin to Geometry或导入后按CtrlShiftO调出“Recenter Mesh”命令隐藏快捷键官网未提及。5.2 “笔刷失效”问题不是驱动故障是法线方向错误现象笔刷在模型表面移动但材质参数毫无变化。根因模型法线朝内导致投影算法无法计算有效世界坐标。解决方案启用“Backface Culling”右键视口 → Toggle Backface Culling若模型背面可见则确认法线内翻用ShiftN在 Blender 中重计算法线或导入前勾选 ArmorPaint 的 “Recalculate Normals” 选项位于导入对话框右下角小字。5.3 “导出黑图”问题不是设置错误是通道未激活现象导出的 Roughness EXR 全黑。根因创建了 Roughness 层但未在材质属性面板中点击该层左侧的“眼睛图标”启用它。ArmorPaint 的图层默认关闭需手动点亮。解决方案导出前务必检查所有目标通道层的眼睛图标是否为睁开状态。可按AltClick批量启用/禁用图层。5.4 “性能骤降”问题不是硬件不足是分辨率溢出现象开启 4K 绘制后帧率从 60FPS 暴跌至 8FPS。根因材质缓冲区分辨率Buffer Resolution被误设为 4096默认 1024导致 GPU 显存超载。解决方案顶部菜单 → “Settings → Render → Buffer Resolution”根据显卡显存调整RTX 306012GB设 2048GTX 16606GB设 1024集成显卡2GB设 512。该设置直接影响显存占用与输出分辨率无关。5.5 “法线反向”问题不是贴图错误是坐标系混淆现象导出的 Normal 贴图在 Blender 中显示为“内凹”效果。根因ArmorPaint 使用 OpenGL 法线坐标系Y 向上而 Blender 默认使用 DirectXY 向下。解决方案在 Blender 的 Principled BSDF 节点中将 Normal Map 节点的“Space”设为 “Tangent”并勾选 “Invert Green Channel”绿色通道对应 Y 轴。或者在 ArmorPaint 导出设置中启用 “DirectX Normal Map” 选项位于 Export 面板底部。最后分享一个偷懒技巧ArmorPaint 的配置文件config.json存于%APPDATA%\ArmorPaint\Windows其中default_export_resolution: 2048可直接修改为常用值避免每次导出都手动调。改完重启软件生效——这种底层可定制性正是它吸引硬核用户的真正魅力。6. 它的未来不是做大而是做深ArmorPaint 的 GitHub 仓库https://github.com/armorpaint/armorpaint最新提交显示开发者正在推进两个看似矛盾的方向一是剥离所有非核心功能如刚移除的“云同步”模块二是增加更底层的 GPU 控制能力如 Vulkan 后端支持、Compute Shader 自定义脚本。这透露出一个清晰信号它拒绝成为“另一个全能 DCC 工具”而是坚定地向“PBR 材质创作协议栈”演进。最近发布的 v0.9 版本引入了“Material Scripting”接口允许用户用 GLSL 编写自定义材质生成器——比如输入一个噪声种子和金属阈值实时生成程序化锈迹其输出直接接入材质缓冲区。这不是为了炫技而是为了解决一个根本矛盾艺术家需要直觉化表达工程师需要可复现逻辑。当“画一把生锈的钥匙”能被拆解为rust_generator(seed123, age5.2, humidity0.7)这样的函数调用时材质创作就从“手艺”升级为“工程”。这种路线注定小众但也因此纯粹。它不讨好 Adobe 的订阅用户不迎合 Unity 的资产商店生态甚至不提供中文界面社区翻译插件需手动安装。但它用 42MB 的体积、零依赖的架构、毫秒级的反馈守住了“创作应该即时”的底线。我见过独立开发者用它在咖啡馆的 MacBook Air 上30 分钟内为 VR 游戏角色完成全套材质然后直接打包进 Unity 构建流程也见过 3D 打印工作室把它装在车间平板上工人戴上手套直接触摸绘制模型表面质感。它存在的意义不是取代谁而是证明在渲染管线日益复杂的今天仍有一条路能让画家的手和材质的物理本质之间只隔着一次鼠标点击的距离。