分层材质

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

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. 材质参数(标量参数及矢量参数,等等) 1. 材质层(函数) 1. 函数输入表达式 1. 某个用于定义材质层的网络 1. 函数输出 1. 最终的材质

一些有用的提示:

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

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

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

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

警告

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

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

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

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

Tags
Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback