分层材质

有关 UE4 中分层材质技术的介绍文档。

Choose your operating system:

Windows

macOS

Linux

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 个层,那么对于对象的每个像素,系统必须进行测试以确定要对四个层中的哪一个进行混合,并拒绝任何不使用的层。增加的这种计算会导致分层材质更加影响性能。

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

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

欢迎帮助改进虚幻引擎文档!请告诉我们该如何更好地为您服务。
填写问卷调查
取消