材质基本概念

关于虚幻引擎中材质的介绍文档。

Choose your operating system:

Windows

macOS

Linux

虚幻引擎中的 材质(Materials) 定义了场景中对象的表面属性。从广义上来讲,你可以将材质视为涂在网格体上用来控制其视觉外观的"涂料"。

更具体地说,材质能准确地告诉引擎某个表面应该如何与场景中的光源交互。材质定义了表面的各种特性,包括颜色、反射率、粗糙度、透明度等。

着色管线概述

在渲染管线中,着色器是定义每个顶点或像素应该如何渲染的程序。虚幻引擎中的着色器用高级着色语言(HLSL)编写。然后,将着色器代码转换为GPU硬件可以执行的一系列汇编语言指令。最终像素颜色就这样输出到了你的显示器。

在虚幻编辑器中,你无需编写HLSL代码即可为你的项目创建着色器。你在名为 材质编辑器(Material Editor) 的可视化脚本界面中创建名为 材质(Materials) 的资产。

材质

在着色器图表中组合名为 材质表达式(Material Expressions) 的节点,并将结果传递到主材质节点上的输入,即可构建材质。

简单的胡桃木地板材质

这些节点图表在幕后被默默地转换为HLSL。作为用户,你可以查看HLSL代码,但你无法直接编辑它。这使得虚幻引擎中的材质创建直观且易于使用。

材质图表和HLSL代码

点击 窗口(Window) > 着色器代码(Shader Code) > HLSL代码(HLSL Code) ,可以查看材质的HLSL代码。请注意,HLSL代码是只读选项卡,你无法直接在虚幻编辑器中编辑HLSL着色器代码。

材质工作流程概述

本小节提供了虚幻引擎中材质创建过程的简要概述。

这并非全面的分步指南,而是广泛的概念概述。有关材质编辑器的详细用法,请查看材质编辑器用户指南中的页面。

创建新材质

虚幻引擎中的材质是一种资产,如静态网格体、纹理或蓝图。你可以通过内容浏览器创建新材质:

  1. 内容浏览器(Content Browser) 中右击。

  2. 在上下文菜单的 创建基本资产(Create Basic Asset) 分段中选择 材质(Material)

    创建材质

  3. 材质已在内容浏览器中创建。赋予它唯一的描述性名称。

    材质缩略图

双击 材质资产开始编辑材质。材质编辑器(Material Editor) 窗口打开,如下所示。

点击查看大图。

突出显示的区域称为 材质图表(Material Graph),这是你在创建材质时完成大部分工作的区域。 除了 主材质节点(Main Material Node),新材质中的材质图表为空。主材质节点包含所有控制着材质外观的输入参数。

有关材质编辑器UI的详细分解,请查看此处

材质属性

选择 主材质节点(Main Material Node) 后,细节面板(Details panel) 中会显示材质的全局属性和设置。你还可以点击材质图表中的空白处,显示材质属性。

其中有三项设置在材质创建过程之初尤为重要,因为它们构成了材质的基础并决定了它的使用方式。

细节属性

  • 材质域(Material Domain) – 定义材质在你的项目中的用途。例如,表面、用户界面和后期处理材质是不同的材质域。

  • 混合模式(Blend Mode) – 定义材质如何与其后面的像素混合。例如,不透明(Opaque) 着色器将完全遮挡后面的对象,而 半透明(Translucent)附加(Additive) 着色器将以某种方式与背景混合。

  • 着色模型(Shading Model) – 定义材质如何与光源交互。通常,你的材质将简单地使用默认光照着色模型。但是,虚幻引擎包含针对 毛发(Hair)布料(Cloth)皮肤(Skin) 等事物的特定着色模型,这些模型提供上下文专属输入,以便更轻松地创建这些类型的表面。

这些属性准确地确定在主材质节点上启用哪些输入。在上图中,不透明度(Opacity) 显示为灰色,因为不透明混合模式不支持透明度。

如果你选择 半透明混合模式(Translucent Blend Mode),那么 不透明度(Opacity) 输入可用,并且之前启用的几个输入将变灰。

半透明混合模式

创建新材质时,建议你先配置这三个属性。

有关细节面板中其余属性的信息,请查看材质属性文档。

材质表达式节点

如果材质属性是基础,材质表达式 则是材质的构建块。

材质表达式节点

每个材质表达式在材质图表中将执行特定的操作。从技术上讲,材质表达式只是HLSL代码片段的视觉效果呈现。当你组合材质表达式时,你要做的是编写HLSL着色器,而无需查看代码本身。

将电缆连接从一个节点的 输出引脚 拖到另一个节点的 输入引脚,即可在材质表达式之间传递数据。

连接节点

简单的表面可能仅需几个材质表达式定义材质,如下所示,三个纹理示例占大部分比重。 此图表中的其他节点可让美术师更好地控制粗糙度强度。

简单材质

这可能是完成的材质,或者你可以在材质图表中使用数学和逻辑继续优化表面。 了解如何组合材质表达式,以便在材质中实现特定结果,是在虚幻中创建材质的基础。

