材质函数概述

有关材质函数工作方式及其某些重要用法概念的概述。

Windows
MacOS
Linux

材质函数 是材质图的一些小片段,它们可以保存在包中,并在多个材质之间重复使用。它们的用途是使您能够即时访问常用的材质节点网络,从而简化创建材质的过程。例如,如果您发现自己经常要创建一个网络以处理混沌纹理平移,那么将该部分网络保存为材质函数并在需要这种行为时使用该函数可以大大提高处理速度。

您可在材质编辑器中像是编辑普通材质一样编辑函数,但在可以使用哪些节点方面存在一些限制。正确使用函数可降低材质冗余度,进而减轻保持重复表达式同步所需的美工维护工作,以及修改期间遗漏某个副本而引起的不可避免的错误。

材质函数也是可以显示在 内容浏览器 中的资产。材质函数图与材质图的不同之处在于,材质函数没有主材质节点,而是具有输出节点,这些节点代表最终函数的输出连接。

将材质函数想像成电子设备万用盒可能有帮助。您可以视需要添加任意数目的输入和输出。函数的核心是其在这些输入与输出之间执行的操作。此示例接收两个层并将它们混合到一起,这类似于 Photoshop 的滤色混合 。此函数从想要使用它的美工获取详细信息,因此不必实际了解滤色混合的数学运算即可使用滤色混合操作。如果任何人稍后想要更改滤色混合的工作方式,他们可以对此函数进行更改,并且该更改会自动传播到所有使用此函数的材质。

ScreenBlendFunction.png

如上图所示,在输入与输出之间发生的情况完全由您控制,并由标准材质表达式节点的任何网络所定义。但是,一旦将材质函数部署到材质中,您就会只看到带有输入及输出的函数节点。

ScreenBlendInMaterial.png

材质函数库

创建材质函数完成后,应该将其发布到材质函数库,以方便创建材质期间进行访问。材质函数库是材质编辑器中的一个窗口,其中包含经过分类且可过滤的可用材质函数列表。这个列表包含所有已装入的函数,不过也包含所有虽然未装入但已通过内容浏览器所使用的 内容浏览器数据库 找到的函数。

FunctionLibrary.png

您可将鼠标悬停在这些条目上以便查看其工具提示形式的说明,或者将条目拖放到材质中。

为了让材质函数显示在材质函数库中,必须选中其 发布到库(Expose To Library)属性。在函数中,取消选中所有节点可显示该函数自身的基本属性,您可在其中找到此属性。

要获取默认情况下材质函数库中包含的现有函数的完整列表,请参阅 材质函数参考

与函数相关的节点

下列是与材质函数相关的材质表达式节点及其用途:

  • MaterialFunctionCall(材质函数调用)- 允许使用来自另一个材质或函数的外部函数。这个外部函数的输入及输出节点将变成函数调用节点的输入和输出。

  • FunctionInput(函数输入)- 只能放在材质函数中,用于在该函数中定义该函数的某个输入。

  • FunctionOutput(函数输出)- 只能放在材质函数中,用于在该函数中定义该函数的某个输出。

  • TextureObject(纹理对象)- 用来为函数内的纹理函数输入提供默认纹理。此节点不会对该纹理进行实际取样,因此必须与 TextureSample(纹理样本)节点配合使用。

  • TextureObjectParameter(纹理对象参数)- 定义一个纹理参数并输出纹理对象,以便在调用具有纹理输入的函数的材质中使用。此节点不会对该纹理进行实际取样,因此必须与 TextureSample(纹理样本)节点配合使用。

  • StaticSwitch(静态开关)- 根据输入值在两个输入之间执行编译时选择。

  • StaticBool(静态布尔值)- 用来为函数内的静态布尔函数输入提供默认布尔值。此节点不会在任何内容之间切换,因此必须与 StaticSwitch(静态开关)节点配合使用。

  • StaticBoolParameter(静态布尔参数)- 定义一个静态布尔参数并输出静态布尔值,以便在调用具有静态布尔输入的函数的材质中使用。此节点不会在任何内容之间切换,因此必须与 StaticSwitch(静态开关)节点配合使用。

输入及输出

因为材质函数是封装的节点网络,因此用户负责确保数据可流入和流出材质函数。这是通过 FunctionInput(函数输入)FunctionOutput(函数输出)节点进行处理的。了解这些节点对于使用材质函数十分关键。

