
可以将分层材质想像成“材质内的材质”。它们提供了一种方法来创建单个具有一系列子材质(即 层)的材质,这些子材质可以使用按像素的操作(例如蒙版)放在对象表面上。它们适合于处理独特表面类型之间的复杂混合。在上面的火箭图中,最右边的火箭使用了单独的材质层,包括铬合金、铝和铜,并且按像素在各材质之间进行混合。此效果可通过分层材质轻松实现。
作为一项功能,分层材质是作为材质函数的扩展而存在。你可能还记得,函数是独立的节点网络,用于执行特定的运算,例如复杂的数学方程式。这些函数可在任意数目的材质中随意重复使用。在 Make Material Attributes(建立材质属性)_和 _Break Material Attributes(中断材质属性)_节点的帮助下,函数也可用来定义材质(完全在函数 _之内 进行定义)。然后,通过将这些函数引入到最终的材质中,便可建立分层材质。

在上图中,我们已通过 Make Material Attributes(建立材质属性)节点建立简单的铬合金材质(完全在材质函数内建立)。现在,此函数可用作 材质层,并可以与其他材质层混合。
因为材质函数无法直接应用于表面,你需要将材质层函数引入到可以应用于对象的新材质中,认识到这一点十分重要。这样做的好处是,你可引入任意数目的材质层,以你认为合适的方式对其进行混合。
因此,在较高级别,工作流程如下所示:
- 建立新材质,并将其调整为达至完美。
- 在内容浏览器中,建立新材质函数,并将所有材质函数节点复制/粘贴到其中。
- 将网络连接到新的 Make Material Attributes(建立材质属性)节点,并将其连接到“函数”(Function)输出。
- 保存该函数。
- 将该函数从内容浏览器拖放到材质编辑器中。现在,它变为材质层。
- 使用材质层混合函数将多个材质层混合到一起。
现在,最终的对象在其表面上可以有多个明显混合的材质层。
重要的益处
使用分层材质的好处之一是,它们使你能够创建不如此则非常复杂的材质,并就将来可编辑而言使其更容易管理。例如,可以 使用普通的不分层材质来创建分层材质效果,但这需要使用复杂的网络在 每个材质输入 的不同纹理和值之间进行混合。因为大部分材质使用多个输入,此类材质的复杂性会大大提高。

请注意以下网络的复杂性,此网络未使用材质层,并将铬合金效果与铜效果混合到一起,例如产生上图所示的效果:
没有材质层
但是,使用分层材质时,每种不同的材质类型都包含在自己的节点中,这使混合更加简单,而美工进行编辑和调试也会更加容易。通过使用 Make Material Attributes(建立材质属性)和 Break Material Attributes(中断材质属性)节点,所有的不同材质层可以直接连接,而你不必关心如何连接各个属性。
以下网络的作用与上图相同,但将铬合金效果和铜效果模块化到它们自己的材质层中:
使用材质层
材质层的另一个好处是,因为它们利用材质函数,所以可重复使用。这使你能够设置材质原型库,或设置用于定义基本的现实表面类型的材质。例如,你可创建代表一般表面(例如铝、钢、皮革、塑料、橡胶,等等)的层。然后,你可使用分层材质在它们之间进行混合。这在你希望创建细致的对象(例如人物)时可能非常有用,这样你就不必创建一大批必须单独应用于表面的材质。

混合类型
材质编辑器的材质函数列表包含各种材质层混合函数的列表。这些函数帮助你执行混合,其中,不同的类型支持特殊类型的混合,例如能够覆盖特定的材质特性。

