Substance 3D Designer 制作的刀削面成品俯视图,面条、卤蛋、肉丸、牛肉块与豆干浸在汤中

Substance 3D Designer 不只是做工业材质的工具——来自上海的材质艺术家 Chao Chang 就用它做了一碗山西刀削面,从面条到汤底全部程序化生成,最后在 Blender 的 Cycles 中完成渲染。

引言

大家好,我是 Chao Chang,一名常驻上海的材质艺术家,目前在一家游戏公司全职工作。大学时我主修数字媒体艺术,方向是游戏美术。2020 年毕业后我进入游戏行业,先做了两年 3D 模型师,之后转型为现在的材质艺术家。现在我在参与一款多平台开放世界游戏的开发。

我第一次接触 Substance 3D Designer,是大学老师给我看他用这款软件做的一个雨滴材质。当时我在课程里学到的工作流是:先建 3D 模型,在 ZBrush 里雕刻,然后拓扑、烘焙,最后手绘贴图。

当我第一次看到基于节点的做法能直接生成材质贴图,而且质量高、可调性又强,整个人都惊了。当时我只有一个念头:「这太酷了,我一定要掌握它。」

从那之后,我开始在网上找教程、利用业余时间研究节点组合,一点一点地学。过程常常枯燥,但我坚持了下来。每完成一个小练习,都会带来一点成就感,让我愿意继续走下去。

这件作品的动机,是想探索一个自己日常工作之外的主题。由于职业上主要做环境材质,我想挑战一点不一样的东西。那阵子我正在控制体重,一位山西老乡发来当地美食的照片。这给了我灵感:既然吃不到,那不如把它做出来。

第一步当然是收集参考。好在食物特写照片在网上比较容易找到,我甚至找到了一些山西刀削面的制作教学视频,从里面截取了几个关键的削面步骤作为视觉参考。

山西刀削面的配料参考照片,包含面条、卤蛋、肉丸、豆干与牛肉块

刀削面的配料

我的整体思路是先做一张完整的高度图,把面条和配菜都包含进去。然后用各自的遮罩一步步上色,接着做对应的粗糙度贴图。法线贴图则直接用节点从高度信息中提取。

然后进入制作流程。开始之前,我想起 Daniel Thiger 有一个关于面条的教程,但太久没看,细节已经记不清了。于是我又看了一遍,吸收其中做面条的技巧,并在他的方法基础上做了适当的修改。

为了保留面条被刀一片片从面团上削下来这一特征,我把它的形状改得更扁平,并保留了表面的隆起痕迹。随后我把面条分成底层、中层和顶层,模仿层与层之间相互挤压的效果。

我用 Perlin Noise → Directional Blur → Quantize Grayscale → Edge Detect 这一组合提取出面条的基本形状,再在这个基础上做一些基础的 Warp 调整。最后,我复制了几组节点,给每一组引入变化,一层层叠起来。

用 Perlin Noise、Directional Blur、Quantize Grayscale 与 Edge Detect 提取面条基础形状的节点组合
复制多组节点、逐个引入变化再逐层叠加的面条节点图
面条基础形状的灰度噪声图,用于后续提取条状结构
面条分为底、中、上三层相互挤压的分层遮罩

面条做完之后,我决定再加一些配料。我认为卤蛋、炸肉丸和豆干是不可或缺的三样。鸡蛋基本上就是一个椭圆形,一端比另一端略大。在参考照片里可以看到,它的高光区域并不是平滑反射。

裂开受力后还会出现一些纹理图案与小裂纹。把这些元素加上去,一颗卤蛋就完成了。(至于为什么不做切开的蛋,虽然那样可能更有表现力,只因为我平时的吃法里不常见,而不是偷懒。)

3D 渲染的卤蛋基础形态,是一端略大于另一端的椭圆
制作卤蛋的 Substance 3D Designer 节点组合

接下来是炸肉丸。开始之前,我想起不久前看过的 Ezequiel Delaney 的肉团教程,虽然细节记不全,但我知道里面有我需要的灵感。

