文/侑虎科技

上周的Unreal 4引擎文章介绍了渲染模块的光照系统,在本篇文章中,我们继续介绍渲染模块的另一重要部分:材质系统。

在此,特别感谢Unreal中国团队对于本篇文章中Unreal引擎相关内容的审核,并在我们学习其引擎的道路上提供的大力支持。

材质系统

材质描述了场景中物体与光照进行交互的过程,它是决定物体表面外观的最重要部分之一。Unreal 4引擎的材质系统为开发者提供了丰富的功能,使得开发者能够非常便捷地设计出具有真实感的场景和角色。本文将在接下来的内容中对Unreal 4引擎的材质系统功能进行逐一介绍,其中主要分为四个部分:材质编辑、材质模型、材质使用和特殊功能。在介绍前三部分内容时,本文会根据需要与Unity引擎功能的相似性进行比较。

一、材质编辑

在Unreal 4引擎中创建材质可以通过“Content Browser”中的“Add New”按钮或者右键弹出菜单中选择Material创建,如下图所示:

094444wz3crpfuqlp5rjfz.png (上图取自Unreal 4官方网站)
其中,上图左边是材质编辑的预览,右边是材质节点图。该节点图中的节点在编辑完成后会被自动替换成HLSL代码段,并生成相应的Shader代码在实时渲染时使用。在调试过程中,编辑完节点图并保存后,即可在场景视图中看到最新的结果。

Unity引擎原生仅支持通过修改Shader代码的方式制作新的材质。但在Unity引擎Asset Store中有第三方插件Shader Forge提供了类似的编辑功能【1】,如下图所示:

094445rzr454imrt61jr13.png (上图取自Unity Asset Store 【1】)
此外,在Unreal 4引擎中的材质编辑界面的“HLSL Code”页面中可以查看由节点图生成的代码,如下图所示:

094446yzsufjsahfxduqa2.png
在“Stats”页面中可以看到当前Shader的Instruction和Texture Sampler的数目,如下图所示。这是一个直观简单、但却很实用的功能。Unity引擎暂时还未原生支持该功能,研发团队需要使用第三方工具来自行进行计算。

094447bvcecwvzf8nccmkk.png
除了使用节点图进行材质编辑,Unreal 4引擎也支持直接采用HLSL代码进行编辑。其详细内容可参考Unreal 4官方网站。

材质编辑Unreal 4 vs Unity小结

相比较而言,Unreal 4引擎原生提供了非常方便的节点图交互方式,Unity引擎通过第三方工具也可以达到类似的效果。

二、材质模型

与Unity引擎5.x的Standard Shader类似,Unreal 4引擎的材质系统使用了当前游戏渲染中非常流行基于物理的渲染材质(Physically Based Rendering,以下简称PBR)模型。因此,它们都只需要少量的输入参数,就能表达丰富的材质外观,如下图所示:

094447cvojr6chre1r6c1m.png
其中,左图是Unreal 4引擎的材质系统节点图中的基础节点,其白色圆圈表示的引脚表示可设置的输入参数,通过设置不同的输入参数可以达到不同的材质效果。右图是Unity 5.x的Standard Shader材质设置界面。两者大部分参数表示含义是相似的,可通过以下各参数的对应关系来进行理解(Unreal 4 Unity):
 

  • Base Color Albedo:材质颜色、贴图
  • Metallic Metallic:金属度
  • Roughness Smoothness:粗糙、光滑度
  • Emissive Color Emission:自发光颜色、贴图
  • Normal Normal Map:法线贴图
  • World Position Offset Height Map:高度图
  • Ambient Occlusion Occlusion:AO贴图


上图显示了Unreal 4引擎与Unity引擎中不透明物体渲染的Shader参数设置。对于半透明渲染和Alpha Test渲染Unreal 4引擎和Unity引擎也都支持,并且可以通过修改参数选项进行设置,如下图所示:

