如果你第一次打开 Substance Designer,第一反应大概率是懵的:满屏的节点、连线、小圆圈,说是材质工具,看起来却更像个编程 IDE。但千万不要被这个界面劝退——这张“节点图”正是 SD 最强的武器。它最大的意义不是帮你画一张贴图,而是帮你建立一套可复用、可调参、可批量出变体的材质生成流程。这篇笔记围绕 SD 的节点系统展开,整理了我从入门到实际项目中反复验证过的高频节点、完整案例、性能优化与常见坑。无论你是刚接触程序化材质的新手,还是已经在用 Photoshop 手动拼材质、想提升效率的艺术家,应该都能在这里找到能直接抄作业的内容。
1. 节点系统到底是什么:从“画贴图”切换到“写流程”
1.1 为什么 SD 选择节点图而不是图层
在传统软件里,材质制作基本是“画一层、叠一层”:底色一层、划痕一层、污迹一层,每一层都是最终结果的快照。如果需要修改底色的色相,要么用调整层,要么退回历史重新来;如果要把这套效果应用到几百个不同颜色的物件上,就只能一张张手动调整。图层流程做“独一无二的一张图”没问题,但做“有规律的批量内容”非常吃亏。
节点图把整个过程从“快照”变成了“工序”。每一个节点只负责一件事:生成噪点、拉对比度、混合两张图、生成法线。数据像流水线一样从左边流到右边。最直接的好处是,任何一步都能随时回头修改参数,后面的结果自动跟着更新。用做饭来类比:图层流程更像是你现场一锅一锅炒,改配方就得重新炒;节点图则是先写菜谱,想少放盐就改菜谱,后续所有菜都会按新配方重做。
我现在做得比较多的资产复用场景里,节点图的价值更明显。一个节点网络配好之后,我只保留几个暴露出来的参数:划痕密度、锈迹程度、金属亮度。美术拿过去就能在引擎里直接调节,不用再回到 SD 里翻节点。这就是程序化材质的意义:从“生产贴图”变成“生产工具”。
1.2 看懂节点连线背后的数据流
节点图无非就是输入、处理、输出三个部分。每个节点左侧是输入端,右侧是输出端。连线传的可不是“贴图”这么简单,而是带类型的数据。常见几类:标量数值,比如强度、密度;灰度图,通常用于遮罩、高度、粗糙度;彩色图 RGBA;法线图;还有向量数据,比如扭曲方向。肉眼怎么区分?看连线颜色最方便,灰度图一般是黄色,彩色图多为红色系,法线是蓝色,向量是绿色。鼠标悬停在端口上也会显示具体类型,拿不准就看这个。
我踩过最典型的坑是把彩色图直接拖进粗糙度输入,出来效果乱成一团。节点系统不像 PS 那么“宽容”,类型不匹配时它允许你连,但不保证结果正确。遇到这种情况,先在前面加一个 Convert 或 Grayscale 节点,把彩色数据转成灰度,再往下接。理解数据流以后,很多“怎么连都不对”的问题自己就能定位。
1.3 从“做一张图”升级为“做一类图”
节点图还有一个容易忽略的优势:随机种子和参数化。比如做一个碎砖花纹,随机种子一变,瓷砖的排列、破碎感全部重新计算,几秒钟就能出一个新变体。这个思路在大批量资产生产时非常有用。同样一块石板,在不同项目里可能需要的缝隙宽度、表面风化程度完全不同,我不需要重做,只需把对应的参数暴露出来,输出 sbsar 后让使用方自己调。这也是为什么很多团队愿意把材质资产从传统图层流程迁移到 SD 节点流程的原因——资产一旦程序化,后续维护成本会直线下降。
2. 高频节点分类速查:搭图前先认识常用工具
2.1 生成类节点:原料从哪来
一段节点网络的起点,通常是生成类节点。它们负责凭空产出灰度、颜色或形状,是整个程序的“原材料车间”。
用得最多的是 Tile Sampler(旧版叫 Tile Generator)。它能在画布上排布大量图元,支持矩形、圆形、多边形等形状,每个图元还能设置随机尺寸、随机旋转、随机颜色。做墙砖、地板、格栅、铆钉、通风口,都靠它起步。做板缝结构时,把 Tile Sampler 的间隔 Gap 调出来,再接 Levels 或 Curves 提取边缘,就能得到清晰的板缝遮罩。
噪点类节点同样高频,Perlin Noise、Gradient Noise、Value Noise 这些都属于这一类。程序化材质里那种自然的污迹、划痕、石纹,底层都是不同频率的噪点在起作用。Perlin Noise 适合做柔和的随机变化,想要更大块、更硬边的斑块,可以把 Scale 调低或者在高频噪点后面接 Levels 强行拉对比度。Gradient Map 节点则是把灰度数据变成彩色渐变,比如把一张高度图映射成“泥土色到草丛色”,就能直接生成地表颜色变化。
Flood Fill 系列容易被新手忽略,但它非常强。它的作用是把图像里的连通区域识别出来,然后给每个区域输出随机颜色、随机灰度、中心位置等。比如瓷砖上的每一块单独变色、每张瓦片产生独立污渍,用 Flood Fill to Grayscale 或者 Flood Fill to Color 配合其他节点很快就能实现。
2.2 调整与滤镜类节点:把原料加工成可用资源
生成类节点出来的通常是“毛坯”,还需要大量调整、滤镜节点进行加工。
Levels 是最常用的对比度工具。噪点一般分布得很均匀,直接用会显得很“平”;把 Levels 的黑点、白点往中间收,对比度立刻增强,随机斑点就会变成清晰的 Mask。Histogram Range 更精细,可以指定保留哪个范围的灰度,常用来从 Step 值中切出亮部或者暗部区域。Curves 则适合做非线性的色调映射,比如把暗部压得更实、高光拉长。
模糊类节点里,Blur 和非均匀模糊 Nonuniform Blur 都很有用。前者做柔化,后者可以让模糊方向随 Mask 变化,适合做有方向性的材质过渡。Directional Blur 则沿指定方向产生运动模糊感,做金属拉丝或者磨损方向非常合适。
AO 节点用于从高度图生成环境光遮蔽效果,给缝隙和凹陷增加接触阴影。Bevel 节点能从灰度高度中提取边缘信息,用来做高光、边缘磨损都很顺手。Height Blend 用于把两张高度图混合,和普通 Blend 的差别在于它考虑深度关系,过渡更自然,做泥浆覆盖、积雪堆积这类效果时比直接用 Blend 好得多。最后别忘了 Convert 类节点,灰度转法线、彩色转灰度、RGBA 拆分通道,都属于这类,是节点图里的“格式转换器”。
2.3 混合与输出节点:最终呈现的关键一环
Blend 节点是整个节点网络的组织核心。它把两张图按照正常、正片叠底、线性减淡、叠加等混合模式合在一起,并且可以通过 Mask 控制混合范围。混合模式的选择有讲究:做锈迹时我喜欢用 Overlay 或 Linear Dodge 来增强颜色融和感;做污渍遮罩时正片叠底能把图案自然地压进底色里。Blend 不只能混合颜色,灰度图同样能混合,关键在于你要明确是在混合“哪一个通道的数据”。
最终要输出时,会用到 Output 节点。在 SD 的资源库面板里,每个 Substance Graph 都有 Inputs 和 Outputs 文件夹,右键 Outputs 可以新增输出。这里要指定名称、格式、分辨率和颜色空间。很多人做出好看的预览但导出去不对,八成问题都出在这一步:Base Color 输出要选 sRGB,Roughness、Metallic、Height 这类数据通道在引擎里一般按线性数据用,强行勾 sRGB 会整体偏灰发白。
2.4 函数与流程节点:给节点图添加逻辑
当节点多了以后,常规连线已经无法满足需求,就需要函数类节点介入。
FX-Map 是 SD 内置的可编程节点,可以在里面写类似脚本的表达逻辑。最简单的例子,想做一个左边黑色右边白色的渐变,不用拉 Gradient Map,直接写一个表达式:$pos.x > 0.5 ? 1 : 0,意思就是当前像素的横坐标超过 0.5 就输出 1,否则输出 0。这只是一个教学示例,实际用起来可以配合$pos.y、$time等变量做更复杂的动态效果。虽然这类节点用得不多,但理解它会让你的思路从“连节点”升级为“写逻辑”。
Pixel Processor 更进一步,相当于给每个像素执行一段自定义处理程序,玩法更接近写 Shader。这块我建议入门阶段先了解,遇到确实需要逐像素操作的需求再深入研究。
另一个更实用的“流程级”手段是子图封装。在 SD 里可以把一段节点网络保存成子图,然后像普通节点一样被引用。平时我会把“板条缝隙”“随机锈迹”这类频繁复用的逻辑拆成子图,既减少主图面积,也方便在不同材质之间复用。
3. 实操案例:从零搭一块可复用的磨损金属板
3.1 案例目标和节点规划
直接说今天要做什么:一块带板条接缝、表面有划痕和局部锈迹的金属板。做完以后,只暴露几个参数给下游使用:板条宽度、划痕密度、锈迹强度。这个案例基本覆盖了生成、调整、混合、输出这些核心环节,是入门节点系统最合适的练习。
思路可以拆成四层:第一层定结构(板条和接缝);第二层做表面变化(粗糙度、密度波动);第三层做细节(划痕、锈迹);第四层定颜色并分通道输出。提醒一下,别一开始就急着连颜色。程序化材质里,很多信息先以灰度图形式做好,颜色在后面统一处理,这样后续换配色非常方便。
3.2 一步一步搭建节点网络
第一步,新建 Graph。启动 SD 后,点击 File > New Substance Graph,命名并选择分辨率,建议先用 1024,等流程确定后再升到 2048。分辨率会影响所有节点缓存,节点图构型阶段开太高会白等很久。
第二步,生成板条结构。在空白处按空格键打开节点搜索框,输入 Tile Sampler,加入节点。Properties 面板里把 Shape 设为 Polygon 或 Rectangle,X 轴数量设 6,Y 轴数量设 4,间隔 Gap 根据板缝宽度来,先设为 0.05 左右。这个节点就已经输出了一张灰度结构图。再在 Tile Sampler 之后接一个 Levels,把板条区域推白、背景压黑,方便后面做遮罩。
第三步,生成板缝细节。如果你想要板缝有深度感,可以把 Tile Sampler 的灰度输出接到一个 Curves 节点,调整曲线让接缝处的灰度过渡更明显,之后接到 Height 通道。或者用 Distance 节点提取板条边缘距离,再接 Levels 做接缝遮罩,这个方法更灵活。
第四步,做金属表面粗糙度变化。新增 Perlin Noise,Scale 先拉到 15 左右,输出接到 Levels 调整对比度,让它的变化更鲜明。然后把这一路和第二步的结构图接到一个 Blend 中,Blend 模式选 Multiply,这样粗糙度会在板缝位置稍微加深,形成“接缝更磨损”的自然效果。
第五步,做划痕。添加 Directional Noise 节点,Angle 设置成接近 0 度或 60 度,让它呈现明显的方向性;再把 Scale 调到较高值,得到细碎噪点。后面接 Levels,把阈值往上拉,只保留最亮的一部分,就是“划痕遮罩”。如果觉得划痕太碎,可以在 Levels 之前接一个轻微 Blur 做软化。这个遮罩后面会用来控制粗糙度通道的亮部,让划痕看起来更亮更光滑。
第六步,做锈迹。新加一个 Perlin Noise,Scale 调到 5 以下,得到大块斑驳;再接 Directional Warp,给它一个方向性的扭曲,看起来像水流浸蚀过。之后用 Gradient Map 把灰度映射成从深褐到橙黄的渐变,作为锈迹颜色。最后把锈迹颜色和金属底色通过 Blend 混合,Blend 的 Mask 连接之前的锈迹遮罩。
第七步,整理输出。在 Outputs 里依次添加 Base_Color、Roughness、Height、Normal 四个输出。Base_Color 接到第六步的混合结果;Roughness 接到第四步和第五步合并的灰度结果;Height 接到板缝和表面变化的总高度;Normal 不能直接用高度图,要先加一个 Normal 节点(From Height),把 Height 灰度转成法线后再接到 Normal 输出。
第八步,暴露参数并保存。在 Tile Sampler 的属性面板里,把 X 轴数量、Gap 等参数通过参数左侧的小圆点暴露出来;在 Perlin Noise 上暴露 Scale 作为划痕密度;在锈迹遮罩的 Levels 上暴露阈值作为锈迹强度。参数暴露时建议重新命名,用英文简短名称,引擎端显示更友好。最后 File > Save As,格式选 sbsar,这个资产就可以导入 SP 或引擎使用了。
3.3 输出通道设置与常见格式
把常用输出通道的设置整理成一张参考表:
| 输出通道 | 推荐来源 | 格式 | 颜色空间 |
|---|---|---|---|
| Base_Color | 颜色混合层 | PNG 8bit | sRGB |
| Roughness | 灰度变化层 | PNG 8bit | Linear |
| Metallic | 金属 Mask | PNG 8bit | Linear |
| Height | 高度灰度 | PNG 16bit | Linear |
| Normal | From Height 转法线 | PNG 8bit/16bit | Linear |
这里最需要注意的是颜色空间。Base Color 是给人眼看的颜色,用 sRGB;Roughness、Metallic 都属于数据通道,引擎会按线性数据读取,输出时不要勾 sRGB。Height 用 16bit 是为了保留更多深度细节,避免导出发黄发白。
4. 常见问题排查与性能优化
4.1 节点图越来越卡?先别怪电脑
节点图卡顿,大多数时候不是电脑不行,而是你让每个节点都做了全尺寸渲染。一个 2048×2048 的 RGBA 临时缓存就是约 16MB,但随着节点链越来越长,几十个节点同时缓存,内存占用很快就冲上去。长宽减半,缓存占用会变成原来的四分之一,所以构型阶段先用 1024,最后调 2048,是性价比最高的方式。
SD 默认会自动更新和缓存预览。如果节点很多,每次调参都会触发整条链重算,体验很糟。可以在 Graph 视图工具栏找到自动更新开关,切换成手动刷新模式,把所有操作做完再统一刷新。对于不需要细看的中间节点,右键取消它的预览状态,也能明显减少计算量。SD 在设置里可以配置缓存大小和位置,磁盘缓存长期不清理会占用几十 GB,可以定期执行清理 Graph 缓存的操作。
4.2 输出结果和预览不一致
预览看起来正常,导出到 SP 或引擎后却发灰、发白、发紫,这类问题十有八九是颜色空间或者输出设置不对。最常见的是把 Roughness、Metallic 这类数据通道也勾成了 sRGB,引擎读出来的数值就整体偏移了。另一个常见问题是法线从 SD 导出后看起来“平”或“翻面”。SD 里通常用 Normal 节点从 Height 转法线,注意检查空间参数是切空间还是对象空间,引擎标准资产一般用切空间。
还有一个容易被忽略的点:如果节点的输入是彩色图,而你把它接到了灰度通道,SD 会按灰度转换后再计算,但转换结果未必符合预期。建议在源头使用 Grayscale 节点或 Convert 节点显式转换,至少心里清楚数据类型。
4.3 节点图乱了怎么办
节点少还好,一旦超过 30 个,没有规划的话,几天后自己都不想打开这个文件。命名规范特别重要,我习惯用类型_用途的方式:Noise_ChipMask、Levels_RustSoft、Blend_RustColor,一眼就知道这是什么。节点名也可以在 Properties 面板里改成更直观的名称,不要怕麻烦。
Frame 区域框是整理布局的神器。在节点库搜索 Frame 或者在右键菜单中添加 Frame,把一批逻辑相关的节点拖进去,就能给节点图做“文件夹”。把不同功能块放进不同 Frame,图面会清爽很多。更彻底的做法是拆成子图,将一段独立逻辑封装成一个小模块,主图保留几个子图实例即可。
4.4 从 SD 导入 SP 或引擎后效果不一样
导入 SP 后,参数面板可能显示一堆无意义的参数名;或者材质缩略图看起来和 SD 预览完全不一样。前者多半是暴露参数时没命名好,最好用英文简短命名,并逐个确认。后者则要检查输出尺寸和 Mipmap 设置,细节在高分辨率下才会明显,如果引擎加载的是低精度 Mipmap,接缝处会糊。把输出节点里的 Format 设置为需求对应的格式,并确认是否需要的 Mipmap 已勾选。建议在 SD 里用 1/2/3 多个渲染预览窗口对比不同光照下的效果,确认稳定后再发布。
4.5 各种数据类型导致的细节坑
灰度图有时会带透明度通道,如果直接连到 Height,就可能出现透明区域被当成黑色处理。Flood Fill to Color 的输出也不是纯 RGB,可能带 Alpha,接入某些节点时要留意。遇到“某个节点对输入特别挑剔”的情况,先查一下输入端的提示类型,再决定要不要转一次格式。很多时候,加一个 Convert 或者 Split RGBA 节点就能解决看似顽固的问题。
5. 从“会连节点”到“会写节点”:进阶方向
5.1 FX-Map 小例子:用表达式控制 Mask
拿 FX-Map 做一个简单演示:添加一个 FX-Map 节点,双击进入编辑面板,输入表达式$pos.x > 0.5 ? 1 : 0,当前像素横坐标大于 0.5 时输出白,否则输出黑。把结果接到 Roughness,金属板就会右半粗糙、左半光滑。这只是开胃菜,实际项目里用 FX-Map 做规则化 Mask、动态遮罩、重复图案控制非常方便,关键在于理解表达式语法和内置变量,比如$pos.x、$pos.y、$time、$seed。
5.2 学习路径上的一点建议
我是靠“拆官方材质”入门的。SD 官方示例库里有大量 SBS 文件,把它们下载下来,选中一部分节点隐藏或禁用,看结果变化;再尝试重连不同输入输出,观察效果;最后自己复刻一个简单材质,比如一把钥匙或一块砖墙。这个过程比看任何教程都高效,因为你会不停遇到“原来这个节点是这么用的”瞬间。
另外,做节点记录的时候,可以按项目写备忘,把每个材质的节点网络截图、暴露的参数列表、输出设置存在文档里。半年后再回看,这些笔记比软件本身更珍贵。节点图开发是一项越用越顺手的技能,前期慢是因为你不熟悉节点库,等常用节点都长在肌肉记忆里,出材质的速度会远超手动改贴图的老流程。
我自己用得最多的小技巧是:构建期尽量用低分辨率,等确定思路再升分辨率;任何需要重复使用的逻辑,第一时间做成子图;任何参数暴露,第一时间命名好。另外,在搭建节点时可以在预览窗口的 1/2/3 切换不同视图,一个放 Base Color 效果,一个放 Roughness 灰度,一个放 Height 或 Normal,调参时不用来回切换节点就能看到整体变化。踩过几次坑之后,我现在拿到一张参考图,第一反应不是“怎么画”,而是“能用哪些节点生成出来”,这个思维转变,才是节点系统带给我最大的收益。