免费开源的PBR程序化材质工具其实比很多人想得成熟。去年我帮一个独立游戏项目做场景贴图的时候,被Substance Designer的订阅费晃了一下腰。那会儿就在想,有没有一个能程序化生成PBR材质、又不至于从口袋里掏那么多钱的路子。后来在GitHub上翻到一个叫Material Maker的开源项目,版本号还停在1.0,界面和操作逻辑像极了Substance Designer,关键是官方直接内置了中文界面,这对一直躲着英文菜单走的小团队来说,几乎是没有理由拒绝的。这篇文章就把我在实际项目里用Material Maker 1.0做材质、导出贴图、以及踩过的那些坑,完完整整地捋一遍。
1. Material Maker到底是什么,为什么说它“类Substance”
1.1 程序化材质工具的核心思路
先稍微聊下背景。所谓程序化材质,就是不用一张张手绘贴图,而是通过数学函数、噪声、颜色混合等节点组合,实时算出一套纹理。这样做的好处非常实际:第一,纹理是“活”的,改一个参数,全图跟着变,不像手绘贴图改个颜色就要重画一遍;第二,分辨率理论上是无限的,导出512还是4096,只是采样密度的问题,不需要重新雕刻细节;第三,可以被反复复用,存一份节点图,换个种子换个色相,就是一张全新贴图。
Material Maker走的就是这条路线。它的操作方式、节点连线逻辑、烘焙输出面板,都会让用过Substance Designer的人产生一种“这我熟”的感觉。界面左侧是节点库,中间是节点编辑区,右侧是3D和2D预览窗口。你从素材库里拖出节点,连线,调参数,画面实时更新。就这么个流程,不用敲代码,不用手绘,纯“搭积木”的方式就把材质做出来了。
1.2 与Substance Designer的正面对比
Substance Designer是目前行业事实标准,但它的付费模式对个人和小团队并不友好,订阅制一年下来是一笔不小的开销。而且它功能太重,很多做独立游戏、做场景原型、做视觉预演的人,实际上只用到了它20%的功能。
Material Maker的核心场景恰好就落在这个“用不到20%功能”的需求上。它的上手门槛低很多,运行起来也轻快很多,不需要装什么庞大的运行库,一个程序文件直接跑。当然我不能说它能完全替代Substance Designer——在FX-Map、高级函数节点、大型材质库管理这些层面,两者差距还很大。但对于中小型项目、个人作品、课程教学、快速验证材质思路,Material Maker完全够用,而且是开源免费的。
1.3 谁适合用、实际解决什么问题
我总结下来,以下几类人用最合适:
- 独立游戏开发者:要给Unity、Godot、Blender做贴图,不想订阅付费软件,希望一套材质能随时调整;
- 3D美术和场景设计师:做概念阶段和初期场景时,需要快速出一批材质方案,而不是一上来就精雕细琢;
- 学生和培训机构:教程序化纹理原理,用免费工具就能完成大部分教学内容,学员课后自己装一个也不涉及版权问题;
- 技术美术入门玩家:想知道节点式材质编辑器到底是怎么工作的,想尝试自己写节点、改节点模板。
这里插一句,网上那个热词让我哭笑不得——搜“PBR策略路由”搜出来的全是不羁的文章。今天说的PBR是Physically Based Rendering,物理渲染,跟路由器、策略分流一点关系都没有。文章中一律简称PBR,懂的都懂。
2. 核心功能拆解:程序化节点、PBR通道与中文支持
2.1 节点编辑器:Material Maker的心脏
Material Maker的节点系统,底层是用Godot引擎作为运行时基础,节点则是基于GdShader编写的。它内置了相当丰富的节点库,大致可以分成几类:
- 生成类:Noise(噪声)、Shape(形状)、Pattern(图案)这些负责产出“原始素材”;
- 处理类:Color、Blend(混合)、Filter(滤镜)、Transform(变换),负责把原始素材修修剪剪;
- 输出类:Metalness(金属度)、Roughness(粗糙度)、Height(高度)、Normal(法线)、AO(环境光遮蔽),这些可以直接作为导出通道;
- 工具类:Mask、UV、Curve、Remap,处理灰度、曲线、掩码等细节转换。
我第一次打开节点库的时候,稍微有点懵,节点太多了,而且不少节点的英文名看似眼熟,实际作用跟我想的不太一样。但摸索了半小时之后就明白了,它的节点逻辑其实跟图像处理软件里的“图层混合”和“滤镜”概念是相通的。比如我常用的Noise节点,参数里有“Fractal”(分形细节)、“Lacunarity”(空隙度)、“Octaves”(八度),这些概念在合成器里经常出现,理解了之后调起来非常顺手。
一个好用的细节是,节点的每个输入端口都支持“自动转换类型”,你不需要自己手动处理灰度转彩色、颜色转灰度这类操作,连线的时候它会自动生成适配节点。这在初学阶段很友好,不会因为类型不匹配直接报错卡住。
2.2 PBR通道与输出体系
PBR材质通常需要一套“贴图组”才能完整呈现:Base Color(基础色/反照率)、Roughness(粗糙度)、Normal(法线)、Height(高度)、AO(环境光遮蔽)、Metalness(金属度)。传统方法是分别手绘这些贴图,程序化工具的强项就是可以先把材质“逻辑”搭出来,最后一次性烘焙输出全部通道。
Material Maker在这块的处理非常直接。你可以在节点图中给某个节点起个名字,然后在“Output sequences”面板里把这个名字对应的结果映射到某个通道上。烘焙时,软件会按照映射关系输出一套完整的PBR贴图组,文件格式支持PNG和JPG,分辨率可选,还支持导出高度图时“四周泄漏”选项来避免镜像接缝。我实测下来,导出的法线贴图和Normal Map以另一套引擎的二次编码兼容性也很好,大多数引擎直接导入即可。
关于Metalness/Roughness工作流和Specular/Glossiness工作流,Material Maker默认走的是Metalness/Roughness。这也是绝大多数现代引擎的默认方案。如果你做的是类似V-Ray、Corona这类传统渲染器,可能需要二次转换贴图,但这类转换插件也好找,问题不大。
2.3 中文界面:解决了很大的痛点
Material Maker 1.0内置了中文语言支持,包括界面菜单、节点说明、设置面板的翻译。这放在一众“开源程序化图形工具”里是很稀缺的。毕竟像Blender虽然也有中文,但节点属性里大量专有名词翻译得不是很到位;而Material Maker的主要节点解释、参数说明,社区翻译完成度已经很不错。
倒不是说英文界面就一定用不了,但“母语界面”带来的效率提升是实打实的。对一个美术出身的用户来说,刚接触“Fractal”“Lacunarity”这种词,查词典查半天也不一定能对应到中文合成器里的术语;而中文界面上写着“分形细节”“空隙度”,一眼就知道该怎么调。对新手极其友好。
3. 实操:用Material Maker 1.0从零做出一套生锈金属PBR贴图
整个实操我分成四个阶段:新建项目、搭节点图、调参数、输出烘焙。以下都以Material Maker 1.0的实际操作界面为准。
3.1 新建项目与面板布局
双击运行Material Maker,第一次打开默认会有一个示例材质,可以转一转看看预览效果,感受一下刷新速度。然后点击左上角的“新建材质”按钮,会弹出一个选项框,可以选不同的背景模型(球体、立方体、平面)和材质模板(PBR、Simple)。我这里直接选Default即可。
面板布局上,左右分栏:
- 顶部工具栏:材质文件操作、预览模式切换、烘焙输出按钮;
- 左侧节点面板:搜索框 + 节点分类列表,点一下即可添加节点到中心画布;
- 中央画布:节点连线区域,支持滚轮缩放、框选移动;
- 右侧工具栏:2D/3D预览切换,3D模式可以旋转查看材质球。
我习惯先把常用节点拖出来排列好,再连线。新手容易犯的一个错误是:节点一多就随便拖放,最后线交叉在一起看不清楚。技巧是把每个通道的“区块”分开摆放,比如颜色相关放左边,粗糙度和金属度放中间,法线和高度放右边。别嫌啰嗦,等你要调整参数的时候,这种布局能帮你节省大量时间。
3.2 搭建生锈金属材质节点图
一个“生锈金属”材质,从美术逻辑上拆解是:底层是金属颜色和高金属度,表面覆盖着不规则锈迹。锈迹在凹坑、缝隙处比较多,凸起和磨损区域比较少。同时在法线贴图上,锈迹区域应该比金属区域更粗糙、更凹凸。
基于这个分析,节点图可以这样搭:
- 新建“Shape/Shape Mapper”节点,或者直接用“Text/Text + Shape”组合,我这里有更简单的方案——用噪声来做随机锈迹分布。
- 添加一个“Noise/Value Noise”节点,参数设为:分形细节(Octaves)4,Lacunarity 2.0,Scale大概9。这样能得到比较自然的块状分布。
- 通过“Color/Curves”节点调整对比度,让黑白色块边界更锐利,形成锈斑与干净金属的分界。这一步相当于在PS里拉色阶,调整的是像素分布。
- 用“Value”节点加一个常量“基色”,我这里取深灰色(0.25,0.25,0.28),模拟铁锈下底层的金属颜色。
- 再用一个“Colorize”节点把噪声结果转成锈色(橙褐色系,约0.7,0.4,0.1),作为锈迹颜色。
- 用“Blend/Blend”节点,把基色层和锈色层按噪声灰度混合。混合模式选默认的线性插值即可,实际上灰度越接近1就锈迹越浓,越接近0就露出金属底。
- 给“Roughness”打一个Curve节点,让金属区粗糙度低一点(比如0.3),锈迹区高一点(比如0.85)。
这样搭完之后,“Base Color”已经可以看出来了:视觉上就是一大块带锈斑的铁板。但别急,我们还需要把“Height”和“Normal”加上去,不然材质没有体积感。
我用“Shape/Radial”加“Blend”做一个简单的凸起装饰,或者直接用“Noise/Distortion”把噪声图扭曲得更自然。这里教大家一个提升细节的免费技巧:叠加两层不同Scale的噪声,一层负责大块锈迹,一层负责细微颗粒,然后用“Blend/Multiply”把它们叠起来。这样出来的锈迹有层次感,不会是一块一块的“贴纸感”。
把第二层噪声叠加出来之后,将最终灰度接到两个地方:
- 其一是“Height”节点;
- 其二是“Normal/HeightToNormal”节点,用于把高度图转成法线图。
这里就要提到关键参数了:HeightToNormal节点的“Strength”(强度)决定法线凹凸强不强,我一般默认50%左右。太强会变成“搓衣板”质感,太弱几乎看不出细节。如果你在3D预览里发现法线分层特别严重,可以回去调噪声的对比度曲线,而不是一味拉Strength,那样只会过度锐化。
最后的节点图大概长这样:
Noise1 (大尺度锈斑) -> Curves -> Blend (混合锈色与金属色) -> Base Color Noise2 (细颗粒) -> Multiply (与Noise1叠加) -> HeightToNormal -> Normal Noise2 -> Roughness 混合曲线 -> Roughness这里有个操作要特别注意:在“Output sequences”面板里,你需要把对应的端口连到正确的通道上。我常用的是把Base Color、Roughness、Normal、Height四个都勾上,Metalness和AO可以先不勾,等需要的时候再加。勾选后,点击“Preview / Export”或主菜单的“Export Textures”按钮,进入烘焙面板。
3.3 烘焙输出设置细节
烘焙面板出来之后,左侧是输出通道预览,右侧是参数设置。比较关键的选项:
- Resolution(分辨率):我通常默认2048或4096,视项目需求而定。程序化纹理的好处是,不管导出多大,它都不会糊,只是计算时间和内存占用增加罢了。
- Border(边框泄漏):建议勾选,建议设置为“Symmetry”(对称)模式。这样可以避免法线、高度贴图在UV接缝处出现明显的接缝破损。
- Output Folder:设置导出目录。我习惯放在项目Textures目录下。注意一个坑:路径中不要有中文和特殊字符。虽然软件本身界面支持中文,但某些版本对中文路径的处理还是有问题,导出时可能出现文件写不完整的情况。
点击“Export”之后,软件会依次在每个通道的2D预览窗口里绘制输出结果,并写入文件。处理速度很快,2048分辨率的全套贴图在我的笔记本上大约10秒就全部完成。导出后的五张图(BaseColor、Roughness、Normal、Height、AO)可以直接拖进Blender或Godot。
3.4 跨工具使用:Blender和Godot的导入配置
在Blender里,我习惯新建一个PBR材质球,把导出的贴图依次接入Principled BSDF节点:Base Color接到Base Color端口,Roughness贴图接到Roughness端口,Normal接到Normal端口(需要连一个Normal Map节点),Height可以接入Displacement或者Bump。这样近看细节丰满,远看整体统一,效果相当能打。
在Godot 4里,StandardMaterial3D直接有对应的纹理槽位,Base Color、Roughness、Normal Map各自拖进去即可。如果发现曲面看着有点“平”,可以把法线贴图的强度从默认调到0.6~0.8之间,会柔和很多。
Unity的话,记得把导入贴图的“sRGB”选项区分开:Base Color用sRGB,Roughness和Normal用Linear。很多新手把全部贴图都当sRGB导入,结果材质发灰、法线凹凸不对,排查半天其实是这个原因。
4. 常见问题与避坑速查
4.1 节点卡顿和性能问题
最常被问的问题就是:“为什么预览这么卡?”Material Maker虽然是基于Godot引擎做GPU实时预览,但节点数量一旦超过一定量级,实时刷新负担就上来了。尤其是大面积高分辨率3D预览时,掉帧非常明显。
我的做法是:
- 在编辑节点时,把右侧预览从“3D模式”切到“2D模式”,甚至切到“无预览”,只在需要检查整体效果时再回到3D模式。这就好比你用PS时不会一直开启“全局光照预览”,只有最后要出图时才切过去看整体。
- 尽量使用低分辨率的基础背景模型,预览模型选Low Poly即可。
- 不要在一个节点图上堆砌几十个纯装饰性节点。能用Curve实现的效果就不需要单独加Filter来处理,节点机器人精简越好。我见过有人为了一点渐变,硬塞了5个Blend节点,最后烘焙出来色调却不对。节点少,不光是速度问题,更是你理解材质逻辑的直观体现。
4.2 导出后贴图对不上、颜色偏差大
另一个高频问题是:导出的Base Color和预览颜色有差异。这个多半是颜色空间没设置对。Material Maker内部处理时默认是Linear空间,而PNG图片在外部查看器里是被当作sRGB显示的,所以如果你把Base Color贴图直接导入没有颜色管理的软件(比如Windows照片查看器),看到的可能会比预览偏亮偏灰。这其实是正常现象,引擎里导入后配上sRGB标记,显示就会正常。
我自己有个习惯:导出时直接勾选“sRGB”选项(如果有的话),或者在外部工具里二次确认颜色空间。另外,如果你的项目用的是JPG格式做Base Color,注意JPG是有损压缩,在Roughness和Normal这类灰度通道上尽量用PNG,否则会出现可怕的色阶断层。
4.3 中文界面下的翻译不一致
虽然1.0版本内置了中文,但个别节点或属性的翻译偶尔会跟中文习惯不符,或者说同一个词在不同界面有不同译法。比如一些节点名在中文状态下看起来比较直译,像“加亮”“变暗”这种,初看有点懵,但点开后发现参数其实就是亮度/对比度那套,习惯就好。如果你实在不习惯,可以切回英文界面,各种节点名字顿时熟悉,操作效率反而提升。
4.4 关于“输出序列”与“节点命名”的坑
Material Maker中,你可以通过节点右上角的“输出序列映射”来指定材质输出。新手最容易迷失的点是:自己在节点库里随手建了一堆节点,结果发现Output sequences里找不到想要的那个输出口。其实很简单:你需要先选中某个节点,然后在右侧“Output sequences”面板里给它添加一个标签,例如“BaseColor”。再回到烘焙面板,就能看到标签对