094449llaannsfmsf9zimb.png
其中,左图显示了Unreal 4引擎材质编辑器中“Blend Mode”设置选项,右图显示了Unity引擎“Rendering Mode”设置选项。其对应关系为(Unreal 4 Unity):

 

 

  • Opaque Opaque:不透明渲染
  • Masked Cutout:Alpha Test
  • Translucent Transparent:半透明渲染

Unity引擎中的Fade模式是用于渲染模型逐渐消失的效果。Unreal 4引擎另外三种“Blend Mode”的含义如下,通过这三种参数开发团队可以达到更为灵活的半透明效果。

 

 

  • Additive:将Pixel的结果叠加到背景
  • Modulate:将Pixel的结果乘以背景
  • AlphaComposite:预乘Alpha值Blend

Unreal 4引擎材质编辑器的基础节点中有许多“默认”输入参数,对不同的“Blend Mode”,其可供设置的参数也不相同,如下图所示:

094451uazozkxkgp6qw28k.png Subsurface
094452flllb83x7636blfc.png Preintegrated Skin
094454b54dy1d176minz32.png (上图取自Unreal 4官方网站)
其中,左图是Unreal 4引擎渲染结果,右图是实际拍摄结果。可以看出,该材质的渲染效果相当惊艳!

- Two Sided Foliage 这种材质模型用于渲染树木材质效果,它比Default模型能更好地模拟树叶的透射效果,如下图所示:

094456xgqi1191g49ggqbn.png
在使用之前,还需要在父类材质资源中将需要修改的参数用节点图中的“Parameter”类型节点表示,如下图所示:

094456y51zi406l6o1217a.png
然后,即可在Instanced Material编辑器的“Details”页面中看到,如下图所示:

094456m6snsltxttilm9f9.png
其中,上图“Parameter Groups”中的“Color”和“Roughness”参数即为其父类材质资源中“Parameter”节点表示的参数。

该Instanced Material支持实时在编辑器中修改“Color”和“Roughness”参数,而不需要重新编译材质。但是这种Instanced Material仅支持在编辑其中修改参数,其在Unreal 4引擎中被称为“Material Instance Constant”。

如果需要运行时修改,则需要通过蓝图或者代码动态创建Instanced Material,这种材质在Unreal 4引擎中被称为“Material Instance Dynamic”。如果想在项目运行时,根据一些特殊情况调整材质参数(比如怪物/角色受击后改变颜色、死亡时改变透明度等等),那么就需要通过Material Instance Dynamic来实现这些效果。

材质使用Unreal 4 vs Unity小结

在Unreal 4中,Material主要分为三类:原始Material、Material Instance Constant和Material Instance Dynamic。与Unity中的材质系统比较,有以下三点非常值得注意:

 

 

  • Unreal 4中的Material类似于Unity中的Shader,其节点图则可认为是Shader代码的定义;
  • Unreal 4中的Material Instance Constant类似于Unity中Material,它是Shader和输入参数的集合. 只有导出的 Parameters 可以进行修改,但仅限在 Editor 下修改,在运行时是不能动态修改参数的。所以一般场景物件(不用动态改材质)都是使用各种Material Instance Constant来进行渲染;
  • Unreal 4中的Material Instance Dynamic类似于Unity中的Material(Instance)。主要区别是,前者需要在Unreal 4中手动指出,后者是Unity在项目运行时,当修改Material参数时动态生成。

四、特殊功能

Unreal 4引擎不仅提供了通用的材质创建、编辑和使用功能,而且还提供了一些辅助的特殊功能。本文将对其中的三种进行详细介绍。

Material Function

Unreal 4引擎的材质编辑器内置了丰富的功能性节点,使得开发者在编辑材质节点图时能够灵活地实现许多功能。但是,当编辑的节点图到达一定复杂程度后,维护起来就变得非常困难。Unreal 4引擎提供了一种类似函数式的用户自定义节点,Material Function。当某些功能在多种材质用时,可以采用Material Function将其封装成一个节点进行重复利用,降低了维护难度。

