本文中,我们将讨论主材质的创建。我将一步步演示如何为场景对象设置主材质,然后来看看如何如何将场景对象的主材质转换成玻璃对象的主材质。最后,我们会创建并使用材质函数。让我们开始吧!
1.创建一个主材质
1.1 创建一个基本的材质
首先,在UE4内容浏览器中点击右键选择创建一个 Material,命名为 “MAT_”开头的形式。然后双击打开它。

接下来要做的是为材质添加一些颜色,所以我要添加一个矢量参数( VectorParameter )节点。然后对其进行设置,以便在材质实例中使用它。
右键点击面板,搜索 vector ,找到 VectorParameter,可以将它命名为 Base_Color,将它添加到名为 BaseColor 的组中。稍后我会告诉你分组为什么很重要。


接下来将 Base_Color VectorParameter 输出连接到 Base Color,把 Base_Color 的默认值设置为 0.5 、0.5 、 0.5,让它显得有点白。点击 Apply 让它应用。
1.2 使用纹理
我们要做的是在内容浏览器中选中一张纹理,使用 T 键将它添加到材质中,然后把纹理转换成纹理对象,最后设置属性。让我们现在开始吧!
打开虚幻引擎,在内容浏览器中选中一张纹理,回到材质编辑器。按住 T 键,然后点击材质编辑器面板,创建包含选中纹理的纹理取样节点。

但是,如果现在就将这个节点连接到 Base Color 然后编译材质,并且尝试在材质实例中使用它,我将无法调整纹理取样。这是因为我需要右键点击纹理取样节点,并将其转换为参数。

现在你可以把参数命名为 Base_Color_Texture ,然后将组设置为 BaseColor。

1.3 使用静态开关
现在我们要做的是,让我们有能力选择使用纹理或者标准的颜色值。为此,我们要使用静态开关。静态开关允许我们在材质实例中决定是使用纹理还是开销更低的矢量颜色参数。
让我们再次打开虚幻引擎。在材质编辑器中右键点击,搜索 Switch Parameter ,创建 StaticSwitchParameter 节点。

现在首先要做的是在 Detail 面板中,勾选 Default Value 旁的复选框,将其设为真。然后可以将这个开关命名为 bUseBaseColorTexture,将开关组设置为 BaseColor。这样为它命名的原因是,当我们启用它时,当它为真时,我们就要使用底色纹理。你最好在命名中描述要执行的操作,以便人们理解材质实例编辑器中的逻辑。

最后,我们将 Base_Color 连接到真值输入,并将 Base_Color_Texture 连接到假值输入,然后将开关输出连接到 Base Color。它的作用是,默认情况下输出 Base_Color,如果我们禁用开关的默认值,将它设置为假,我们就会看到纹理。这部分的材质创建已经结束了。

1.4 使用常量设置金属值
在这部分中,我们要做的是添加一个常量数值,将它转换成参数,然后将它设置成 Metallic 的输入值供我们之后使用。
首先在UE4中的材质编辑器中,按住键盘上的 1 键,然后点击左键,再右键点击这个节点选择 Convert to Parameter ,将参数命名为 Metallic ,并将它添加到 Metallic 的组中。

将 Metallic 参数连接到 Metallic 输入,就 Metallic 参数而言,其默认值范围在 0 到 1 之间。而且要么是金属,。要么不是金属。我们要做的是把 Slider Min 设为 0 ,但是把 Slider Max 设为 1 。这样做是为了确保美术师不会把金属值意外设置成高于1的值,虽然高于 1 没有任何影响,但最好还是确保不要出现这种情况。

1.5 设置粗糙度
接下来我们要做的是设置粗糙度,但是,我们设置的粗糙度必须允许我们通过线性插值参数上调或降低粗糙度数值,从而控制粗糙度效果。
让我们开始吧,回到虚幻引擎。在内容浏览器中找到需要的贴图,把它拖到材质编辑器图表上。现在,还有一件事需要注意,我们设置粗糙度时,要能使用被压缩到纹理的红、绿或蓝通道中的粗糙度贴图。首先,我们要确保在 Detail 面板中,将纹理取样的采样类型设置为 Masks 。

然后我们要创建遮罩参数并与纹理取样节点的输出相连,这一步的作用是允许我们在材质实例中筛选纹理的红、绿或蓝通道。我们将它命名,并为它新建 Roughness 分组。

接下来右键点击纹理取样节点,选择 Converter to Pramater ,把它转换成参数。命名转换后的参数节点,并把它归类到 Roughness 组中。

