材质函数
一、材质函数概述
材质函数(Material Functions) 使你能够将部分材质图表打包成可复用的资产并分享到库中,还能轻松插入其他材质。它们的作用是帮助你立即获取常用的材质节点网络,从而简化材质的制作过程。
举个例子,下文展示的 混合_覆盖 函数包含了图片右侧所示的整个材质表达式网络。 你不再需要反复构建整个节点网络,而是可以将它从材质函数库中直接插入图表。

==函数可以在材质编辑器中编辑==,类似于==普通材质==,但可以使用的节点会==有部分限制==。
如果使用得当,它们可以降低材质重复度,从而减轻美术师的维护工作。材质函数可以使重复的表达式保持同步,以免在修改过程中遗漏某一重复部分而引发不可避免的错误。
在 内容浏览器 中,材质函数是一个单独的资产类。它们的图表和材质相似,但有一个==重要区别==。材质函数并==没有主材质节点==,而是使用==函数输出节点==。在材质中使用时,它会作为最后一个材质函数节点的输出引脚。
你可以将材质函数当做电子项目的收尾。 你可以根据需要,添加更多输入和输出。函数的核心是输入和输出之间的材质表达式网络。 这个示例就使用了两个图层,并将它们混合在一起,就像Photoshop筛滤混合一样。 该函数会为美术师提取细节,使其不必掌握筛滤混合的原理,就能使用进行筛滤混合的操作。

材质函数输入(1)和输出(2)节点。
如前文所示,输入和输出节点之间的情况完全由你控制,并会由标准材质表达式节点网络决定。将材质函数插入材质之后,你只会看到材质函数调用节点及其输入和输出。 图表的其余部分会隐藏在函数之内。

二、函数相关节点
以下是与材质函数相关的材质表达式节点,以及各自的用途:
- 材质函数调用——允许使用来自其他材质或函数的外部函数。 外部函数的输入和输出节点会成为函数调用节点的输入和输出。
- 函数输入——只能放置在材质函数中,用于定义该函数的一个输入引脚。
- 函数输出——只能放置在材质函数中,用于定义该函数的一个输出引脚。
- 纹理对象——用来为函数内的纹理函数输入提供默认纹理。 此节点不会对该纹理进行实际取样,因此必须与节点配合使用。
- 纹理对象参数——定义一个纹理参数并输出纹理对象,以便在调用具有纹理输入的函数的材质中使用。 此节点不会对该纹理进行实际取样,因此必须与节点配合使用。
- 静态开关——根据输入值在两个输入之间执行编译时选择。
- 静态布尔值——用来为函数内的静态布尔函数输入提供默认布尔值。 此节点不会在任何内容之间切换,因此必须与静态开关节点配合使用。
- 静态布尔参数——定义一个静态布尔参数并输出静态布尔值,以便在调用具有静态布尔输入的函数的材质中使用。 此节点不会在任何内容之间切换,因此必须与静态开关节点配合使用。
1.输入与输出
由于材质函数是封装的节点网络,用户需要确保数据的输入和输出。这是通过 函数输入 和 函数输出 节点进行控制的。了解这些节点便是使用材质函数的关键。
在材质函数中,函数输入和函数输出节点显示如下:

在材质中使用材质函数时,函数输入和函数输出节点会在材质函数节点上显示为输入和输出引脚:

2.函数输入节点
如此前所说,函数输入 节点是数据进入材质函数的门户。任意函数都可以有任意数量的输入节点,每个输入节点都对应着材质函数调用节点的一个输入引脚。