Material Function是Unreal 4引擎材质系统中的一种资源,通过右键菜单进行创建,双击即可打开Material Function的编辑器。Material Function的编辑方式与Material类似,也是采用节点图的方式,如下图所示:

094456o07psqxmbbq4cvhv.png (上图取自Unreal 4官方网站)
当Material Function创建好后,在“Details”设置界面中勾选“Expose to Library”即可在Material的编辑的“Palette”中找到该节点,并可在节点图中使用,如下图所示:

094457owbjghcg71bjxc13.png
094458x1e24l4bflbb2sbv.png
Layered Materials

在Unreal 4引擎中,Material Function实现了将某种通用功能封装成一个节点重复利用。而利用Material Function的特点以及“Make Material Attributes”节点可以在一个材质资源中,将多种材质进行混合,如下图所示:

094458qkvjnbtnohzblb7k.png (上图取自Unreal 4官方网站)
其中,上图是一个Material Function的节点图,“Make Material Attributes”类似于材质资源中的基础节点,它可以被认为是在Material Function内部完成了一种材质的定义。而在编辑材质资源时,通过将多个预先定义好材质的Material Function进行混合,就可达到Layered Materials混合效果。它可以被用于制作模型表面不同位置用不同材质渲染的情况,如下图所示:

094500p4fk6ffggg9hgfq9.png (上图取自Unreal 4官方网站)
其中,角色模型用了5种不同的材质进行渲染。这几种材质可以通过Layered Materials方式在一个模型上实现。

Material Parameter Collections

在编辑材质资源的过程中,通常会遇到某一个参数在不同的材质资源中使用的情况。此时,可以利用Unreal 4引擎提供的Material Parameter Collections资源进行管理。该种资源可以维护一系列变量和向量的参数值。这些参数可以在不同的材质中进行引用。当需要修改时,只需修改Material Parameter Collections资源中的共用参数值即可。在Unity中也有类似功能,即使用Shader的SetGlobal方法对全局参数进行设置。

094500h23ia02ywa7iszm3.png
特殊功能Unreal 4 vs Unity小结

相比较而言,Unreal 4引擎提供了更多、更复杂特殊效果支持,使得美术在制作时能够更灵活、便利地实现复杂的材质。

材质系统小结

与我们熟悉的Unity引擎一样,Unreal 4引擎对当前流行的PBR材质模型同样进行了深度的支持,且在材质编辑方面,Unreal 4原生提供了更为直观方便的节点图交互方式。而在功能和效果上,Unreal 4引擎提供了丰富的模板和Material Function功能,从而让开发团队可以高效地创作出惊艳的渲染效果。希望随着移动硬件设备的逐渐提升,这些惊艳的效果可以在更多的项目中得到体现。

参考文献

【1】 https://www.assetstore.unity3d.com/en/#!/content/14147


【2】 https://www.assetstore.unity3d.com/en/#!/content/100332


【3】 https://www.assetstore.unity3d.com/en/#!/content/3254

以上即为我们对Unreal 4引擎就渲染模块的材质系统的讲解,之后我们会将继续分享渲染模块下的图像后处理等其他学习心得,欢迎大家的关注!我们希望本系列文章能让更多的中国游戏开发者了解和理解Unreal 4引擎的重要功能和所能达到的效果,也让更多的中国游戏开发者对Unreal引擎和Unity引擎融会贯通,提升技术储备。

锐亚教育

锐亚教育,游戏开发论坛|游戏制作人|游戏策划|游戏开发|独立游戏|游戏产业|游戏研发|游戏运营| unity|unity3d|unity3d官网|unity3d 教程|金融帝国3|8k8k8k|mcafee8.5i|游戏蛮牛|蛮牛 unity|蛮牛