然后,按住键盘上的 L 键,点击图表创建一个线性插值节点,将遮罩参数的输出引脚与线性插值节点的阿尔法通道相连。然后按下键盘上的 1 键,在图表上点击两次,创建两个标量参数。同时选中它们,将它们都转换为参数。将其中一个命名为 Roughness_Low ,将它归为 Roughness 分组,将它的 Default Value 设为 0 , Slider Min 为 0.0001, Slider Max 为 1.0 。然后,对于下一个标量参数,将这个命名为 Roughness_High,将 Default Value 设为 0.5 ,将 Slider Min 设置为 0.0001,将 Slider Max 设置为 1。这是为了确保美术师不会在材质实例中误设数值。


接下里我要将 Roughness_Low 连接到线性插值的 A 输入上,将 Roughness_High 连接到线性插值的 B 输入上。然后将线性插值的输出连到材质结点的 Roughness 上。

1.6 添加法线贴图
接下来我们要做的是继续添加法线贴图。首先,我要在内容浏览器中找到法线贴图,然后在材质编辑器中,按住 T 键,点击材质图表,创建包含法线贴图的纹理取样节点。编辑材质时有一个操作很实用,如果右键点击输出,可以选择 Connect To Normal ,将这个节点连接到法线贴图通道。这意味着你不需要花心思将连线拖动到法线贴图的输入引脚上。
这个节点上需要确认的另一件事是,将采样类型( Sampler Type)设置为 Normal 。接下来,将它转换为参数,将这个参数命名为 Normal_Map ,为它新建 Normal 分组。

这就是我们的场景主材质,点击 Apply 并 Save。现在我们就可以使用这个材质实例了。

1.7 修改创建的材质以获得一个完全不同的主材质
我们刚刚创建了我们的主场景材质,在我们基于它创建材质实例前,我想快速向你演示下,如何修改刚刚创建的材质然后获得一个完全不同的主材质并用于剥离甚至水面等表面。
现在,我们要做的是获取我们刚创建的材质。首先,在内容浏览器中右键点击我们的材质,复制它,将它命名。

打开复制的材质后,我们知道玻璃是透明的或者有一定的透明度。你可以让10%的光束穿过它或者让更多光束穿过它。我们必须将材质设置成能够透过它看到外面或者里面的内容。为此,我们可以用 Opacity 或 Opacity Mask。注意,这些参数目前不可用,要使用它们,请进入 Detail 面板,找到 Material 分段下的 Blend Mode,将混合模式改为 Masked 或 Translucent 。
我们选择 Translucent ,基本上两者之间的区别在于,Masked 用于告诉渲染器像素是透明的还是不透明的,相当于非此即彼;Translucent 表示你可以在一定程度上看到它的后面。所以 0.1 的半透明度表示材质几乎是透明的,你只能看表面上的一些污垢,半透明度为 0.99 或 1.0 表示完全不透明或几乎看不到它的后面。这就是两者的区别,此外不透明度 或者说 半透明 效果比 不透明蒙版 的开销大得多。如果你想提升运行速度,你要使用不透明蒙版,但如果你想要更好的效果,请选择不透明度。

完成这步,并将混合模式设为半透明后。按住 1 键,点击图标创建标量节点。右键点击标量,将其转换为参数,将这个参数命名为 Opacity ,为它新建 Opacity 分组。将 Default Value 设置为 0.5 ,将 Slider Max 设为 1.0 ,将 Slider Min 设为 0.0001。同样这么做的原因是为了确保美术师们在调整滑块数值时,不会意外使用一些极端值。接下来,将参数连到 Opacity 输入上。

很明显,它并不像玻璃,因为上面有砖块纹理。简单的方法是直接将 Base_Color 参数连接到 Base Color 输入上,删除砖块纹理参数。接下来要做的是改变光照模式,让玻璃与场景光照产生更好的互动。我们找到 Translucency 分段下的 Lighting Mode ,将它设置为 Surface ForwardShading 。这样能让半透明效果在光照下最真实,但开销也最为昂贵。看左上角的模型,可以看到,法线贴图产生作用了,我们稍后会调整法线贴图。虽然看起来效果不错,也许要把 Opacity 的 Default Value 设为 0.1 ,让它看起来更透明。这时我们会发现编译的时间非常长,这时因为这项操作的开销非常昂贵。