在函数自身中,FunctionInput(函数输入)和 FunctionOutput(函数输出)节点看起来如下所示:

InputOutput_Within.png

但是,从外部来看,在材质中使用函数时,这些节点用作输入及输出的引脚:

InputOutput_Without.png

FunctionInput(函数输入)节点

如上所述,材质输入节点用作匝道,数据通过其进入材质函数。给定的函数可具有任意数目的输入节点,其中每一个都与显示在函数自身上的输入引脚相对应。

InputNode.png

它们具有下列属性及数据引脚:

项目

说明

属性

输入名称(Input Name)

提供从函数外部可见的输入名称。

说明(Description)

提供输入说明,当用户将鼠标悬停在函数的输入引脚上时,系统会显示此说明。

输入类型(Input Type)

向输入指示所需的数据类型。请参阅下文中的 输入类型

预览值(Preview Value)

用作一种测试方法,并作为一种在构造过程中帮助显示函数用途的方法。任何在此处输入的值都会被使用,就像通过输入从函数外部传递此值一样。

使用预览值作为默认值(Use Preview Value as Default)

此复选框无非允许您将预览值中设置的任何数据用作默认值。当您不想强制用户为函数提供此值的输入时,此复选框非常有用。

排序优先顺序(Sort Priority)

此数值用于控制输入引脚在函数节点上列出时采用的顺序。顺序为最低到最高。

输入引脚

预览(Preview)

此输入接收一个值,该值将取代"预览值"(Preview Value)属性。与相关联的属性相同,此输入对于在构造期间测试函数以及设置默认值而言非常有用。

输出引脚

(无标签)

提供函数所要处理的传入数据的输出。

FunctionOutput(函数输出)节点

FunctionOutput(函数输出)节点提供让处理后的数据从最终函数中退出以便在材质中进一步使用的方法。与 FunctionInput(函数输入)节点相同,一个函数可具有任意数目的这些节点,它们可连接到任意数目的潜在输出。

OutputNode.png

FunctionOutput(函数输出)节点具有下列属性:

项目

说明

属性

输出名称(Output Name)

提供从函数外部可见的输出名称。

说明(Description)

提供输入说明,当用户将鼠标悬停在函数的输出引脚上时,系统会显示此说明。

排序优先顺序(Sort Priority)

此数值用于控制输入引脚在函数节点上列出时采用的顺序。顺序为最低到最高。

输入引脚

(无标签)

提供函数已处理的数据的输入。此数据将从函数中发出,以便在材质中使用。

输入类型

输入具有与其相连接的任何表达式所需的指定类型。您可通过 FunctionInput(函数输入)节点上的 输入类型(Input Type)属性来设置此类型。从函数外部来看,在材质中使用此函数时,此类型会以几个字母显示在输入接头旁边。在本例中,输入都是"矢量 3"(Vector3),因此显示 V3。在材质中使用时,任何连接到输入的内容都 必须 可转换为输入类型,否则将发生错误。

InputType.png

以下是可用输入类型及其相关联的缩写:

输入类型

缩写

标量

S

矢量 2(Vector2)

V2

矢量 3(Vector3)

V3

矢量 4(Vector4)

V4

2D 纹理(Texture2D)

T2D

立方体纹理(TextureCube)

TCube

静态布尔值(StaticBool)

B

公共属性

设计函数时,取消选中所有节点将显示函数自身的基本属性。

项目

说明

属性

说明(Description)

当用户将鼠标悬停在函数列表中的函数上,或者在材质编辑器内将鼠标悬停在函数节点的主体上时,此说明将以工具提示形式显示。

发布到库(Expose to Library)

如果选中这个框,那么材质函数将显示在材质编辑器内的材质函数列表中,并可在材质中使用。您可能需要重新启动编辑器才能显示新函数。

库类别(Library Categories)

此数组存放"材质函数"(Material Functions)选项卡的类别,此函数将在所有这些类别下显示。

预览

编辑材质函数时,预览窗口将显示正在预览的节点。您可以 右键单击 任何节点并选择 开始预览节点(Start Previewing Node),以预览截至该点为止的网络的结果。

StartPreviewing.png

在大部分情况下,您想要预览函数输出,因此默认情况下将会预览这些输出。

PreviewingOutput.png

函数输入节点具有一些用于指定预览值的选项,因为它们不知道材质中将要使用的实际值。每个输入都具有内置的 预览值,此值可用来为浮点输入类型显示常量。函数输入也具有"预览"接头,该接头允许您使用任何与输入类型匹配的值来覆盖内置值。在以下示例中,使用了纹理样本来提供"浮点 3"输入的预览。