于是我把它找出来,重看了前面做肉丸的部分。虽然不能照搬,但它的方法论与工作流是很棒的参考,我可以按自己的需求做调整。

我先做出基本形状,再分两层由大到小堆出质感,逐步给肉丸加入变化。最后在与面条整合时,我整体调整了 Levels,确保它们能稳稳地坐在面条上。

卤蛋表面带纹理与小裂纹的高度图
在卤蛋表面添加纹理图案与小裂纹的节点图
炸肉丸表面的颗粒噪声图
由大到小分两层叠出肉丸颗粒感的节点图
牛肉块的节点组合与肌肉纤维叠加

下一个想加的配料是豆干。它是把豆浆凝固压制成型的,所以基本形态相当规整。为了在制作时更好地表现高度,我用 Height Extrude 节点模拟它从一块平的长方形变成三维形态的过程。

两端亮度的变化也很好地模仿了它半浸在面汤里的效果——一部分露在上面,一部分埋在下边。最后我加了一些压模过程中形成的表面细纹,就基本完成了。

用 Height Extrude 节点把平面矩形挤成豆干三维形态的黑白高度图
制作豆干的节点组合,包含压模形成的表面细纹

接着,给面里加些肉块。我选择做牛肉块,因为肌肉纤维更容易表现(虽然真实的卤肉可能并不是这样)。我先用一个 Cube 3D 打好结实的基础形状,加上一些扭曲变化,再叠一层 Cell Map 模拟肌肉纤维的质感。

最后我用 Shape Splatter 把肉块散布到面条之间(同时用遮罩限定分布区域,避免与之前放好的卤蛋、肉丸等元素过度重叠)。

以 Cube 3D 为基底、加入扭曲变化后的牛肉块基础形状
用 Cell Map 模拟牛肉肌肉纤维的节点图

分布时可以用几个 Shape Splatter 节点,逐步加入肉块。这样一步步来,对最终的摆放位置控制得更好。

面条上卤蛋、肉丸与牛肉块的高度渲染效果
用 Shape Splatter 把配菜散布到面条上的节点图

制作汤底

面条部分到这里就结束了,接下来开始做汤。我最初的想法是用一个 Water Level 节点,但很快就发现这不是最好的做法。我决定单独做一套汤底材质,在后面的渲染阶段再合成。

概念其实很简单:一层半透明液体的平面,上面浮着一层细密的油脂,再点缀几片香菜叶和葱花。

用来模拟牛肉肌肉纤维的黑白 Cell Map 图案
逐层加入牛肉块的 Shape Splatter 分布节点图
肉丸表面颗粒分布的灰度图

为了让油脂效果更真实,我在 Color、Roughness、Specular 与 Translucency 通道上都对油脂层做了针对性调整,而不是严格遵循标准的 PBR 流程。

标出香菜叶与葱花位置的分布图,橙色底上散布着绿色小点

渲染

所有贴图准备好之后,就进入渲染阶段。按照组长的建议,我用 Blender 的 Cycles 做最终呈现。这是我第一次用 Blender 渲染,一开始觉得有点难,还去查了一些入门教程来掌握基础。

好在现在的教学视频非常多。理解了材质着色的基本原理之后,我就能开始连一些简单的节点并调整结果了。

我把场景保持得很简单,只用了几个基础模型:一张桌子、一个碗,以及两个高模圆形平面。我打算直接用高度置换来做出面条模型(保持 X、Y 轴一致,只在 Z 轴上有轻微变化)。

下面的圆形平面赋予面条材质,另一个赋予汤底材质。然后在着色器里把高度贴图接到置换输入上,让平面根据高度信息产生形变。

3D 场景中用一块平面承载汤底材质的搭建效果
汤底材质的节点组合与渲染预览

现在正式进入着色器界面。我把所需的贴图与几张遮罩都导了进来(把遮罩也导进来,是为了能在着色器里直接调整肉丸、香菜叶这类简单元素的颜色和粗糙度,不用在两个软件之间来回切换)。

