Unreal 材质系统

材质(Material) 是可以应用到网格物体(Mesh)上的资源,用它可控制场景的可视外观。从较高的层面上来说,可能最简单的方法就是把材质视为应用到一个物体的"描画"。但这种说法也会产生一点点误导,因为材质实际上定义了组成该物体所用的表面类型(质感)。您可以定义它的颜色、它的光泽度及您是否能看穿该物体(半透明)等等。

在这里是默认大家对使用材质系统拥有基本的基本操作经验,所以本文并不会对一般的简单操作做任何的解释和说明,如果大家想对Unreal材质系统的基本操作感兴趣的话,参考官方文档:

https://docs.unrealengine.com/zh-CN/Engine/Rendering/Materials/index.html

对与某些高端的材质TA向的技巧和经验总结以后会在之后的文档中进行总结和归纳。

因此,本文的重点主要是来分析材质系统的运行逻辑和手段,从自动的代码生成到生成变体的过程,最终到如何和几何信息绑定提交渲染的一整套的流程。

一.简介

由于后文即将阐述的编译功能或者变体功能更加的抽象和难以理解,所以我们需要一个比较直观的切入来审视Unreal的整个材质系统。

我希望呈现一种较为直接的介绍模式,这一切就在我们打开一个Materal.asset开始。其对应于代码中的UMaterial。

1.1 PBR和它的输出

当我们打开材质编辑器,最开始我们能最直接看见的就是我们的材质的输出。如下图的左

右图是迪斯尼的PBR参考,这是unreal 的PBR材质节点。

对应代码中,是对应的各种FXXXMaterialInput。材质输出属性在UE4中的基类叫FMaterialInput,它有一些子类用于表达具体的输出属性的具体数据类型,如FColorMaterialInput,FScalarMaterialInput,FVectorMaterialInput等。

UMaterial中对应的材质输出属性和材质编辑器上的输出节点属性几乎是一一对应的(注,显示出来的名字可能会和变量量不同,因为名字因材质类型,光照模型而显示不同的名字),完整定义如下:

FColorMaterialInput BaseColor;FScalarMaterialInput Metallic;FScalarMaterialInput Specular;FScalarMaterialInput Roughness;FVectorMaterialInput Normal;FColorMaterialInput EmissiveColor;FScalarMaterialInput Opacity;FScalarMaterialInput OpacityMask;FVectorMaterialInput WorldPositionOffset;FVectorMaterialInput WorldDisplacement;FScalarMaterialInput TessellationMultiplier;FColorMaterialInput SubsurfaceColor;FScalarMaterialInput ClearCoat;FScalarMaterialInput ClearCoatRoughness;FScalarMaterialInput AmbientOcclusion;FScalarMaterialInput Refraction;FVector2MaterialInput CustomizedUVs[8];FMaterialAttributesInput MaterialAttributes;FScalarMaterialInput PixelDepthOffset;FShadingModelMaterialInput ShadingModelFromMaterialExpression;