PreviewTexture.png

在以下示例中,使用了静态布尔值节点来提供静态布尔输入的默认值。

PreviewStaticBool.png

请注意,此数据具有名为"使用预览值作为默认值"(Use Preview Value As Default)的选项。如果启用此选项,那么每当在材质中使用此函数并且未将任何内容连接到该输入时都会使用预览值,而不会引起编译错误。这会使该输入成为可选输入,因此它显示为灰色。

参数

函数现可包含参数节点类型。这些参数可直接传递到任何材质以供使用。

要将纹理参数与函数配合使用,请建立纹理输入并将其连接到"纹理样本"(Texture Sample)节点中的纹理覆盖对象:

TextureParameterFunction.png

然后,在使用该函数的材质中,放置一个 TextureObjectParameter(纹理对象参数)节点并将其连接到纹理输入:

TextureParameterMaterial.png

同样,对于静态开关参数,请建立 静态布尔值(Static Bool)输入并将其连接到 StaticSwitch(静态开关)节点:

StaticSwitchFunction.png

然后,在使用该函数的材质中,放置一个 StaticBoolParameter(静态布尔参数)节点并将其连接到静态布尔输入:

StaticSwitchMaterial.png

组织

函数由几个人创建但由许多人使用,因此,维护良好的文档以记录函数用途以及函数输入和输出所需的值十分重要。正因为如此,函数在函数名称及输入/输出名称顶部提供了多个文档字段:

  • 函数说明(Function description) - 单击空白区域可查看函数属性,其中包含说明。如果您打算只填写一个说明字段,请填写此字段!在任何显示此函数的位置(内容浏览器、材质函数库以及函数调用节点),此说明都会以工具提示形式显示。

  • 输入/输出说明(Input / output descriptions) - 这些说明位于函数中的输入及输出节点上。当您将鼠标悬停在函数调用节点的输入和输出上时,这些说明将以工具提示形式显示。

填写的函数说明:

FunctionProperties2.png

在材质中使用时显示的相应工具提示:

FunctionTooltip.png

传播

您编辑函数并单击"应用更改"(Apply Changes)时,新版本将传播到所有引用了此函数的已装入材质或函数。任何引用了此函数的未装入材质都将在下次装入时根据更改进行更新。

如果从函数中删除某个输入或输出并传播更改,那么使用了该函数的材质中所有指向这些已删除接头的链接都将中断!因为传播不可撤销,所以了解这一点非常重要。越多材质使用该函数,发生此类中断的可能性就越大,因此务必谨慎。

传播函数更改时,系统会将所有使用了该函数的已装入材质都标记为"脏",您可凭此确定可重新保存哪些包以避免装入时间增加。您可通过在 内容浏览器单击右键 并选择以下选项来找到所有使用了某个函数的已装入材质:

FindUsingMaterials.png

嵌套函数

函数可任意嵌套(一个函数位于另一个函数内)并链接在一起,但不得产生循环依赖关系。

编译错误

函数内的编译错误将在使用该函数的材质内以红色突出显示 MaterialFunctionCall(材质函数调用)节点。错误消息也会指出错误在哪个函数内发生。在以下示例中,错误原因是尚未连接函数的输入。

CompileErrors0.png

通过为输入提供预览值,然后激活每个输入的 使用预览值作为默认值(Use Preview Value as Default)属性,可以同时避免上面这组错误。但是,这种做法也有副作用,因为这样就没有高度明显的警报(例如错误消息)来提醒您尚未连接某个输入。

此函数的输入现已连接完成,但错误消息指出使用了此函数的 OneMinus(一减)节点有错误。

CompileErrors1.png

双击 此函数以针对其打开编辑器,其中,OneMinus(一减)节点将因为出错而以红色突出显示:

CompileErrors2.png

默认材质函数

许多材质函数已创建完毕并随虚幻引擎 4 一起提供。这些材质函数已可通过 材质编辑器控制板 使用。

您可通过 内容浏览器引擎(Engine)> 函数(Functions)文件夹来访问默认材质函数以进行编辑。

如果对默认材质函数进行任何更改并加以保存,那么这些更改将存在于这些函数的所有实例中。因此,一般而言,如果您需要更改现有的函数,建议您建立自己的副本。

有关这些默认函数的更多信息,请参阅 材质函数参考

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