Blender 着色器中基础贴图(红框)与颜色、对比度调整(黄框)的节点

(红框里是基础贴图,黄框里是颜色、对比度之类的调整。虽然看起来有点乱,但底层逻辑相当直接。)

我用的是 Principled BSDF 着色器,大部分贴图都可以直接接进去。对于这套材质,在接好基础色、法线、粗糙度与高度置换之后,一定要试着打开次表面散射(Subsurface Scattering)。

它会显著提升材质的整体表现,尤其是让肉丸、牛肉块和豆干看起来更融合,像是吸饱了汤汁一样。

用 Principled Bsdf 连接颜色、法线、粗糙度与高度置换的节点连线
Blender Cycles 渲染的刀削面成品,面条与配菜细节完整

做汤底着色器时,流程与面条大体相同。我把基础贴图接到 Principled BSDF 上,并开启次表面散射。

在此基础上,我又额外用了一个 Translucent BSDF 着色器,并用 Mix Shader 节点把两者混合。我不太确定这个做法在物理上是否完全正确,但在渲染预览里效果更可信,所以就用了。

汤底着色器:Principled Bsdf 搭配 Translucent Bsdf,再用 Mix Shader 混合的节点图
Blender Cycles 渲染的刀削面近景,面条与配菜细节清晰

灯光方面我没有做特别处理,只是设了一张 HDRI 环境贴图和一盏点光。最后我在渲染属性里试了不同的色彩管理设置,挑出视觉上最合适的一种。以上基本就是我在 Blender 里做的全部步骤。

在渲染属性中试验不同色彩管理设置的界面

最后我想分享一个在制作过程中花了不少时间思考与测试、但最终没有用在作品里的方案。山西刀削面与普通面条不同,它是用特制刀片从面团上一片片削下来的,形状是扁平的带状而不是圆的。这会带来复杂的自然扭转与堆叠,是我在制作初期遇到的第一个大难题。

和同事讨论之后,我了解到用 Spline 工具或许能模拟出这种效果。但在实际实现时我发现,这个方法做少量单根面条也许不错,一旦数量大起来或需要平铺,就会出问题。

复杂的交叉与难以控制的高度变化会让后续流程变得麻烦,得大量使用 SVG 遮罩去修正,进一步调整也很不方便。

另外,在测试阶段我发现变化太多反而让面条显得过于凌乱,渲染结果并不好看。即便如此,我依然认为这是一个值得分享的思路,尽管它最终没有进入渲染成片。

最终渲染的刀削面成品俯视图
用 Spline 工具模拟面条自然扭转堆叠的节点图
Spline 方案中组合节点生成面条的试验
Spline 方案里处理面条分布与交叉的节点图
Spline 方案中用于生成面条的三维曲线视图

结语

总而言之,一碗看起来简单的面,真正动手做起来往往和最初设想很不一样。只有亲自做,才会遇到真正需要解决的问题,才会发现无数意想不到、需要反复调试的细节。即使在最后的渲染阶段,你也会经常回到工程文件里重新调整。

学教程的时候,不必逼自己记住每一个细节,只要在心里记下每个技巧出彩的地方就好。单单这个印象,以后也许就能帮你跨过类似的难关。然后根据自己的实际需求,把那些方法适当改造,融进自己的工作里。

对新手来说,我的建议是多看教程,但更重要的是看完之后真的动手做。给自己定一些够得着的目标,完成它们带来的成就感会让你保持动力。接着回顾自己的作品,找出可以改进的地方,再进入下一个挑战。

更多材质制作拆解可以查看本站 案例教程 分类;

想了解同一套软件做食物材质的思路,可以看 小熊软糖材质:Substance 3D Designer 的 SDF 流程,想了解这套节点流程所在的软件版本,可以参考 Substance 3D Designer 16.0 发布:3D 散布 + SDF 建模 + OpenPBR。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。