关于粗糙度纹理蒙版,也就是我们使用的这些节点,这些设置。我们要保留它们,因为这是一种超级节省性能的多纹理存储方式,是材质编辑器中非常推荐的一种操作。
至于法线贴图,我们需要做的是,找一张不同的法线贴图。一个小技巧是,我们可以在内容游览器中搜索 _N 来筛选出所有的法线贴图。我们要找一个让玻璃有一些下次,但不至于太过明显的法线贴图,你也可以有你自己的想法。找到你想要的法线贴图并添加到节点中,等待材质编译完成。你可以尝试使用不同的法线贴图来找到你最想要的效果。

2.创建材质函数
现在法线贴图中的瑕疵比较明显,我们想调整纹理平铺,以便让法线贴图中的瑕疵不那么明显。所以这节中我们要来看看如何创建材质函数,以便我们在不同材质间共享着色器代码。
在我们创建材质函数前,先要清楚的问题是,什么是材质函数?就像我刚才说的,材质函数是一种在材质之间共享着色器代码的方法。要共享代码,通常你可以选中所有代码复制粘贴到任何地方。但一段时间后就会产生问题,尤其是当你突然发现,需要大量修改游戏中所有着色器代码时。材质函数的作用是,允许你共享特定的材质代码片段,但无需你复制粘贴代码,然后手动更新代码。实际上,你只需单独调整材质函数,再按下 Apply ,然后任何使用该材质函数的材质都会更新该调整。这么做同样有利于确保如果有人新建了材质,他们只能使用游戏中已经被验证的函数和功能。这就意味着,比如说你决定了所有缩放都从中心开始向外缩放,而不以左上角为中心,如果你建立材质函数,美术师可以直接在它们的材质中使用它,而无需担心有人不小心使用了错误的缩放方式。
简单介绍完材质函数后,以及为和要使用它们后,让我们开始创建材质函数吧。为此,打开UE4,右键点击内容浏览器,选择 Materials & Textures,并选择 Material Function ,把它命名为 MF_Tile。双击打开它。

现在我们已经创建了材质函数,我们要来设置它。我们的做法是,我们只需实现一些非常简单的纹理平铺效果,然后在刚才创建的两个主材质中共享这个效果。这样做的原因是我们要确保平铺效果保持一致,如果我调整了任意材质的表面平铺效果,我仍拥有相同的控制。我不需要在某个着色器中以一种方式调整平铺,然后在另一个着色器中以另一种方式调整。所有的目的就在于保持一致。
我们首先要做的是添加材质坐标,将它与输入乘数相乘,然后输出结果。我们还需要设置 Material Expression Function Input ,为它起个名字,描述它的作用。这样当人们搜索材质函数时,他们可以找到它,并且了解它的作用,而不必创建函数并打开它才能了解它的作用。我们要为它输入描述内容,然后设置输入类型。让我们开始吧。
在虚幻引擎中打开我们的材质函数,将输出名称更改为 TileOut ,描述是 Tiles Textures ,非常简单。我们要添加的第一个节点是 TextureCoordinate ,然后添加一个 Function Input 节点,将输入名称更改为 Texture_Scale,将输入类型更改为 Function Input Scalar ,同事给它添加一个 Preview Value ,因为我们要将材质坐标与一个可供我们上下调整的数值相乘,以便缩放纹理UV的大小。让我们按下 M 键,点击左键创建 Multiply 节点,然后将 TextureCoordinate 连到 A 引脚,将 Input Texture_Scale 连到 B 引脚,最后将它连到 Output TileOut ,点击 Apply。这应该就是所有操作,如果右键点击 Output ,点击 Stop Previewing Node ,然后再 Start Previewing Node ,你应该能看到效果。
完成后,让我接着点击 Apply 并点击 Save ,关闭函数窗口。回到1.7节的玻璃材质编辑器中,点击材质函数 MF_Tole ,并将其拖动到材质图表上。然后我要做的是,在图表上按下 1 键得到标量,将标量转换成标量参数,命名为 Texture_Tile ,将 Slider Max 设置为 25,将 Default Value 设置为 1 ,将 Slider Min 设置为 0.5。因为如果数值太小,效果不会很好看,将参数 Texture_Tile 的输出连到材质函数 Texture_Scale 的输入,然后将函数的输出连到粗糙度和法线纹理的UV贴图的输入上。接着点击 Apply 然后保存完毕后,关闭材质编辑器的窗口。

接着我们打开1.6节制作的材质,将材质函数 MF_Texture_Tile 拖动到材质编辑器中,然后进行上述相同的操作,不过需要把函数的输出也连到底色纹理的输入上。