欲了解如何在图表中放置材料表达式,请查看此处

虚幻引擎包括几十个材质表达式节点。其中的大多数都有鼠标悬停提示文本,但你可以查看材质表达式参考页面,了解每个节点的用途。

主材质节点

数据在材质图表中从左到右流动,主材质节点(Main Material Node) 是每个材质网络的终点。

主材质节点包含最终输入引脚,这些引脚将确定使用材质编译哪些信息。除非图表中的材质表达式是连接到主材质节点的链的一部分,否则不会影响材质。

在上面的视频中,请注意材质预览仅在纹理示例连接到主材质节点上的相应输入后才会更新。

主材质节点上的每个输入都将定义整个材质的特定属性。这两个页面将帮助你了解每个输入的用途:

  1. 基于物理的材质,介绍虚幻基于物理的材质工作流程的原则和最佳实践。

  2. 材质输入,介绍主材质节点上每个输入的用途。

编译和应用

在编译材质之前,无法在关卡中看到材质的更改。要编译材质,请点击材质编辑器(Material Editor)顶部工具栏中的应用(Apply)或保存(Save)按钮。

编译和应用

编译后,你可以将材质直接从内容浏览器(Content Browser)拖到关卡中的Actor上。

将材质拖到Actor上

编译可能需要几秒钟,对于复杂的材质,最多可能需要几分钟。这可能会在开发和测试材质时妨碍你的工作进度,但有几种方法可以最大限度地减少编译延迟。

材质实例化(Material Instancing) 是一种缩短迭代时间并避免工作时编译长时间延迟的策略。在下面了解更多关于实例化的信息。

材质编辑器用户指南

上述过程涵盖了虚幻引擎中的基本材质工作流程。上面讨论的每个步骤都在《材质编辑器用户指南》中进行了更全面的介绍。

建议你查看这些页面,了解材质创建的入门知识:

  1. 材质编辑器用户界面

  2. 放置材质表达式和函数

  3. 使用主材质节点

  4. 预览和应用材质

  5. 整理材质图表

工作流程效率概念

你创建的材质很少是一次性资产。为项目中的每个Actor创作全新的着色器效率低下,特别是因为类似的资产往往需要非常相似的材质。

材质实例(Material Instances)材质函数(Material Functions) 可以使你更轻松地自定义和复用材质,以便你可以更快地迭代并避免重复执行相同的工作。

材质实例和参数化

材质实例让你可以从单个父材质快速创建多个变体或实例。

当一组相关资产需要相同的基本材质,但具有不同的表面特征时,将使用实例。如具有多种颜色变体的家具。

椅子材质实例

材质实例化让你可以为家具集创建单一的父材质。然后,你将为每种颜色创建材质实例,如上图椅子所示。

使用实例有几个优点:

  • 你可以自定义材质实例,无需重新编译父材质。这意味着你对实例所做的更改在所有视口中立即可见。

  • 你可以在材质实例编辑器中向美术师展示 参数。这意味着他们可以快速直观地创建材质变体,无需编辑更复杂的节点图表。

在此处查看材料实例,了解轨道。

材质函数

材质函数 让你可以将材质图表的一部分打包成可重复使用的资产,你可以将其共享到公共库,并轻松插入到其他材质。

它们的目的是即时访问常用的材质节点网络,从而简化材质创建。

例如,下面显示的 Blend_Overlay 函数包含图像右侧显示的整个材质表达式网络。 你可以将它从函数库中直接插入到你的图表中,而不用一遍又一遍地构建此节点网络。

材质函数示例

虚幻编辑器包括几十个预制的材质函数。你可以编辑任何材质函数来改变其行为,或直接在编辑器中创建自己的函数。

在此处查看有关创建和使用材质函数的更多信息。

使用颜色和数据

虚幻引擎使用的是 RGBA 色彩模型,意味着每个像素都由四个数值定义,分别对应 红(Red)、绿(Green)、蓝(Blue)、和Alpha 通道。

举个例子,RGBA数值 (0.0, 0.0, 1.0, 1.0) 表示一个纯蓝色并且完全不透明的像素。在材质编辑器中,这样的一组数值称为 浮点4(float4),因为它储存的是四个 浮点 数值。

所有穿过材质图表的信息都由浮点数值表示,但并不是都和上述例子一样四个数值为一组。材质编辑器中有四种数据类型:

数据类型

定义

示例

浮点(Float)

储存一个浮点数值

(1.0)

浮点2(Float2)

储存两个浮点数值

(1.5, 2.0)

浮点3(Float3)

储存三个浮点数值

(0.0, 1.0, 3.5)

浮点4(Float4)

储存四个浮点数值

(0.5, 1.0, 0.2, 0.9)

材质编辑器中的节点和引脚通常都设计为接收特定的数据类型。举个例子,很多针对每个通道运行的材质表达式只有在收到正确的数据类型时才能运作。

正因如此,理解上述四种数据类型才至关重要,还需要明白各种技巧和策略来操作数据并控制信息在你的图表中的流向。在你学习虚幻引擎材质创建的过程中,我们强烈建议参考以下两个页面。