| 项目 | 说明 |
|---|---|
| 属性 | |
| 输入名称(Input Name) | 输入的名称。在材质中使用时,会显示为材质函数的一个输出引脚。 |
| 说明(Description) | 输入的说明,当你将鼠标悬停在材质函数节点的输入引脚上时会显示此说明。 |
| 输入类型(Input Type) | 定义了输入可接受的数据类型。请参阅下文中的输入类型。 |
| 预览值(Preview Value) | 用作一种测试方法,并作为一种在构造过程中帮助显示函数用途的方法。任何在此处输入的值都会被使用,就像通过输入从函数外部传递此值一样。 |
| 使用预览值作为默认值(Use Preview Value as Default) | 此复选框允许将预览值中设置的数据用作默认值。当你不想强制用户为函数提供此值的输入时,此复选框非常有用。 |
| 排序优先顺序(Sort Priority) | 此数值用于控制输入引脚在函数节点上列出时采用的顺序。顺序为最低到最高。 |
| 输入引脚 | |
| 预览(Preview) | 传入该输入的数据会取代预览值属性。与相关属性相同,此输入适合在构造期间测试函数,以及设置默认值。 |
| 输出引脚 | |
| (无标签)(Unlabled) | 提供函数所要处理的传入数据的输出。 |
3.函数输出节点
函数输出节点提供了让材质函数中的数据退出函数,以便在材质中进一步使用的方法。 换言之,它会输出材质函数的最终结果。和函数输入节点相同,一个函数可具有任意数量的输出节点,因此可以有任意数量的潜在输出引脚。

选中 函数输出 节点时可在细节面板中查看以下属性。
| 项目 | 说明 |
|---|---|
| 材质表达式函数输出 | |
| 输出名称(Output Name) | 输出的名称。在材质中使用时,会显示为材质函数的一个输出引脚。 |
| 说明(Description) | 输出的说明,当你将鼠标悬停在材质函数节点的输出引脚上时会显示此说明。 |
| 材质表达式 | |
| 排序优先顺序(Sort Priority) | 此数值用于控制输出引脚在函数节点上列出时采用的顺序。顺序为最低到最高。 |
| 说明(Description) | 该说明栏定义了节点注释框中的文本。仅在材质函数编辑器 中 可见。 |
| 输出引脚 | |
| (无标签)(Unlabled) | 提供函数所要处理的传入数据的输出。 |
4.输入类型
输入具有与其相连接的任何表达式所需的指定类型。在材质函数编辑器中选择 函数输入 节点,并使用 输入类型 下拉菜单中的选项,便可设置输入类型。

在材质中调用时,输入类型会以缩写形式显示在输入接口旁。 在该示例中,两个输入都是”向量3”,故显示”V3”。 在材质中使用时,任何与输入连接的内容都 必须 可以转换为正确的输入类型,否则就会产生错误。

以下是可用的输入类型及其对应的缩写:
| 输入类型 | 缩写 |
|---|---|
| 标量 | S |
| 向量2(Vector2) | V2 |
| 向量3(Vector3) | V3 |
| 向量4(Vector4) | V4 |
| 2D纹理(Texture2D) | T2D |
| 立方体纹理(TextureCube) | TCube |
| 2D纹理数组(Texture2DArray) | T2dArr |
| 体积纹理(VolumeTexture) | TVol |
| 静态布尔值(StaticBool) | B |
| 材质属性(MaterialAttributes) | MA |
| 外部纹理(TextureExternal) | TExt |
5.预览
编辑材质函数时,预览视口会显示正在预览的节点。你可以 右键点击 任意节点并选择 开始预览节点,预览材质网络至该点为止的结果。

6.参数
你可以像通常材质一样,在材质函数中使用参数。 这些参数会直接传递到使用的材质中。 纹理参数的使用过程稍有区别。
7.纹理参数
要在材质函数中使用纹理参数,创建一个 函数输入* 节点,并将数据类型更改为 2D纹理**。 将它连接到** 纹理取样** 节点的纹理对象覆盖引脚中。

在材质中使用该材质函数时,放置一个 纹理对象参数 节点,并将其连接到材质函数的 2D纹理 输入引脚中。
8.静态布尔参数
和静态开关参数类似,创建一个函数输入,将输入类型更改为 静态布尔值。 将其与 静态开关 节点连接:

在使用该函数的材质中,放置一个 静态布尔参数 节点,并将其与接受静态布尔值的输入连接(本示例中为 启用平铺(Enable Tiling))。

9.默认材质函数
虚幻引擎包含了几十个预制的默认材质函数。你可以通过材质编辑器控制板,或右键点击搜索菜单获取这些函数。
如果你想编辑某一默认材质函数,可以在 Engine->Content->Functions 文件夹的 Content Browser 中找到相关资产。
如果更改默认材质函数并进行保存,这些改动就会存在于所有该函数的实例中。因此,如果你希望更改函数,强烈推荐你复制默认函数的副本。