主材质节点
材质 是使用一种称为 高级着色语言 (简称 HLSL)的专用编码语言来创建的。 HLSL 使材质能够直接与图形硬件交互,让美工和程序员可以更好地控制屏幕上显示的内容。 在虚幻引擎 4 (UE4) 中,用来创建材质的材质表达式节点包含这种 HLSL 代码的小片段。 为了显示所有这些 HLSL 代码小片段的结果,我们使用主材质节点。 您可以将主材质节点看作材质图中的终点站。 无论材质表达式节点以什么样的组合插入到主材质节点的输入中,它们都会在材质经过编译后使用时显现。
主材质节点负责显示所有输入到其中的材质表达式节点的结果。 主材质节点的每个输入都会对材质的外观和行为产生独特的影响。 显示为白色的输入表示该输入将影响材质,而以灰色显示的输入表示它们对材质没有影响。 默认情况下,主材质节点会有一些以灰色显示的输入。 要启用或禁用主材质节点的输入,需要在材质的 细节(Details)面板中修改下列属性。
1.混合模式(Blend Mode)
2.着色模型(Shading Model)
3.D3D11 铺嵌模式(D3D11Tesselation Mode)
输入和材质设置
并不是所有输入都对你创建的每种类型材质都有用。例如,在开发光照函数(Light Function)时——一种应用到光源的材质——你只能在材质上使用自发光颜色(Emissive Color)输入,而不能使用其他任何输入,因为其他输入(如金属感(Metallic)或粗糙度(Roughness))不适用。正因为如此,为了避免你过度担心输入,了解正在创建的材质类型非常重要。其中三个主要的控制属性是:
混合模式(Blend Mode)——此属性将控制你的材质如何混入它后面的像素。
着色模型(Shading Model)——此属性定义如何计算材质表面的光源。
材质域(Material Domain)——此属性控制材质的使用方式,例如它作为表面的一部分、光照函数,还是后期处理材质。
幸运的是,虚幻引擎4不需要你猜测各种材质应使用什么输入。在材质(Material)中更改这些设置时,你会注意到可用的输入将更新,而不需要的输入将被禁用。
1.1底色(Base Color)
底色(Base Color) 定义材质的整体颜色。它接收 Vector3 (RGB) 值,并且每个通道都自动限制在 0 与 1 之间。如果是从现实世界获得的,那么这是使用偏振滤光器拍摄时获得的颜色 (偏振在校准时会消除非金属材质的镜面反射1.2 金属色(Metallic)
金属色(Metallic)输入控制表面在多大程度上"像金属"。非金属的金属色(Metallic)值为 0, 金属的金属色(Metallic)值为 1。对于纯表面,例如纯金属、纯石头、 纯塑料等等,此值将是 0 或 1,而不是任何介于它们之间的值。创建受腐蚀、落满灰尘或生锈金属之类的混合表面时, 您可能会发现需要 介于 0 与 1 之间的值。
1.3 -高光
在编辑 非金属 表面材质时,您有时可能希望调整它反射光线的能力,尤其是它的 高光 属性。 要更新材质的高光度,需输入介于0(无反射)和1(全反射)之间的标量数值。注意,材质的默认高光值为0.5。
1.4 -粗糙度
粗糙度(Roughness)输入控制材质表面的粗糙或平滑程度。与平滑的材质相比,粗糙的材质将向更多方向散射所反射的光线。 这决定了反射的模糊或清晰度(或者镜面反射高光的广度或密集度)。 粗糙度 0(平滑)是镜面反射,而粗糙度 1(粗糙)是漫射(或无光)表面。
粗糙度是一个属性,它将频繁地在对象上进行贴图,以便向表面添加大部分物理变化。
各向异性与切线
可以利用 各向异性(Anisotropy) 和 切线(Tangent) 输入控制材质粗糙度的各向异性和光源方向性。如果材质要展现类似拉丝金属的各向异性效果,这两项输入至关重要。
在不使用各向异性(Anisotropic)和切线(Tangent)输入的情况下,材质拥有各向同性响应。当各向异性输入的值为0时也是如此。
可以使用-1.0到1.0之间的值来控制各向异性响应,其中0值表示没有各向异性效果。
各向异性材质是默认启用的,但可以通过控制台命令 r.AnisotropicMaterials. 禁用。启用后,各向异性可以用于受支持的第五代(Gen5)平台,也能在可扩展设置为高(High)、极高(Epic)或电影级别(Cinematic)时使用。
使用 切线(Tangent) 输入,利用纹理或向量表达式来定义光的方向性。
1.5 - 自发光
由于材质在发光,所以 自发光颜色(Emissive Color) 输入将控制材质的哪些部分会发光。理想情况下这将获得一个遮罩纹理(除了需要发光的区域之外,大部分呈黑色)。
由于支持HDR光照,所以允许大于1的值。
1.6 - 透明度
使用半透明混合模式时,会用到 不透明度(Opacity) 输入,通常适用于 半透明(Translucent)、添加(Additive) 和 调制(Modulated) 材质。可以输入0与1之间的值,其中:
0.0代表完全透明。
1.0代表完全不透明。
使用一个次表面着色模型时,不透明和遮罩混合模式也使用不透明度。
不透明度主要用于 半透明材质(Translucent)、添加材质(Additive) 和 调制材质(Modulated Materials)。
1.7 - 不透明度和次表面材质
当和次表面材质一起使用时,不透明度会表现得不同。这个参数并不控制您透过目标所看到的内容,而是控制在整个表面可散射的光照数量。您可以在示例中看到,低不透明值会使大量光照穿过表面,而高不透明值则只显示非常少的散射。
1.8 - 不透明蒙板
不透明遮罩(Opacity Mask) 类似于不透明度(Opacity),但仅在使用遮罩(Masked)混合模式时可用。与不透明度(Opacity)一样,它的值在0.0到1.0之间,但与不透明度(Opacity) 不同 的是,结果中看不到不同深浅的灰色。 在遮罩模式下时,材质要么完全可见,要么完全不可见。当你需要可以定义复杂实心表面(如铁丝网、链环围栏等等)的材质时,它将成为一种理想的解决方案。不透明部分仍将遵循光照。
你可以使用基础材质节点上的 不透明度遮罩剪切值(Opacity Mask Clip Value) 属性来控制剪切发生点。
1.9 - 法线
法线(Normal) 输入接收法线贴图,后者将打乱每个单独像素的"法线"或朝向方向,为表面提供重要的物理细节。 法线贴图通常是从高分辨率建模包创建的。
1.10 - 世界位置偏移
世界位置偏移(World Position Offset) 输入允许网格体的顶点在世界空间中由材质操纵。这有助于实现使对象移动、改变形状、旋转和各种其他效果。这适用于环境动画之类的内容。
当使用世界位置偏移(World Position Offset)将对象扩展到超出其原始边界时需注意,渲染程序仍将使用那些原始边界。这意味着你可能会看到剔除和阴影错误。你可以进入一个网格体的属性,设置它的 范围边界(Scale Bounds) 属性来进行补偿,但这样会影响性能,并可能导致投影错误。
1.11 - 世界位移
世界位移(World Displacement) 的工作方式与世界位置偏移(World Position Offset)非常相似,但它使用曲面细分顶点,而非网格体的基础顶点。为了启用此功能,材质上的曲面细分(Tessellation)属性必须设为 无(None) 以外的值。
使用世界位移(World Displacement)将对象扩展到超出其原始边界时需注意,渲染程序仍然使用那些原始边界。这意味着你可能会看到剔除和投影错误。 为了解决这类问题,可以编辑网格体的 缩放边界(Scale Bounds) 属性,但编辑行为可能导致性能损耗,进而引发其他错误(如投影出错)。
1.12 - 曲面细分乘数
曲面细分乘数(Tessellation Multiplier) 控制沿表面的曲面细分量,能够在需要的地方添加更多细节。与世界位移(World Displacement)一样,为了启用这个功能,曲面细分(Tessellation)属性必须设为 无(None) 以外的值。
1.13 - 次表面颜色
只有在[着色模型]属性设为次表面(Subsurface)时,才会启用 次表面颜色(Subsurface Color)。 你可以使用此输入将一种颜色添加到材质,模拟光通过表面时颜色的变化。举例而言,人类角色的皮肤上可能有一种红色的次表面颜色,来模拟其表面之下的血液。
1.14 - 折射
折射(Refraction) 输入接受一个纹理或数值,其模拟表面的折射率。它适用于玻璃和水这样的物质,因为光穿过这些物质时会发生折射
毛发
毛发(Hair) 着色模型用于更好地模拟头发的半透明特性,并模拟光源穿过毛发的方式,因为毛发并不是完美的圆柱体。同样,由于每束毛发通常指向不同的方向,因此镜面高光并不统一,而是根据毛发指向的方向独立放置。
毛发着色模型(Hair Shading Model)在主材质(Main Material)节点上开辟了三种输入。
散射(Scatter):此输入控制允许穿过毛发的光线散射量。
切线(Tangent):此输入可代替 法线(Normal) 输入,用于控制沿U和V纹理坐标的法线方向。
背光(Backlit):此输入控制影响毛发材质的背光量。
布料
布料(Cloth) 着色模型可以用来更好地模拟材质表面有一层薄绒毛的布料类材质。
布料着色模型(Cloth Shading Model)在主材质(Main Material)节点上开辟了两种输入。
绒毛颜色(Fuzz Color):你可以通过此输入将颜色添加到材质,以模拟光通过表面时颜色的变化。
布料(Cloth):可以通过此输入控制 绒毛颜色 作为遮罩的强度。值为0表示绒毛颜色对底色没有影响,值为1则表示完全混合在底色上。
眼睛
这是一种高级着色模型,技术性很高,在着色器代码、材质、几何形状及其UV布局之间拥有非常强的依赖性。但是,你在开发自己的眼睛资产时以[数字人类]范例项目为起始点,或直接从此项目迁移资产。
眼睛(Eye) 着色模型用于模拟眼睛的表面。
下面的眼睛材质实例已设为对[数字人类]范例项目中眼睛着色器的不同生物构造部分进行艺术控制。
眼睛着色模型(Eye Shading Model)在主材质(Main Material)节点上增加了两种额外输入。
虹膜遮罩(Iris Mask):这有助于控制虹膜的折射率和深度。
在数字人类范例项目的材质 M_EyeRefractive 中,查看 IOR 和 深度范围(Depth Scale) 参数。
虹膜距离(Iris Distance):用于控制折射虹膜的凹度。
在数字人类范例项目的材质 M_EyeRefractive 中,查看 虹膜凹度比例(Iris Concavity Scale) 和 虹膜凹度幂(Iris Concavity Power) 参数。
透明涂层
透明涂层(Clear Coat) 着色模型可以用来更好地模拟材质表面有一层半透明薄膜的多层材质。除此之外,透明涂层着色模型也可以用于金属或非金属表面。事实上,它专门用来将第二类光滑彩色薄膜 蒙到非有色金属上。透明涂层材质的一些范例有:丙烯酸或涂漆的透明涂层,以及金属表面的彩色薄膜,如易拉罐或车漆。
透明涂层着色模型(Clear Coat Shading Model)在主材质(Main Material)节点上开辟了两种新的材质输入。
透明涂层(Clear Coat):透明涂层数量,0为标准着色模型,1为全透明涂层模型。这适用于遮罩。
透明涂层粗糙度(Clear Coat Roughness):透明涂层的粗糙度。小数值的近似模拟较为准确。此输入支持非常粗糙的透明涂层,但与其实际的世界对照物相比,这些涂层不会非常准确。
环境光遮蔽
环境光遮蔽(Ambient Occlusion) 输入用来帮助模拟在表面缝隙中发生的自阴影效果。 通常,此输入将连接到某种类型的环境光遮蔽纹理贴图,这种贴图通常在Maya、3ds Max或ZBrush等三维建模软件或Photoshop这类照片编辑软件中创建。
注意,这个输入需要光源使用 静态(Static) 或 固定(Stationary) 可移动性设置来构建光照。如果该材质与 可移动(Movable) 光源一起使用,则该材质会被默认忽略。
像素深度偏移
像素深度偏移(Pixel Depth Offset) 可利用你设置的逻辑来控制着色器图表中的像素深度。你可以利用它来创建自己的逻辑,以根据对象的场景深度来混合或淡化对象。
在此比较中,将像素深度偏移与DitherTemporalAA材质函数结合使用,我们能够设置"偏移"值,该值利用点画图案纹理将地面与相交的对象混合。
着色模型
此输入要求在材质 细节(Details) 面板中将着色模型(Shading Model)设为 From材质表达式(From Material Expression)。
借助 着色模型(Shading Models) 输入,可以使用材质图表(Material Grpah)中的逻辑从可用的着色模型列表中选择,用于材质的部分。举例而言,当一个对象需要使用多个着色模型(例如透明涂层(Clear Coat)和默认光照(Default Lit))时,此输入十分实用。这样可以减少所需的材质数量,从而改善性能并减少绘制调用。所有这些都可以由材质中使用着色模型表达式节点和一些纹理遮罩的逻辑来驱动。
以下是使用 If 表达式选择着色模型的简单示例。
使用此示例时,如A大于B,产生的着色模型为 默认光照(Default Lit)。当A小于或等于B时,纹理遮罩用于在网格体的各个部分显示 默认光照(Default Lit) 和 透明涂层(Clear Coat) 着色模型。
基于材质表达式使用基于材质表达式的着色模型,将多个着色模型合并到单个材质中。
使用
1.在材质中选择 材质输入(Material Inputs)(左上)或 材质属性(Material Attributes)(左下)节点,并在其 细节(Details) 面板中,将 着色模型(Shading Model) 设置为 基于材质表达式(From Material Expression)。
2.选中后,材质输入节点 着色模型(Shading Model) 上将有一个新输入可用。
3.右键单击材质图表,搜索并添加 着色模型(Shading Model) 节点。
4.用其下拉菜单选择所要使用的着色模型。
材质中已用的着色模型
使用 着色模型(Shading Model) 表达式向材质添加不同着色模型时,若选择了 材质输入(Material Inputs) 或 材质属性(Material Attributes) 节点,这些着色模型就会列示在 细节(Details) 面板中的 已用着色模型(Used Shading Models) 旁。
此例显示使用着色模型(Shading Model)节点在此材质中设置了三个着色模型。
切记:由于 切换(Switch) 节点可用于删除图表中的所有部分(包括着色模型),因此此列表仅显示材质图表中设置的着色模型,并不表示实际编译的内容。
混合材质属性
使用材质属性工作流程时,可使用自定义混合操作进行着色模型参数输入,其余材质属性参数则正常进行混合。
使用 着色模型(Shading Model) 节点从 细节(Details) 面板选择着色模型,然后使用 BlendMaterialAttributes 节点将两者混合。若透明度小于0.5f,着色模型 透明度(Alpha) 输入选择 A;若大于等于0.5f,则选择 B。
此例中,材质图表显示使用 SetMaterialAttributes 节点设置两个单独的材质。这些材质使用碳纤维纹理,且图表顶部部分使用 默认光照(Default Lit) 着色模型。图表底部部分使用 透明涂层(Clear Coat) 着色模型。BlendMaterialAttributes 节点将这两种不同的着色模型混合起来,并将 透明度(Alpha) 输入参数作为合并材质上的遮罩。If语句
If 语句可用于 A 到 B 的浮点值,以设置使用的 着色模型,如下例所示。
默认情况下,若未设置 B 值,默认值为 0。可在 细节(Details) 面板中设置硬编码值,使用从纹理或常量派生的另一个浮点值;或者为 B 输入设置参数,以便在材质实例中对其进行控制。
在下面的比较中,If表达式根据 A 求 B 的值,以将阴影模型设置为 默认光照 或 透明涂层。如果 A 的浮点值大于 B,使用 默认光照(Default Lit),如果 A 小于 B,使用 透明涂层(Clear Coat)。
Switch节点
使用下述可用 Switch 节点控制材质的功能和质量。
着色路径切换(Shading Path Switch)可指定用于渲染路径的材质逻辑部分。
在使用引擎质量水平控制材质逻辑时,质量切换(Quality Switch) 十分适用。
在设置材质用于不同设备时,特征等级切换(Feature Level Switch) 十分适用。
静态切换(Static Switch) 或 静态切换参数(Static Switch Parameter) 可在基本材质中排除材质的整个分支,或通过材质实例进行控制。
在下面的图表和对比中,若设为 True,静态切换(Static Switch) 表达式将着色模型设为 默认光照(Default Lit),若设为 False,则设置为 透明涂层(Clear Coat)。
Switch节点
使用下述可用 Switch 节点控制材质的功能和质量。
着色路径切换(Shading Path Switch)可指定用于渲染路径的材质逻辑部分。
在使用引擎质量水平控制材质逻辑时,质量切换(Quality Switch) 十分适用。
在设置材质用于不同设备时,特征等级切换(Feature Level Switch) 十分适用。
静态切换(Static Switch) 或 静态切换参数(Static Switch Parameter) 可在基本材质中排除材质的整个分支,或通过材质实例进行控制。
在下面的图表和对比中,若设为 True,静态切换(Static Switch) 表达式将着色模型设为 默认光照(Default Lit),若设为 False,则设置为 透明涂层(Clear Coat)。
材质实例化
完全支持材质实例化,以便在材质图表中设置和使用逻辑,以驱动参数和变量来设置要使用的材质模型。
切记,材质实例着色模型显示为 基于材质表达式(From Material Expression),并可被覆盖为静态着色模型。但不可将材质实例着色模型覆盖为 基于材质表达式(From Material Expression),此覆盖将无征兆地失败且不产生任何作用。
其他信息
着色模型输入始终显示为启用(Shading Model Input Always Shown Enabled)
启用 使用材质属性(Use Material Attributes) 并使用Set、Get、Make或Break Material Attributes节点时,即使 基于材质表达式(From Material Expression) 未设为所选着色模型,着色模型 输入仍始终显示为启用(不显示为灰色)。除非 基于材质表达式(From Material Expression) 设为材质的着色模型,否则引脚不执行任何操作。这不影响默认的主材质输入节点。
材质实例覆盖(Material Instance Overrides)
可正常覆盖材质实例的 着色模型,但将着色模型设置为 基于材质表达式(From Material Expression) 会无征兆地失败且不产生任何影响,除非父材质使用着色模型。
无光照着色模型
里面有许多编译好的信息,这意味着不引入回归,就无法正确支持着色路径。