分层材质

LayeredMaterials.png

可以将分层材质想像成“材质内的材质”。它们提供了一种方法来创建单个具有一系列子材质(即 )的材质,这些子材质可以使用按像素的操作(例如蒙版)放在对象表面上。它们适合于处理独特表面类型之间的复杂混合。在上面的火箭图中,最右边的火箭使用了单独的材质层,包括铬合金、铝和铜,并且按像素在各材质之间进行混合。此效果可通过分层材质轻松实现。

作为一项功能,分层材质是作为材质函数的扩展而存在。您可能还记得,函数是独立的节点网络,用于执行特定的运算,例如复杂的数学方程式。这些函数可在任意数目的材质中随意重复使用。在 Make Material Attributes(建立材质属性)Break Material Attributes(中断材质属性)节点的帮助下,函数也可用来定义材质(完全在函数 之内 进行定义)。然后,通过将这些函数引入到最终的材质中,便可建立分层材质。

ChromeLayer.png

在上图中,我们已通过 Make Material Attributes(建立材质属性)节点建立简单的铬合金材质(完全在材质函数内建立)。现在,此函数可用作 材质层,并可以与其他材质层混合。

因为材质函数无法直接应用于表面,您需要将材质层函数引入到可以应用于对象的新材质中,认识到这一点十分重要。这样做的好处是,您可引入任意数目的材质层,以您认为合适的方式对其进行混合。

因此,在较高级别,工作流程如下所示:

  • 建立新材质,并将其调整为达至完美。

  • 在内容浏览器中,建立新材质函数,并将所有材质函数节点复制/粘贴到其中。

  • 将网络连接到新的 Make Material Attributes(建立材质属性)节点,并将其连接到“函数”(Function)输出。

  • 保存该函数。

  • 将该函数从内容浏览器拖放到材质编辑器中。现在,它变为材质层。

  • 使用材质层混合函数将多个材质层混合到一起。

现在,最终的对象在其表面上可以有多个明显混合的材质层。

重要的益处

使用分层材质的好处之一是,它们使您能够创建不如此则非常复杂的材质,并就将来可编辑而言使其更容易管理。例如,可以 使用普通的不分层材质来创建分层材质效果,但这需要使用复杂的网络在 每个材质输入 的不同纹理和值之间进行混合。因为大部分材质使用多个输入,此类材质的复杂性会大大提高。

RocketLayers.png

请注意以下网络的复杂性,此网络未使用材质层,并将铬合金效果与铜效果混合到一起,例如产生上图所示的效果:

没有材质

但是,使用分层材质时,每种不同的材质类型都包含在自己的节点中,这使混合更加简单,而美工进行编辑和调试也会更加容易。通过使用 Make Material Attributes(建立材质属性)和 Break Material Attributes(中断材质属性)节点,所有的不同材质层可以直接连接,而您不必关心如何连接各个属性。

以下网络的作用与上图相同,但将铬合金效果和铜效果模块化到它们自己的材质层中:

使用材质

材质层的另一个好处是,因为它们利用材质函数,所以可重复使用。这使您能够设置材质原型库,或设置用于定义基本的现实表面类型的材质。例如,您可创建代表一般表面(例如铝、钢、皮革、塑料、橡胶,等等)的层。然后,您可使用分层材质在它们之间进行混合。这在您希望创建细致的对象(例如人物)时可能非常有用,这样您就不必创建一大批必须单独应用于表面的材质。

CarrierBreakdown.png

混合类型

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

MatLayerBlendFunctions.png

材质层混合函数
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(材质层混合_顶层法线) 对两个材质的所有属性进行混合,但仅使用顶层材质的法线纹理。

分层材质实例化

因为分层材质在本质上是材质函数,所以将其参数化以便实例化需要做一些额外的预先规划。为了更好地使用标量和矢量参数,您可创建函数输入表达式作为材质层的组成部分。然后,可将顶层材质的一个参数连接到此输入。有关更多信息,请参阅 材质函数概述

流程类似于:

LayeredMatParamDiagram.png

  1. 材质参数(标量参数及矢量参数,等等)

  2. 材质层(函数)

  3. 函数输入表达式

  4. 某个用于定义材质层的网络

  5. 函数输出

  6. 最终的材质

一些有用的提示:

  • 将材质表达式解析为函数以创建层时,请将所有参数替换为具有适当名称的 FunctionInput(函数输入)节点。

  • 当您将新的材质层引入到材质时,请将新的参数节点连接到输入。

  • 现在,您可以将最终材质实例化,参数将驱动各个层的相应方面。

  • 务必提供函数输入的默认值。这可加快不需要进行更改的用户的工作流程。

警告

虽然分层材质非常适合于处理多材质设置,但使用这些材质时务必小心谨慎。它们可能会对性能产生严重影响,当各个层中使用的材质本身较为复杂时尤其如此。

请记住,所有的层将同时进行渲染,然后进行混合。例如,如果材质中有 4 个层,那么对于对象的每个像素,系统必须进行测试以确定要对四个层中的哪一个进行混合,并拒绝任何不使用的层。增加的这种计算会导致分层材质更加影响性能。

每当您希望对象具有多种表面类型时,您的第一反应可能是使用分层材质。例如,对于汽车模型,您可能想将一个材质层用于油漆,并对钢材、橡胶和玻璃等等各使用一个材质层。但是,其中的许多材质可以在几何级别分隔开。这将在对象上创建更多材质元素,这会增加绘图调用,但通常效率更高。简而言之,如果您 可以 应用多个材质来代替使用分层材质,请这样做。如果您 必须 对材质的放置位置进行逐个像素的控制,请使用分层材质。

虽然将多个单独材质压缩为一个材质可减少绘图调用,但是产生的分层材质通常要耗用大量系统资源,导致无法用于移动设备。