材质层混合函数 | |
---|---|
MatLayerBlend_AO(材质层混合_AO) | 将环境光遮蔽 (AO) 贴图混合到表面上,以消除反射。 |
MatLayerBlend_BaseColorOverride(材质层混合_底色覆盖) | 允许替换底色。 |
MatLayerBlend_BreakBaseColor(材质层混合_中断底色) | 输出所传入的材质层中的底色。 |
MatLayerBlend_BreakNormal(材质层混合_中断法线) | 输出所传入的材质层中的法线纹理。 |
MatLayerBlend_Decal(材质层混合_贴花) | 使用第二个 UV 通道,将贴花片混合到材质上。 |
MatLayerBlend_Decal_UV3(材质层混合_贴花_UV3) | 使用第三个 UV 通道,将贴花片混合到材质层上。 |
MatLayerBlend_Emissive(材质层混合_自发光) | 将自发光纹理混合到材质层上。 |
MatLayerBlend_GlobalNormal(材质层混合_全局法线) | 将法线纹理混合到材质层上。 |
MatLayerBlend_LightmassReplace(材质层混合_光照系统替换) | 替换光照系统中的底色,从而允许更改间接照明效果。 |
MatLayerBlend_ModulateRoughness(材质层混合_调制粗糙度) | 将材质层的粗糙度乘以传入的纹理。这对于产生“油腻”外观来说非常有用。 |
MatLayerBlend_NormalBlend(材质层混合_法线混合) | 将法线纹理混合到表面上,但通过蒙版纹理进行混合,从而支持控制法线纹理的出现位置。 |
MatLayerBlend_NormalFlatten(材质层混合_法线压平) | 减弱法线贴图的效果。 |
MatLayerBlend_RoughnessOverride(材质层混合_粗糙度覆盖) | 替换材质层的粗糙度纹理。 |
MatLayerBlend_Simple(材质层混合_简单) | 针对 2 个材质层提供简单的线性插值混合解决方案。不混合法线贴图,而是保留基本材质的法线贴图。 |
MatLayerBlend_Stain(材质层混合_斑点) | 将顶层材质作为斑点混合到基本材质上,这意味着仅使用顶层材质中的底色和粗糙度值。 |
MatLayerBlend_Standard(材质层混合_标准) | 混合两个材质层的所有属性。 |
MatLayerBlend_Tint(材质层混合_着色) | 允许通过输入色调颜色以及用于控制色调位置的蒙版,对材质层进行着色。这对于进行部分颜色更改而言非常有用。 |
MatLayerBlend_TintAllChannels(材质层混合_所有通道着色) | 与 Tint(着色)类似,但也影响镜面反射。这是一个非常特例的函数,你通常不需要使用此函数。 |
MatLayerBlend_TopNormal(材质层混合_顶层法线) | 对两个材质的所有属性进行混合,但仅使用顶层材质的法线纹理。 |
分层材质实例化
因为分层材质在本质上是材质函数,所以将其参数化以便实例化需要做一些额外的预先规划。为了更好地使用标量和矢量参数,你可创建函数输入表达式作为材质层的组成部分。然后,可将顶层材质的一个参数连接到此输入。有关更多信息,请参阅 材质函数概述。
流程类似于:

- 材质参数(标量参数及矢量参数,等等)
- 材质层(函数)
- 函数输入表达式
- 某个用于定义材质层的网络
- 函数输出
- 最终的材质
一些实用提示:
- 将材质表达式解析为函数以创建层时,请将所有参数替换为具有适当名称的 FunctionInput(函数输入)节点。
- 当你将新的材质层引入到材质时,请将新的参数节点连接到输入。
- 现在,你可以将最终材质实例化,参数将驱动各个层的相应方面。
- 务必提供函数输入的默认值。这可加快不需要进行更改的用户的工作流程。
警告
虽然分层材质非常适合于处理多材质设置,但使用这些材质时务必小心谨慎。它们可能会对性能产生严重影响,当各个层中使用的材质本身较为复杂时尤其如此。
请记住,所有的层将同时进行渲染,然后进行混合。例如,如果材质中有 4 个层,那么对于对象的每个像素,系统必须进行测试以确定要对四个层中的哪一个进行混合,并拒绝任何不使用的层。增加的这种计算会导致分层材质更加影响性能。
每当你希望对象具有多种表面类型时,你的第一反应可能是使用分层材质。例如,对于汽车模型,你可能想将一个材质层用于油漆,并对钢材、橡胶和玻璃等等各使用一个材质层。但是,其中的许多材质可以在几何级别分隔开。这将在对象上创建更多材质元素,这会增加绘图调用,但通常效率更高。简而言之,如果你 可以 应用多个材质来代替使用分层材质,请这样做。如果你 必须 对材质的放置位置进行逐个像素的控制,请使用分层材质。
虽然将多个单独材质压缩为一个材质可减少绘图调用,但是产生的分层材质通常要耗用大量系统资源,导致无法用于移动设备。