原文链接:
[https://blog.uwa4d.com/archives/Study_unreal4_Rendering_2.html]
上周的Unreal 4引擎文章介绍了渲染模块的光照系统,在本篇文章中,我们继续介绍渲染模块的另一重要部分:材质系统。
在此,特别感谢Unreal中国团队对于本篇文章中Unreal引擎相关内容的审核,并在我们学习其引擎的道路上提供的大力支持。
材质系统
材质描述了场景中物体与光照进行交互的过程,它是决定物体表面外观的最重要部分之一。Unreal 4引擎的材质系统为开发者提供了丰富的功能,使得开发者能够非常便捷地设计出具有真实感的场景和角色。本文将在接下来的内容中对Unreal 4引擎的材质系统功能进行逐一介绍,其中主要分为四个部分:材质编辑、材质模型、材质使用和特殊功能。在介绍前三部分内容时,本文会根据需要与Unity引擎功能的相似性进行比较。
一、材质编辑
在Unreal 4引擎中创建材质可以通过“Content Browser”中的“Add New”按钮或者右键弹出菜单中选择Material创建,如下图所示:
然后,双击“Content Browser”中的材质资源,即可打开材质编辑器。
传统引擎的材质系统对于材质编辑的支持都是需要开发工程师和美术设计师合作完成。通常情况下,技术美术(Technical Artist)或图形程序工程师编写和修改Shader代码,然后美术设计师提供输入纹理以及调试Shader参数。Unreal 4引擎则提供了一套更为方便的编辑方式,使得美术能够几乎不依赖于程序员制作出较为理想的材质资源。这种编辑方式类是一种似于Blueprint的节点图。在编辑材质时,只需要用引擎提供的节点和连线即可制作出逻辑较为复杂的材质效果,如下图所示:
其中,上图左边是材质编辑的预览,右边是材质节点图。该节点图中的节点在编辑完成后会被自动替换成HLSL代码段,并生成相应的Shader代码在实时渲染时使用。在调试过程中,编辑完节点图并保存后,即可在场景视图中看到最新的结果。
Unity引擎原生仅支持通过修改Shader代码的方式制作新的材质。但在Unity引擎Asset Store中有第三方插件Shader Forge提供了类似的编辑功能【1】,如下图所示:
此外,在Unreal 4引擎中的材质编辑界面的“HLSL Code”页面中可以查看由节点图生成的代码,如下图所示:
在“Stats”页面中可以看到当前Shader的Instruction和Texture Sampler的数目,如下图所示。这是一个直观简单、但却很实用的功能。Unity引擎暂时还未原生支持该功能,研发团队需要使用第三方工具来自行进行计算。
除了使用节点图进行材质编辑,Unreal 4引擎也支持直接采用HLSL代码进行编辑。其详细内容可参考Unreal 4官方网站。
材质编辑Unreal 4 vs Unity小结
- 相比较而言,Unreal 4引擎原生提供了非常方便的节点图交互方式,Unity引擎通过第三方工具也可以达到类似的效果。
二、材质模型
与Unity引擎5.x的Standard Shader类似,Unreal 4引擎的材质系统使用了当前游戏渲染中非常流行基于物理的渲染材质(Physically Based Rendering,以下简称PBR)模型。因此,它们都只需要少量的输入参数,就能表达丰富的材质外观,如下图所示:
其中,左图是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引擎也都支持,并且可以通过修改参数选项进行设置,如下图所示:
其中,左图显示了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”,其可供设置的参数也不相同,如下图所示:
其中,从左到右分别是:不透明、半透明以及Alpha Test的材质输入参数。对于无效的输入参数,Unreal 4引擎将其变成灰色,并且无法连接节点图。
Unreal 4引擎除了提供“常规”PBR的材质模型,还提供了一些用于制作特殊效果的材质模型。在我们来看,这些更像是Unreal引擎为开发者制作了一些快捷开发的材质模板。在材质编辑器中可以通过设置“Shading Model”进行选择,如下图所示:
其中,“Default Lit”表示默认的PBR材质模型。对于不同的材质模型,基础节点提供的输入参数也不相同。关于不同材质模型的输入参数和效果,本文不逐一介绍,读者有兴趣可参考Unreal 4官方网站。文本选择了几种我们认为效果特殊的材质模型进行介绍。
- Subsurface、Preintegrated Skin、Subsurface Profile
这三种材质模型的渲染效果比较相似,都属于次表面散射类。与Subsurface有所不同的是,Preintegrated Skin和Subsurface Profile都是专用于模拟人体皮肤渲染效果的模型。但是,Preintegrated Skin使用的方法更加高效并适合于低端设备,而Subsurface Profile的渲染效果更好适合高端设备。其效果如下图所示:
( 上图取自Unreal 4官方网站)
其中,上图从上到下分别是Subsurface、Preintegrated Skin以及Subsurface Profile的渲染效果。Subsurface效果渲染需要比较高的硬件资源,在Mobile端目前还不支持。
- Clear Coat
这种材质模型用于渲染不透明物体表面覆盖一层半透明的效果,如下图所示:
其中,左图是Unreal 4引擎渲染结果,右图是实际拍摄结果。可以看出,该材质的渲染效果相当惊艳!
- Two Sided Foliage
这种材质模型用于渲染树木材质效果,它比Default模型能更好地模拟树叶的透射效果,如下图所示:
其中,上图左边是采用Two Sided Foliage模型渲染结果,右图是Default模型渲染结果。
材质模型Unreal 4 vs Unity小结
- 相比较而言,Unreal 4引擎和Unity引擎都提供了丰富的、通用的基于物理的材质模型。Unreal 4引擎原生对于特殊效果提供了更多的材质模型。Unity引擎则通过Asset Store提供了一些特殊效果材质【2】【3】。
三、材质使用
Unreal 4引擎的材质在使用时与Unity引擎有所不同。在Unity引擎中,材质资源一旦被创建,就可以添加到各种渲染组件中进行渲染。同时,我们可以在运行时通过代码修改材质参数。但是,需要注意的是,当Shader中的某些功能没有被用到时,Unity引擎会自动对其进行优化。经过优化过后的Shader则不再包含这部分的功能,即使在运行时重新设置材质参数也不会生效。对于这种情况,在Unity引擎中可以通过Graphics Setting中的Always Included Shaders或在Shader中设置 “multi_compile”来实现,即告诉Unity引擎不要在Shader Stripping时去掉一些后续运行时需要使用的Key words。
在Unreal 4引擎中,修改材质资源的节点图以及参数不会立刻生效,需要点击右上角“Save”或者“Apply”,此时会引起材质重新编译。因此,材质资源中的参数并不支持在编辑器中实时或运行时更改。Unreal 4引擎提供了另一种材质资源Instanced Material。该种资源继承自材质资源,它拥有与其父类材质资源相同的节点图,并且支持在编辑器中实时或运行时修改参数。
- Instanced Material
该种资源的创建与材质创建类似,在“Content Browser”中即可创建。然后双击资源图标即可打开编辑器。在“Details”页面中可以设置其继承的材质资源。下图显示了Instanced Material资源的设置界面,Parent参数即为其父类材质资源:
在使用之前,还需要在父类材质资源中将需要修改的参数用节点图中的“Parameter”类型节点表示,如下图所示:
然后,即可在Instanced Material编辑器的“Details”页面中看到,如下图所示:
其中,上图“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类似,也是采用节点图的方式,如下图所示:
当Material Function创建好后,在“Details”设置界面中勾选“Expose to Library”即可在Material的编辑的“Palette”中找到该节点,并可在节点图中使用,如下图所示:
使用方式与Unreal 4内置的节点相同,如下图所示:
- Layered Materials
在Unreal 4引擎中,Material Function实现了将某种通用功能封装成一个节点重复利用。而利用Material Function的特点以及“Make Material Attributes”节点可以在一个材质资源中,将多种材质进行混合,如下图所示:
其中,上图是一个Material Function的节点图,“Make Material Attributes”类似于材质资源中的基础节点,它可以被认为是在Material Function内部完成了一种材质的定义。而在编辑材质资源时,通过将多个预先定义好材质的Material Function进行混合,就可达到Layered Materials混合效果。它可以被用于制作模型表面不同位置用不同材质渲染的情况,如下图所示:
其中,角色模型用了5种不同的材质进行渲染。这几种材质可以通过Layered Materials方式在一个模型上实现。
- Material Parameter Collections
在编辑材质资源的过程中,通常会遇到某一个参数在不同的材质资源中使用的情况。此时,可以利用Unreal 4引擎提供的Material Parameter Collections资源进行管理。该种资源可以维护一系列变量和向量的参数值。这些参数可以在不同的材质中进行引用。当需要修改时,只需修改Material Parameter Collections资源中的共用参数值即可。在Unity中也有类似功能,即使用Shader的SetGlobal方法对全局参数进行设置。
特殊功能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引擎融会贯通,提升技术储备。
最后非常感谢您能阅读到这里,希望能对您的项目有所帮助,如对文中的内容有异议或者进一步的补充说明,欢迎在后台给我们留言,谢谢!
Unreal相关技术文档链接
1 虚幻引擎学习之路:渲染模块之光照系统
2 虚幻引擎学习之路:渲染模块之材质系统
3 虚幻引擎学习之路:相机图像后处理
4 虚幻引擎学习之路:渲染模块之全局光照明
5 虚幻引擎学习之路:动画模块之基础篇
6 虚幻引擎学习之路:动画模块进阶篇之动画融合