WangShuXian6 / blog

FE-BLOG
https://wangshuxian6.github.io/blog/
MIT License
46 stars 10 forks source link

虚幻引擎5 材质系统 Unreal Engine 5 Material #180

Open WangShuXian6 opened 11 months ago

WangShuXian6 commented 11 months ago

虚幻引擎5 材质系统 Unreal Engine 5 Material

https://docs.unrealengine.com/5.3/zh-CN/unreal-engine-materials/

WangShuXian6 commented 10 months ago

1 材质图基础 Material Graph Basic

基本数据类型 Basic Data Types

放置立方体 image 右键新建 材质-材质 M_FirstMaterial image

image

打开材质 M_FirstMaterial image

材质图中有4种基本数据类型/常量材质表达式

https://docs.unrealengine.com/5.3/zh-CN/constant-material-expressions-in-unreal-engine/#constant4vector 它们对你想做的任何事情都非常重要。 constant/1 float 【按住1键+鼠标左键】 constant2Vector/2 float 【按住2键+鼠标左键】 constant3Vector/3 float 【按住3键+鼠标左键】 constant4Vector/4 float 【按住4键+鼠标左键】 image

RGB三个字母,它们不一定意味着红色通道、绿色通道或蓝色通道。 这取决于你插入的是什么插座。【例如插座 base color】

Constant(常量)

Constant(常量)表达式输出单个浮点值。这是最常用的表达式之一,并可连接到任何输入,而不必考虑该输入所需的通道数。例如,如果您将一个常量连接到需要 3 个矢量的输入,那么该常量值将用于全部 3 个元素。提供单个数值时,使用说明区域中的小三角形图标来折叠节点可能非常有用

项目 说明
属性  
R 指定表达式所输出的浮点值。

示例:0.7、-0.24 和 1.1 image 通过在材质编辑器的图形区域中按住 1 键并 单击鼠标左键,可快速创建 Constant(常量)节点。

Constant2Vector(常量 2 矢量

Constant2Vector(常量 2 矢量)表达式输出双通道矢量值,即输出两个常量数值。

项目 说明
属性  
R 指定表达式所输出的矢量的红色(第一个)通道的浮点值。
G 指定表达式所输出的矢量的绿色(第二个)通道的浮点值。

示例:(0.4, 0.6) 和 (1.05, -0.3)

用法示例:Constant2Vector(常量 2 矢量)对于修改纹理坐标非常有用,因为这些坐标也是双通道值。 image 通过在材质编辑器的图形区域中按住 2 键并 单击鼠标左键,可快速创建 Constant2Vector(常量 2 矢量)节点。

Constant3Vector(常量 3 矢量)

Constant3Vector(常量 3 矢量)表达式输出三通道矢量值,即输出三个常量数值。您可以将 RGB 颜色看作 Constant3Vector(常量 3 矢量),其中每个通道都被赋予一种颜色(红色、绿色、蓝色)。

项目 说明
属性  
R 指定表达式所输出的矢量的红色(第一个)通道的浮点值。
G 指定表达式所输出的矢量的绿色(第二个)通道的浮点值。
B 指定表达式所输出的矢量的蓝色(第三个)通道的浮点值。

示例:(0.4, 0.6, 0.0) 和 (1.05, -0.3, 0.3)

image 通过在材质编辑器的图形区域中按住 3 键并 单击鼠标左键,可快速创建 Constant3Vector(常量 3 矢量)节点。

Constant4Vector(常量 4 矢量)

Constant4Vector(常量 4 矢量)表达式输出四通道矢量值,即输出四个常量数值。您可以将 RGBA 颜色看作 Constant4Vector(常量 4 矢量),其中每个通道都被赋予一种颜色(红色、绿色、蓝色、alpha)。

项目 说明
属性  
R 指定表达式所输出的矢量的红色(第一个)通道的浮点值。
G 指定表达式所输出的矢量的绿色(第二个)通道的浮点值。
B 指定表达式所输出的矢量的蓝色(第三个)通道的浮点值。
A 指定表达式所输出的矢量的alpha(第四个)通道的浮点值。

示例:(0.4, 0.6, 0.0, 1.0) 和 (1.05, -0.3, 0.3, 0.5) image 通过在材质编辑器的图形区域中按住 4 键并 单击鼠标左键,可快速创建 Constant4Vector(常量 4 矢量)节点。

基础颜色 Base Color

数据类型:constant3Vector/3 float 右键-constant3Vector 或者 按住3键+鼠标左键 image image 双击可直接更改颜色 image image

为立方体-材质-元素0-分配材质 M_FirstMaterial image image

新建材质 M_SecondMaterial

按住3键+鼠标左键 添加 constant3Vector 节点 如果使用 constant,则默认为绿蓝通道赋值0. 如果使用 constant2Vector,则默认为蓝通道赋值0.

粗糙度 Roughness

控制材质粗糙度。粗糙度为0(光滑)为镜面反射,而为1()为完全粗或漫反射。 数据类型:constant/1 float image

材质 M_Reflective 粗糙度 0 image

材质 M_Rough 粗糙度 1 image

对比: image

lerp 线性插值

https://docs.unrealengine.com/5.3/zh-CN/math-material-expressions-in-unreal-engine/ 将零或一插入基色中会看到什么? 如果数值为0,我们会得到一个黑色的表面, image

如果数值是1,则会得到一个白色的表面。 image

颜色只是数值,0是黑色,1是白色,数值不同,得到的颜色也不同。 image

lerp / LinearInterpolate 线性插值

快捷键: L+左键 image

A,B节点需要数据类型:constant/1 float Alpha 数据类型:constant/1 float A 0,B 1,输出0.5

image LinearInterpolate 表达式会以第三个输入值为遮罩参数,然后在两个输入值之间进行插值。 可以想象成两张纹理根据一张遮罩进行过渡,类似Photoshop中的图层遮罩。 遮罩Alpha的强度决定了两个输入值贡献的权重。

如果Alpha是0.0,就使用第一个输入值。 如果Alpha是1.0,就使用第二个输入值。 如果Alpha在0.0和1.0之间,输出是两个输入之间的插值。 Alpha默认0.5. 注意,混合是按通道进行的。 所以,如果Alpha是一个RGB颜色,则Alpha的红色通道会定义A和B的红色通道之间的插值,它 独立 于Alpha的绿色通道,后者定义了A和B的绿色通道之间的插值。

TextureSample 噪声纹理随机粗糙度

image

添加纹理节点 TextureSample https://docs.unrealengine.com/5.3/zh-CN/texture-material-expressions-in-unreal-engine/#texturesample TextureSample 表达式输出纹理中的颜色值。此纹理可以是常规Texture2D(包括法线贴图)、立方体贴图或电影纹理。 image

项目 说明
属性  
纹理(Texture) 指定表达式所取样的纹理。要设置纹理,请先在 内容浏览器 中选择纹理。然后,在此表达式的属性窗口中选择"纹理(Texture)"属性,并单击"使用当前选择(Use Current Selection)"按钮。
取样类型(Sampler Type) 此节点所要取样并输出的数据类型。
Mip值模式(MipValueMode) 选择如何根据计算的默认硬件来定制样本的MIP级别或导数。影响外观及性能。
输入  
UV(UVs) 接收UV纹理坐标,以用于纹理。如果没有任何值输入到UV,那么将使用材质所应用到的网格体的纹理坐标。如果TextureSample代表立方体贴图纹理,那么UV坐标必须是三通道值,而不能是双通道值。
DDX(UV)(DDX(UVs)) 接收UV输入的DDX以用于各向异性过滤。默认情况下,硬件自动执行此过滤,并且速度更快。但是在某些情况下,可能需要使用DDX材质表达式显式地设置此项目,以避免延迟贴花的2x2像素块瑕疵之类的瑕疵。仅当 Mip值模式(MipValueMode) = 导数(Derivative) 时才可用。
DDY(UV)(DDY(UVs)) 接收UV输入的DDY以用于各向异性过滤,这与DDX(UV)接收UV输入的DDX相同。
输出  
RGB 输出颜色的三通道RGB矢量值。
R 输出颜色的红色通道。
G 输出颜色的绿色通道。
B 输出颜色的蓝色通道。
A 输出颜色的alpha通道。如果纹理未包含alpha通道,那么将"alpha"通道连接到任何内容(虽然在技术上不合法)的结果将始终为零(黑色)。

选择 节点 TexTureSample -细节面板-材质表达式纹理base-纹理-T_Perlin_Noise_M [来自新手包] image

Alpha 需要

打开 纹理 T_Perlin_Noise_M 默认情况下,该纹理三个通道显示在一起。 image

红色 R通道 image

绿色 G通道 image

蓝色 B通道 image

在这个纹理中,你可以看到三个通道的值,都是一样的,因为图案都是一样的。 所以Alpha使用R或G或B,都有相同的结果。 使用红色通道。可以看到立方体表面变得粗糙。 image image

有些地方完全粗糙,有些地方则是完全反射的。有些地方适中。

如果你把我们的GB一起插入阿尔法,这也是可行的。 尽管这个插座正在寻找一个单一的浮点,但如果你把三个通道插入阿尔法插座、 引擎所做的就是自动为你丢弃多余的值。 所以在这里,你实际上只有一个值插入到alpha中。

UV

噪声纹理在驱动立方体表面的图案。 image

以某种方式扩大噪声、纹理或缩小噪声纹理的规模。

UV贴图:将2D图像投射到3D模型表面的过程。

image 字母U和V,它们表示2D纹理的轴。 U代表水平轴,而V代表垂直轴. 使用UV而不使用X和Y的唯一原因是我们已经在三维空间中使用了它们。 我们在三维空间中用X、Y和Z来表示这三个不同的轴,以便更好地区分它们。

TexCoord 0 纹理坐标 0/ TextureCoordinate 纹理坐标

https://docs.unrealengine.com/5.3/zh-CN/coordinates-material-expressions-in-unreal-engine/

TextureCoordinate(纹理坐标)表达式以双通道向量值形式输出 UV 纹理坐标,从而允许材质使用不同的 UV 通道、指定平铺以及以其他方式对网格的 UV 执行操作。

项目 说明
属性  
坐标索引(Coordinate Index) 指定要使用的 UV 通道。
U 平铺(UTiling) 指定 U 方向上的平铺量。
V 平铺(VTiling) 指定 V 方向上的平铺量。
撤销镜像 U(Un Mirror U) 如果为 true,那么撤销 U 方向上的所有镜像。
撤销镜像 V(Un Mirror V) 如果为 true,那么撤销 V 方向上的所有镜像。

用法示例: 如需访问网格体的第二个 UV 通道,请创建一个 TextureCoordinate(纹理坐标)节点,将其"坐标索引"(CoordinateIndex)设置为 1(0 表示第一个通道,1 表示第二个通道,等等),并将其连接到 TextureSample(纹理取样)节点的 UV 输入。 image

TexCoord 控制U和V的平铺的次数。默认都为1。 UV数据类型:TexCoord[0] / TextureCoordinate image 平铺越多,单个图片越小。 image

使用 Multiply 调整参数的大小

M+左键 image image

分量遮罩 Component Mask

精确控制UV。 通过使用分量遮罩对U和V进行单独控制。

定义

https://docs.unrealengine.com/5.3/zh-CN/material-data-manipulation-and-arithmetic-in-unreal-engine/

分量遮罩(Component Mask) 材质表达式的作用与上文所述的"附加(Append)"节点刚好相反。 ComponentMask不是对数据进行组合,而是提供一种将数据分成其组成部分或通道的方法。

分量遮罩(Component Mask)的功能类似于"门"。 对于连接到输入端的任何数据,都可以准确选择允许哪些通道到达输出端。 下图显示了一个Constant4Vector向量,其中包含值(0, 1, 0.7, 0.5)。 在图表中选择"遮罩(Mask)"节点时,"细节(Details)"面板中会显示四个复选框。

image

这些复选框确定节点将输出哪些通道。目前没有勾选,所以"遮罩(Mask)"节点不会输出任何信息。 如果尝试将该节点插入下游的输入端,则会显示错误。

image

通过这些复选框可以过滤信息,仅使用需要的通道。

假设需要使用 A通道 中的值来控制材质的不透明度, 则可以通过选中相应的复选框来启用A通道,然后将"遮罩(Mask)"的输出引脚连接到 不透明度输入(Opacity Input)。

image

ComponentMask会丢弃未选中的R、G和B通道,仅输出A通道中的值,在本例中该值为0.5。

对U和V单独进行控制

image 从分量遮罩中出来的东西真的取决于你插入的是什么。 如果你插入的是纹理,坐标值,那么从这里出来的结果将是UV. 如果你插入的是一个纹理样本RGB,那出来的结果将是红色通道、绿色通道和蓝色通道。 所以对于Component Mask来说,这些名字其实是可以互换的。 有时是U和V,有时是红色通道和绿色通道。 image

第一个 mask使用 R通道 image 第一个 mask使用 G通道 image

Append 合并U和V

https://docs.unrealengine.com/5.3/zh-CN/material-data-manipulation-and-arithmetic-in-unreal-engine/

AppendVector

AppendVector材质表达式将 输入A 中的数据与 输入B* 中的数据进行组合,并输出一个多通道向量(float2、float3或float4)。 在此示例中,两个常量附加在一起输出一个float2向量:(1, 2)**.

image

用法示例 如果你希望能够独立修改两个值但需要将它们传递到需要多通道数据的输入中,通常可以使用"附加(Append)"节点。如下图所示,美术师可采用一种方法控制材质实例中纹理的平铺(Tiling)或 UV缩放,但只能统一进行控制。

image

此示例的缺点是材质图表只包含一个参数,但UV坐标有两个通道。 使用此解决方案无法独立控制纹理的宽度和高度。

使用 AppendVector 便可以解决这个问题。为每个轴创建一个单独的标量参数,然后将它们传递到"附加(Append)"节点中。 "Append(附加)"节点将这两个参数组合成一个float2向量,然后乘以纹理坐标。

image

由于 平铺X(Tiling X) 和 平铺Y(Tiling Y) 是不同的参数,因此现在可以独立控制纹理的宽度和高度。

附加顺序 AppendVector表达式按照数据附加到节点的顺序对数据进行组合。输入B中的数据始终附加到输入A中数据的末尾。请参考下面的两幅图像。 image

在第一张幻灯片中,附加的结果为 (0.05, 0.2, 0.8),即节点预览显示的浅蓝色。

在第二张幻灯片中,附加的结果为 (0.8, 0.05, 0.2),即节点预览显示的粉色。

AppendMany

AppendMany 是一个材质函数,其功能与AppendVector表达式相同,但最多可以将四个单独的浮点/标量值组合成一个多通道向量。

image

AppendMany函数的另一个好处是它提供了三个不同的输出引脚。 因此,你可以根据具体情况下的需求,访问部分或全部附加通道。

AppendMany节点在其输入端仅接受浮点/标量值。如果将float2、float3或float4向量传递到AppendMany节点中,则除第一个值之外的所有值都将被丢弃。

合并U和V

image image

最终效果 image

导入纹理 Import A Texture

image

移动的箭头 纹理

7 1 Arrow 导入png图片为纹理 纹理 T_Arrow image

操作UV让你的纹理运动起来 Make Your Texture Move

新建材质 M_MovingArrow 打开 M_MovingArrow 添加纹理节点 TextureSample.为纹理选择 T_Arrow image

TextureSample RGB输出到 基础颜色 image image image

将黑色背景改为透明。

选择 主节点 M_MovingArrow-细节面板-材质-混合模式-半透明 image 此时主节点 不透明度 插槽可用 image

T_Arrow纹理由白色和黑色数值组成,箭头为白色1。其他为黑色0。黑色0对应不透明度0,即全透明。使用其任意通道即可。 将 TextureSample R通道输出给 主节点 不透明度 插槽。 image

添加 平面物体,分配材质 M_MovingArrow。

image

全局位置偏移

虚幻中的UV 随时间,增加U坐标值,使箭头水平移动。 image

添加 时间 Time 节点 [材料动画必须,输出随时间不断增加的值] image 添加速度常量 ,乘以时间获取移动距离。 距离添加到 TexCoord 节点,使材质移动。 箭头向左上移动。U,V都在移动。 image

使用 分量遮罩 Component Mask 拆分 UV,只移动,增加【R通道】U轴移动距离,U轴速度为-0.1. V轴为G通道。 此时箭头向右移动。 image image image

平移节点 Panner

https://docs.unrealengine.com/5.3/zh-CN/animating-uv-coordinates-in-unreal-engine/

可以通过在控制板中搜索 Panner 或使用右键单击上下文菜单,Panner材质表达式(Panner Material Expression)添加到材质图表。 还可以按住 P 键并左键单击材质图表中的任意位置,在鼠标指针处插入一个Panner。 Panner材质表达式接受两个输入:坐标(Coordinates)时间(Time) image

属性 说明
坐标(Coordinate) 接收可以通过表达式来修改的基本 UV 纹理坐标。
时间(Time) 接收用来确定当前平移位置的值。这通常是用来提供常量平移效果的时间表达式,但是,也可以使用常量或标量参数来设置特定偏移,或者通过蓝图来控制平移。

image

属性 说明
速度 X(Speed X) 纹理坐标沿水平或 X 轴方向移动的速度。
速度 Y(Speed Y) 纹理坐标沿垂直或 Y 轴方向移动的速度。
常量坐标(Const Coordinate) 仅在未连接坐标的情况下使用。
小数部分(Fractional Part) 仅输出平移计算结果的小数部分,以提高精度。输出将大于或等于 0 并且小于 1。

更容易的移动纹理

image

选中 平移节点-细节面板-材质表达式偏移-速度X--0.5 [U方向向右移动]

coordinate 插槽:控制平铺的方式

添加 TexCoord 节点,U平铺2,V平铺3.输出到 Panner - coordinate 插槽,将在水平平铺2次,竖直平铺3次。 image image

Time 插槽:控制时间速度

2倍时间流速 image

材质实例 Material Instance

更快的修改材质属性。

M_MovingArrow 材质-右键-创建材质实例 MI_MovingArrow

image image

为 平面物体选择 MI_MovingArrow 材质 image

材质实例可以将属性值公开给编辑器

打开 M_MovingArrow 材质。

将速度属性公开: 速度节点-右键-转换为参数 image 重命名为 MovingSpeed image

打开 MI_MovingArrow ,MovingSpeed 出现在细节面板-参数组 image 启用MovingSpeed后可修改 image

其他参数

平铺参数 UV Tile image

MI_MovingArrow image

参数快捷键 S + 左键

M_DirtyPlatform ,MI_DirtyPlatform

新建材质 M_DirtyPlatform,材质实例 MI_DirtyPlatform

M_DirtyPlatform image image

MI_DirtyPlatform image

写注释 Writing Comments

选择节点 + C键 image

选择 注释,细节面板-材质表达式注释-字体大小 可控制字体 image

创建火材质 Create A Fire Material

image

新建材质 M_FireBall

添加 纹理节点 Texture Sample

打开 材质 M_FireBall Texture Sample -材质表达式纹理Base-纹理-T_Fire_Tiled_D

将 Texture Sample 纹理输出到主材质-基础颜色 image

关卡 添加 球体网格,使用材质 M_FireBall

image

让火材质水平移动

添加 panner 节点,用以移动UV.

panner 节点-材质表达式偏移-速度X-0.1 这使火球材质水平移动

image

使火球发光

将 Texture Sample 纹理 -RGB 输出到主材质 -自发光颜色 节点 image

让火材质竖直方向也移动

添加 panner 节点,Texture Sample 纹理节点。

Texture Sample -材质表达式纹理Base-纹理-T_Fire_Tiled_D。 panner 节点-材质表达式偏移-速度Y-0.2

image

合并 Texture Sample 纹理节点的RGB / 使用 Multiply 合并颜色 RGB

添加 Multiply 节点 【M+左键】 接收 2个 Texture Sample 纹理节点的RGB输出。 Multiply输出给主材质-基础颜色。 image

增加材质亮度 即 RGB的值

添加 Multiply 节点,分别增加材质的基础颜色,自发光颜色RGB值。

基础颜色亮度 image image image

优化 平移节点 panner 时间速度,移动速度。U方向

添加 TexCoord 0 纹理坐标 0 .控制 平移节点 panner 的 坐标(Coordinate). image

添加Time 控制火的时间流速 平移节点 panner 的 Time.

image

分别控制U,V方向的移动速度 平移节点 panner 的 Speed. 当前只控制U,U=0.2 ,V=0. image

同理 ,优化 平移节点 panner 时间速度,移动速度。V方向

Time保持默认。 优化 坐标速度和移动速度。 image image

正弦 sine 使火材质闪烁 /周期性变化亮度

image

正弦节点 sine

sine 需要参数 time 时间 image

正弦节点 sine 输出 浮点 -1 至 1 。 image

材质图避免使用负值,导致异常。

使用 saturate 节点限制 sine值为 1至0之间。

https://docs.unrealengine.com/5.3/zh-CN/math-material-expressions-in-unreal-engine/

Saturate Saturate 节点将值限定在0与1之间。小于0的值被提升到0;大于1的值降低为1;0到1之间(包括0和1在内)的值保持不变。在大多数现代图形硬件上,Saturate的指令成本几乎是免费的,所以您可以在任何时候使用该节点来将输入或输出值限制在0到1之间,而不影响您的材质的性能。

image

使用示例: 该节点可用于将输出或输入值限制在0和1之间。

image

正弦控制火球亮度 0-1

控制火球自发光颜色亮度 image

同时控制火球基础颜色亮度 image

由于颜色最低为0,此时火球闪烁会变黑

将变量参数公开/转换为参数

image

操纵正弦 Manipulate Sine

修改正弦波的值,防止材质变黑

image

使用 线性插值 Lerp 节点,限制sine 的输出值.使其在 0.5 至 1 之间。

image

Lerp输出给基础颜色和基础自发光颜色 image

此时火球不会变黑。

SIne_Remapped

SIne_Remapped 等同于以上节点之和。 image Value 1 :同 Lerp A. Value 2 :同 Lerp B. sine phase:接受 Time 时间参数 输出限制后的浮点。

使用 SIne_Remapped 替代以上sine相关节点【类似正弦Lerp,但不会限制负数】 image 公开参数 image

最终材质图

image image

创造一块漂浮的岩石 Create A Floating Rock

use world position offset to drive mesh 使用全局位置偏移驱动网格体

使用新手包-SM_Rock 岩石 image

新建材质 M_MyRock 添加纹理节点 TextureSample,使用纹理 T_Rock_Basalt_D,用于基础颜色 image

SM_Rock 岩石 使用材质 M_MyRock

法线normal

法线可以伪造细节,存在于纹理,计算光线如何反射。

添加纹理节点 TextureSample,使用法线normal纹理 T_Rock_Basalt_N,用于主材质的-Normal image

岩石将立体化 image

world position offset 全局位置偏移

数据类型:constant3Vector/3 float image

B通道改为10,将使球体在Z方向上升10cm。

image

使用 SIne_Remapped 周期性改变world position offset 的 Z值,使其悬浮。

删除 3 float 。 添加 SIne_Remapped 节点 添加 1 float 表示上升最低点 30 添加 1 float 表示上升最低点 100 为 SIne_Remapped 输出的 1 float ,合并一个 2 float,形成 3 float 赋值给 world position offset 。 image

此时 物体将上下浮动。

为时间添加参数 FloatSpeed 控制f浮动速度。 image

使用2个正弦波使浮动随机

image 为 SIne_Remapped 的 sine phase [时间]节点使用2个正弦波。 一个原时间,一个调整速度后的时间。合并。 image

更多修改方法 image

创建溶解材质 Create A Dissolve Material

使用噪声 noise textures 材质 改变半透明度。 image

混合模式-半透明

新建材质 M_Dissolve 主材质-细节面板-材质-混合模式-半透明 image

噪声纹理

添加纹理节点 TextureSample,使用纹理 T_Perlin_Noise_M,将 R 通道用于-不透明度 3个通道都可以,因为值都一样。 噪声纹理的黑色部分为0,使物体完全透明。白色部分为1,是物体完全显示。灰色适中。 image

CheapContrast(低成本对比度)

https://docs.unrealengine.com/5.3/zh-CN/image-adjustment-material-functions-in-unreal-engine/

白色更白,黑色更黑。

CheapContrast(低成本对比度)函数通过将直方图的高端重新映射到低端值,并将直方图的低端重新映射到高端值,提升输入的对比度。 这类似于在 Photoshop 中应用色阶调整,以及将黑色和白色标志拉入到一个位中。用户可控制提升对比度的程度。

项目 说明
输入  
输入(标量)(In (Scalar)) 要提升对比度的通道或者黑白图像。
对比度(标量)(Contrast (Scalar)) 要提升对比度的程度。默认值为 0,这表示不更改。

此函数接收标量值而非 RGB,这意味着它特别适合于黑白图像或单一通道。要提升全色图像的对比度,请使用 CheapContrast_RGB(低成本对比度_RGB)。

image

提升噪声纹理的对比度,使半透明边缘更清晰。

0为原对比对。改为1.

image image

控制纹理/控制半透明度

噪声纹理的值在 0-1之间

噪声纹理+1,则使其全白,不透明度为1,物体全部显示。 添加 add 节点-右键节点-开始预览节点。 可以预览当前节点的效果 image image

噪声纹理-1,则使其全黑,不透明度为1,物体全部不显示。 image

SIne_Remapped 控制噪声纹理/不透明度

随时间输出 -1 到1的正弦值。 image image 这将完成溶解效果。

限制 纹理输出 在 0-1 之间

此时 SIne_Remapped 输出的 -1 至 1 ,加上噪声纹理的值 -1 至 1,结果为 -2 至 2.超出了 0-1. 使用 saturate 限制纹理的最终输出为 0-1.

image

为溶解边缘添加光晕 Add Glow To Edges

使用噪声纹理

自发光颜色 节点

添加紫色到自发光颜色-物体将变为紫色。 image

控制发光强度 到10

image

image

只为噪声边缘添加自发光,非基础颜色。

原理示例

image 添加 纹理节点 Texture Sample -纹理-LowResBlurredNoise 像素较低,非常模糊 image

复制添加 纹理节点 Texture Sample -纹理-T_Perlin_Noise_M 【主材质使用的溶解纹理】 将 纹理 T_Perlin_Noise_M 的UV值输出到 纹理 LowResBlurredNoise image

提取溶解区域

提高对比度,并使用主材质不透明度 image

缓存不透明度 OpacityMask 为 添加命名重路由声明节点 【name reroute node】

image image

使用命名重路由 OpacityMask 用于遮住不需要显示的部分

image

image

添加命名重路由声明节点 GlowEdge image

在基础颜色之上溶解

image

OneMinus 1-节点 反转 GlowEdge 形成溶解边缘

image image

增强溶解亮度

image

完整材质图

image

与平台互动 Interact With The Dirty Platform

新建actor蓝图 BP_MovingArrow

打开 BP_MovingArrow,添加立方体组件,调整大小。 image 使用材质 MI_DirtyPlatform

添加 平面组件 image 使用材质 MI_MovingArrow

添加 boxCollision 组件 image

image

使用 重叠事件,触发 发射函数 launch character

打开 BP_MovingArrow ,选择组件 boxCollision. 打开事件图表 添加事件-组件开始重叠时 image image

launch character 时角色类特有函数

添加变量 Speed,编译后才可设置默认值。 image 值为1000 image

添加 arrow 箭头组件 用于获取朝向 image

将踏上物体的角色向前方发射

获取向前朝向 get forward vector image

将踏上物体的角色向上空发射

获取向前朝向 get up vector image

与溶解材质物体互动 Interact With The Dissolve Mateiral

打开 材质 M_Dissolve 添加变量 DIssolveAmount 手动控制溶解量,断开原节点 image

新建材质实例 MI_Dissolve 修改变量 DissolveAmount 手动控制溶解量 image image

新建actor蓝图类 BP_DissolveCube

打开 BP_DissolveCube 添加立方体组件,使用材质 MI_Dissolve,MI_Dissolve溶解值设为1不溶解。 添加boxCollision组件,移动到立方体外侧

image

选择组件 boxCollision,添加重叠事件 获取第三人称角色

image

创建并获取动态材质实例

之前使用的均为静态材质实例,无法在运行时更改材质参数。 需使用 动态材质实例,这只在运行时存在,可以在运行时更改材质参数。

创建动态材质实例

create dynamic material instance image 动态材质实例-parent-选择 MI_Dissolve

image 选择 create dynamic material instance 输出节点【输出材质实例】-右键-提升为变量 CreatedDissolveMaterialInstance image

CreatedDissolveMaterialInstance 存储创建的动态材质实例 类型为 材质动态实例 image image

为立方体组件设置材质

image

设置材质实例的溶解参数 DissolveAmount

拖出获取变量CreatedDissolveMaterialInstance,连接 set scalar parameter value 。 set scalar parameter value 参数名 parameter name 填写 DissolveAmount image

add timeline 时间轴

使用时间轴改变参数 image 双击打开时间轴 DissolveTimeline image

添加浮点型轨道 image

右键-添加关键帧到时间轴 image 时间:0 值:0.7 image

右键-添加第二个关键帧到时间轴 时间:1.2 值:-0.6

缩放窗口,到显示2个关键帧。 image

选择2个关键帧,按1键使曲线平滑 image

重命名轨道为 DissolveTrack

打开事件图表,将时间轴 DissolveTrack 输出给 材质参数value image

完整事件图

image

离开物体时恢复材质

选择组件 box collision -添加事件 z组件结束重叠时 image

时间轴具由反向执行功能 Reverse 为重叠结束事件 连接角色节点-再连接到 时间轴 反向执行功能 Reverse 即可恢复物体材质,将参数倒转。

image

完整事件图

image

WangShuXian6 commented 10 months ago

2 -创建主材质 Create A Master Material

概述 Create A Master Material Section Overview

主材质:控制它的 UV、基色、金属、镜面粗糙度、法线和环境光遮挡。

基于物理的材质

基于物理的材质主要输入及其最佳使用方法的概述。 https://docs.unrealengine.com/5.3/zh-CN/physically-based-materials-in-unreal-engine/

基于物理的渲染(Physically based rendering) (PBR)

基于物理的渲染(Physically based rendering) (PBR)意味着表面接近光线在真实世界的表现方式,而不是我们直观以为的应有方式。 相较于完全依赖美术师直觉来设置参数的着色工作流程,遵守PBR原则的材质更准确,并且通常看起来更自然。

基于物理的材质在所有光照环境中都能有同等程度的良好表现。 此外,材质值的复杂程度和相互依赖程度可以降低,这样材质创建工作流程对于用户更加友好。 这些优点甚至适用于非真实感渲染,正如Pixar [4]和Disney [3]的电影中所展现的那样。

PBR材质属性

这些是与虚幻材质的基于物理的方面直接相关的材质属性。

基础颜色

粗糙度

金属感

高光度

所有这些输入都设计为接受0到1之间的值。对于基础颜色,这意味着RGB值在0到1之间的颜色或纹理取样。

基于物理的值可以根据真实世界材质进行测量。下面给出了一些示例。

基础颜色

基础颜色定义了材质的总体颜色。 "基础颜色"输入接受 Vector3 (RGB) 值,其中每个通道自动限制在0到1之间。 image 如果取自真实世界,这是使用极化筛选器(极化会删除对齐时非金属的高光度)拍照时的颜色。

为非金属测量的基础颜色值(仅限强度):

材质 基础颜色强度
木炭 0.02
新沥青 0.02
旧沥青 0.08
裸土 0.13
青草 0.21
沙漠沙 0.36
新混凝土 0.51
海洋冰 0.56
新雪 0.81

为金属测量的基础颜色:

材质 基础颜色(R, G, B)
(0.560, 0.570, 0.580)
(0.972, 0.960, 0.915)
(0.913, 0.921, 0.925)
(1.000, 0.766, 0.336)
(0.955, 0.637, 0.538)
(0.550, 0.556, 0.554)
(0.660, 0.609, 0.526)
(0.542, 0.497, 0.449)
(0.662, 0.655, 0.634)
(0.672, 0.637, 0.585)

粗糙度

"粗糙度"输入控制了材质表面有多粗糙或光滑。 在材质中,这表现为反射在材质上看起来有多尖锐或模糊。

粗糙材质会沿比光滑材质更多的方向反射光线,这样产生的是漫反射,有时很细微。光滑表面会更均匀地反射光线,这样产生的是清晰、集中的反射或镜面高光。

粗糙度为0(光滑)会产生镜面反射。

粗糙度为1(粗糙)会产生漫反射或无光泽的表面。 image image 0到1之间的粗糙度值。顶部为非金属,底部为金属。 image

映射粗糙度

粗糙度经常在使用灰阶纹理的对象上映射,以向表面添加物理变体。 粗糙度贴图上的深色区域在材质上看起来像镜子,而浅色区域则比较粗糙,看起来反射度较低。

下面的视频显示了粗糙度值从0增加到1的过程,其中perlin纹理控制着 浅色(粗糙) 和 深色(光滑) 值的分布。在值为0时,材质预览完全像镜子。在值为1时,材质完全无光泽。 中间值更有意思,因为表面的一些部分看起来光滑,一些部分看起来粗糙。 粗糙度贴图经常用于向塑料和金属等材质添加凌乱、污迹或其他瑕疵。

粗糙度与高光度

请务必理解粗糙度与高光度之间的相互影响,尤其是当你在采用PBR工作流程之前在虚幻引擎中工作时。

高光度(Specularity) 指的是表面反射的高光(specular light)量。 此值是材质类型所固有的,通常默认值0.5是准确的。"高光度"输入 不用于反射/高光度贴图 或添加表面变体。 这些应该在"粗糙度"贴图中进行处理。

金属感

"金属感"输入接受0到1之间的值,并定义你的材质是作为金属还是非金属表现。

在大多数情况下,你应该将"金属感"视为虚幻引擎中的二进制属性。 对于纯表面(例如纯金属、纯岩石、纯塑料,等等),你应该将"金属感"设置为 0或1,而不是中间值。创建被腐蚀、有灰尘或生锈的金属之类的混合表面时,你可能发现你需要0到1之间的某个值。

非金属 的"金属感"值为0。这是默认值。

金属 的"金属感"值为1。

0到1的"金属感"值。 image

你可能起初不愿意将材质设置为完全的金属感。除非你有充足理由,否则尽量不要使用小数值。

此示例展示了当"粗糙度"相对较低的材质上"金属感"从0增加到1时,表面如何变化。 image

映射金属感

相同材质中往往金属和非金属都有。 假设一个金属面板,其中油漆涂层覆盖了部分或全部金属。

油漆是非金属,因此在油漆覆盖的所有区域中,"金属感"值应该为0。 在面板中看得到金属的所有地方,"金属感"值应该为1。

这应该使用传递到"金属感"输入的黑白遮罩进行处理。 油漆没有与金属混合,而是位于其上方。 你的"金属感"贴图不应包含中间灰阶值,只能包含黑色和白色。 你还可以使用材质层实现类似结果。

高光度

"高光度"输入接受0到1之间的值,并控制表面反射多少高光。

"高光度"值为0表示完全不反射。

"高光度"值为1表示完全反射。

虚幻引擎使用 默认高光度0.5 ,这表示大约4%的高光度反射。 对于绝大多数材质,此值是准确的。

对于漫反射程度很高的材质,你可能倾向于将此值设置为0。别这样做!所有材质多有高光度,请参阅此帖子以了解示例[5]。制作漫反射程度很高的材质的正确方法是使用很高的"粗糙度"值。

空腔贴图

修改"高光度"的一个原因是添加微型遮蔽区或小尺度阴影,比如从法线贴图中表示的裂口添加。这些有时被称为空腔。 小尺度的几何体(尤其是仅存在于高精度多边形中并烘焙到法线贴图中的细节)不会被渲染器的实时阴影选取。

要捕获此阴影,你可以生成空腔贴图,它通常是追踪距离非常短的AO贴图。这会乘以输出之前的最终"基础颜色",并乘以0.5("高光度"默认值)作为"高光度"输出。

确切地说,就是:基础颜色=空腔旧基础颜色,高光度=空腔0.5。

在高级用途中,这一步可以用于控制折射率(IOR)。我们发现这对于99%的材质都不是必需的。下面是基于测量的IOR的"高光度"值。

测量的"高光度"值:

材质 高光度
玻璃 0.5
塑料 0.5
石英 0.570
0.224
0.255
0.277
皮肤 0.35

image

测量的材质示例。顶部:木炭、新混凝土、旧沥青。底部:铜、铁、金、铝、银、镍、钛 image

主材质简介 Intro To Master Material

主材质的想法是项目中只有一个相同类型的材质。

基于此材质,有多个材质实例。

只需为新创建的材质实例使用材质实例,而不是一个接一个地创建。

image 不仅可以节省空间和时间,还可以提高场景性能。

纹理文件

castle_brick_02_red_ao_2k castle_brick_02_red_ao_2k

castle_brick_02_red_arm_2k castle_brick_02_red_arm_2k

castle_brick_02_red_diff_2k castle_brick_02_red_diff_2k

castle_brick_02_red_disp_2k castle_brick_02_red_disp_2k

castle_brick_02_red_nor_dx_2k castle_brick_02_red_nor_dx_2k

castle_brick_02_red_nor_gl_2k castle_brick_02_red_nor_gl_2k

castle_brick_02_red_rough_2k castle_brick_02_red_rough_2k

image

完整的UV控制 Full UV Control

颜色贴图 diff/Diffuse 漫反射 纹理 castle_brick_02_red_diff_2k

image

diff/Diffuse 漫反射 : 颜色贴图主要为Diffuse 漫反射、Albedo 反射率、Base Color基础颜色 三种。一般认为这三者是等同的。

新建材质 M_Master

添加 Texture Sample 纹理节点,分配纹理 Diffuse 漫反射 castle_brick_02_red_diff_2k。 Texture Sample -RGB 输出至 主材质 基础颜色

image

基于 M_Master 新建材质实例 MI_Master

为关卡地板使用材质 MI_Master。

image

ScalarParameter 标量参数

快捷键:S+左键 https://docs.unrealengine.com/5.1/zh-CN/material-parameter-expressions-in-unreal-engine/ ScalarParameter(标量参数)表达式输出单个浮点值 (Constant(常量)),这个值可在材质实例中访问和更改,或者由代码快速访问和更改。

项目 说明
属性  
参数名称(Parameter Name) 指定用于在材质实例和代码中识别参数的名称。
组(Group) 提供在一个MaterialInstanceConstant内按组或目录组织参数名称的方法。一个材质中所有拥有同一个组属性名称的参数都会被列在实例的该目录下。
默认值(Default Value) 指定常量采用的初始值。

image

控制砖墙材质 纹理坐标 TexCoord的UV平铺

打开 M_Master 添加节点 纹理坐标 TexCoord 0 添加节点 标量参数 ScalarParameter ,参数名 重命名为 UV TIle 添加节点 Multiple image

打开 MI_Master ,调节 UV TIle 控制地板平铺 image

单独控制 纹理坐标 TexCoord的U和V

打开 M_Master 添加 分量遮罩 Component Mask 节点,分别遮罩 R,G通道

添加 Append 合并UV坐标 image

使用 Constant4Vector(常量 4 矢量)精简统一参数节点,分别控制纹理坐标 TexCoord的 U,V

添加节点 Constant4Vector(常量 4 矢量),转换为参数 :Advance UV Control

重命名 Constant4Vector 节点的 RGBA 4个通道 U Tile V Tile image image

使用 Constant4Vector 分别控制纹理坐标 TexCoord的 U,V image

分别遮罩纹理坐标 TexCoord的U,V控制水平和竖直偏移 [旧版]

使用Add节点控制偏移

image

image

分别遮罩纹理坐标 TexCoord的U,V,控制水平和竖直偏移 [新版]

重命名 Constant4Vector 节点的 RGBA 4个通道,分别控制 纹理坐标 TexCoord的U,V平铺,U,V偏移 U Tile V Tile U Offset V Offset image image image

静态开关参数 节点 Static Switch Parameter

使用切换节点分支,统一控制纹理坐标 TexCoord的UV https://docs.unrealengine.com/5.1/zh-CN/material-parameter-expressions-in-unreal-engine/#staticswitchparameter StaticSwitchParameter(静态开关参数)表达式接收两个输入,并且在参数值为 true 时输出第一个输入的值,否则输出第二个输入的值。

此参数称为"静态"是因为它不可在运行时更改,而只能在材质实例编辑器中设置。静态开关是在编译时(而非运行时)进行应用。这意味着删除的材质分支决不会执行,因此静态开关在运行时实际上是自由的。另一方面,对于材质中 使用的 每一种静态参数组合(滥用静态参数组合可能会导致着色器激增),都必须通过编译来产生材质的新版本。请尽量减少材质中的静态参数数目以及实际使用的静态参数排列数。

项目 说明
属性  
参数名称(Parameter Name) 指定用于在材质实例和代码中识别参数的名称。
组(Group) 提供在一个MaterialInstanceConstant内按组或目录组织参数名称的方法。一个材质中所有拥有同一个组属性名称的参数都会被列在实例的该目录下。
默认值(Default Value) 如果为 true,那么输出将是第一个输入。否则,输出将是第二个输入。
扩展标题显示(Extended Caption Display) 如果为 true,那么表达式的标题栏将显示表达式的值。
输入  
A 接收具有任意数目通道的值。
B 接收具有任意数目通道的值。

用法示例:静态开关可用于除去材质的整个分支,而不会产生运行时成本。各个实例可具有不同的值,这使您能够建立模板化的着色器设置,而不会影响性能。

image

使用 静态开关参数 节点 Static Switch Parameter 添加分支,统一控制纹理参数

添加节点 Static Switch Parameter:AdvanceUV Control image 添加统一控制参数 UV Tile

image 统一控制纹理 image

单独控制纹理 image

使用缓存name整理节点\

独立控制参数缓存 image

合并统一控制参数缓存 优化了分支节点名称 image

image

完整控制基础颜色 Full Color Control

control the color output from the texture 控制纹理的颜色输出:亮度 brightness 、饱和度 saturation、对比度 contrast,色调 tint

image

使用 Constant(常量)乘以 颜色贴图纹理RGB 控制 亮度 Brightness

image image

去饱和度(Desaturation)

去饱和度(Desaturation) 表达式对其输入进行去饱和,即根据特定百分比将其输入的颜色转换为灰色阴影。

项目 说明
属性  
亮度系数(Luminance Factors) 指定每个通道对去饱和颜色的影响量。此属性用于控制,在去饱和之后,绿色比红色亮,而红色比蓝色亮。
输入  
小数(Fraction) 指定要应用于输入的去饱和量。此百分比的范围为0.0(完全原始颜色,不去饱和)到1.0(完全去饱和)。

image 程序员需知:定义去饱和颜色 D、输入颜色 I 和亮度系数 L。输出将为 O = (1 - 百分比)( D.dot( I )) + 百分比 I

使用 去饱和度(Desaturation)节点 控制颜色贴图纹理RGB 饱和度 Saturation

添加饱和度节点 Desaturation 乘以常量 Saturation,常量0表示原饱和度。1表示完全去包和。负值为过度饱和。 image image

使用 1- OneMinus 节点反转 Desaturation,使参数Saturation与饱和度成正比。更符合直觉。

1为原始饱和度 image image

Power

Power 表达式接收两个输入:基值(Base)和指数(Exp)。它将基值提高到指数的幂,并输出结果。换句话说,它返回 Base 乘以自身 Exp 次。

属性 说明
常量指数(Const Exponent) 接受指数值。仅在未使用指数输入时使用。
输入  
基数(Base) 接受底数值。
Exp 接受指数值。

示例:当底数为0.5且指数为2.0时,幂为0.25。

使用示例:如果您传递给Power的颜色在[0,1]范围内,Power可以作为一种对比度调整,其中非常亮的值会略微降低,但是较暗的值会急剧下降。

image

使用 Power 控制 颜色贴图纹理RGB 对比度 Contrast

亮的更亮,暗的更暗。 image image image

将 颜色贴图纹理RGB 乘以 RGB颜色[constant3Vector/3 float] 控制 色调 Tint

当您将多个纹理放入场景中时,您需要纠正它们的颜色以便它们与您的场景相匹配或者与整个心情的主题相匹配。 image image image

组织参数 Organize Paramaters

参数分组

将 texture sample 纹理贴图转换为参数 BaseColorTexture image 设置 BaseColorTexture- 细节面板-分组- 01-BaseColor image image

UV Tile : Global Control 分组

image

分组默认按首字母排序。

手动控制分组优先级。 UV Tile : 00-Global Control 分组 Saturation: 01-BaseColor Contrast: 01-BaseColor AdvanceUV Control Switch: 00-Global Control Advance UV Control: 00-Global Control

分组内排序优先级:

设置-细节面板-排序优先级 image

image

金属感控制 Metalic Control

控制金属感纹理

TextureSampleParameter2D(纹理取样参数 2D)

https://docs.unrealengine.com/5.2/zh-CN/material-parameter-expressions-in-unreal-engine/#texturesampleparameter2d

TextureSampleParameter2D(纹理取样参数 2D)表达式与 TextureSample(纹理取样)完全相同,只不过它是可在材质实例中以及通过代码来修改的参数。 image

项目 说明
属性  
参数名称(Parameter Name) 指定用于在材质实例和代码中识别参数的名称。
组(Group) 提供在一个MaterialInstanceConstant内按组或目录组织参数名称的方法。一个材质中所有拥有同一个组属性名称的参数都会被列在实例的该目录下。
纹理(Texture) 指定表达式所取样的纹理。
取样类型(Sampler Type) 此节点所要取样并输出的数据类型。
Mip 值模式(MipValueMode) 通过计算的默认硬件选择如何定制取样的mip等级或派生物。这会影响外观及性能的噪声值。
输入  
UVs 接收 UV 纹理坐标,以用于纹理。如果没有任何值输入到 UVs,那么将使用材质所应用于的网格的纹理坐标。
输出  
RGB 输出颜色的三通道 RGB 矢量值。
R 输出颜色的红色通道。
G 输出颜色的绿色通道。
B 输出颜色的蓝色通道。
A 输出颜色的alpha通道。如果纹理未包含alpha通道,那么将"alpha"通道连接到任何内容(虽然在技术上不合法)的结果将始终为零(黑色)。

金属感分支节点

数据类型 :Constant 所有属性都要使用相同的UV平铺/平移参数 Cached UV Input image

image image

控制高光度 Specular Control

默认0.5 范围 0-1

数据类型 :Constant image

限制高光度最大值为1

image image

image image

控制粗糙度 Roughness Control

image 需要UV参数 限制在0-1 image image image

粗糙度纹理使用 castle_brick_02_red_rough_2k image

纹理压缩设置 Texture Compression Settings

正确设置纹理压缩 https://docs.unrealengine.com/5.3/zh-CN/textures-in-unreal-engine/ https://docs.unrealengine.com/4.27/zh-CN/RenderingAndGraphics/Textures/TextureCompressionSettings/

纹理压缩格式:

Default 默认 Mormal Map 法线贴图 Masks SRGB

基础颜色-漫反射纹理 castle_brick_02_red_diff_2k

image 打开纹理

细节面板-压缩-无透明度压缩:

当纹理没有Alpha通道,或者不准备使用Alpha通道时,启用。 如果启用,纹理的Alpha通道在任何压缩纹理输出格式中将被强制为不透明。如果输出格式为未压缩RGBA,则不适用。 image 当前纹理没有Alpha通道,所以勾选。

细节面板-压缩-压缩设置

构建纹理时使用的压缩设置 image 基础颜色纹理-使用默认值

细节面板-纹理-sRGB

Texture及其源是否处于SRGB伽马颜色空间中。只能与8位和压缩格式一起使用。若将alpha通道单独用作遮罩,应撤销勾选此项。 基础颜色纹理:启用

粗糙度纹理 castle_brick_02_red_rough_2k

image 没有 Alpha通道 image

细节面板-压缩-无透明度压缩:启用

细节面板-压缩-压缩设置

粗糙度纹理:可以使用 默认值/遮罩(无sRGB)

如果使用默认值,则不能启用sRGB。 因为没有将其插入基础颜色插槽。 仅使用这些值确定表面粗糙度。 因为每个通道都只包含灰度值,即黑白值。这不是sRGB。

正确设置 纹理节点类型 Texture Sample Type

image image image

Texture Sample 纹理节点-细节面板-材质表达式纹理Base-采样器类型Sampler Type Color颜色 【真实颜色使用】 Linear Color 线性颜色【非真实颜色使用,不用做基础颜色,纹理不能启用sRGB】

各插槽使用的 Texture Sample 纹理节点-采样器类型

BaseColor 基础颜色:颜色 Metalic 金属感: 线性颜色 Roughness 粗糙度: 线性颜色

修复 Texture Sample 纹理节点的 预览变黑

image Metalic 金属感/Roughness 粗糙度: 线性颜色 时会变黑,这是由于默认材质使用了sRGB,与线性颜色冲突。 所以需要更换默认材质。更换为未启用sRGB的占位材质即可。例如black系列 image

法线 Normal

法线贴图可以伪造重要的物理细节,但不增加网格。 它是通过每个单独像素的法线或面向方向来完成的。这就是它被称为法线贴图的原因。 数据类型:constant3Vector/3 float

法线贴图纹理 castle_brick_02_red_nor_gl_2k

image 法线没有Alpha通道, 无透明度压缩:启用 压缩设置:法线贴图

打开 M_Master

添加 节点 TextureSampleParameter2D(纹理取样参数 2D) 名称:NormalTexture 细节面板-材质表达式纹理Base-采样器类型-法线 Param-非sRGB的法线normal占位材质 image

使用UV参数

法线贴图使用RGB通道存储的xyz位置信息constant3Vector/3 float。

image image

打开 MI_Master,法线贴图使用纹理 castle_brick_02_red_nor_dx_2k

image image image

使用 FlattenNormal 降低法线贴图强度

image

打开 M_Master image

image

两种法线格式 DIrectX / OpenGL

image 在虚幻引擎中,应当使用 DIrectX 格式法线贴图。 使用OpenGL法线会出现错误的阴影。必须修改材质。

OpenGL法线之所以出现错误的阴影,是因为其中Y轴被翻转了。【用于Unity引擎】 修复OpenGL法线贴图翻转的Y轴/G绿色通道 打开 OpenGL法线材质 castle_brick_02_red_nor_gl_2k 细节面板-高级-反转绿通道 image 翻转后两种格式材质相同。

Ambient Occlusion 环境光遮蔽 AO

https://docs.unrealengine.com/4.27/zh-CN/RenderingAndGraphics/PostProcessEffects/AmbientOcclusion/ 因遮蔽而造成的光源衰减近似值。 数据类型:constant/1 float

AO材质 castle_brick_02_red_ao_2k

image AO没有Alpha通道 无透明度压缩:启用 压缩设置:默认 sRGB:不启用 AO 的RGB3个通道,完全一样。也不用做基础颜色。所以不启用sRGB。

打开 M_Master

添加 节点 TextureSampleParameter2D(纹理取样参数 2D) 名称:AOTexture 细节面板-材质表达式纹理Base-采样器类型:线性颜色 AOTexture材质:castle_brick_02_red_ao_2k 使用UV参数

输出任意一个通道作为AO即可 image image image

通道打包 Channel Packing 【ARM/ORM材质】

材质 castle_brick_02_red_arm_2k

image R通道:AO G通道:粗糙度 B通道:金属感 默认0 Alpha:无

image

使用 Substance Designer 合并 AO,Roughness,Matalic 为 ARM/ORM材质

因为这三个材质均为 constant/1 float image

新建包-导入-位图-导入所有纹理 image

文件-新建-Substance图形-空模板 拖入 AO,Roughness,Matalic【如果有】 按空格-RGBA Merge AO连接R, Roughness连接G. 输出-输出节点 image

扳手图标-导出输出 image 导出输出即可

导入混合图到UE。 image

打开材质-细节面板-无透明度压缩:启用 【否则不显示材质】 压缩-压缩设置:遮罩(无sRGB)[因为将用作遮罩纹理]

完成打包材质。

解包通道 Channel Unpacking

新建材质 M_ChannelUnpackingTest 选择 纹理 castle_brick_02_red_diff_2k,castle_brick_02_red_nor_dx_2k 后,直接拖入材质编辑器,自动创建 相关的 Texture Sample 纹理节点. image

导入打包好的材质 image 直接使用R,G通道即可 R:环境光遮挡 G:粗糙度 image

image

在主材质中打包纹理到 2个通道 2Channel Packed Texture In Master Material

ORM 纹理

打开材质 M_Master

添加 节点 TextureSampleParameter2D(纹理取样参数 2D) 名称:ORM 细节面板-材质表达式纹理Base-采样器类型:线性颜色 ORM 材质:使用无sRGB的black占位图 使用UV参数 分组:07-ORMTexture

image

在主材质上使用 StaticSwitchParameter 来控制使用ORM或独立纹理 分组:00-Global Control image

image

置换贴图[移位贴图] Displacement

置换贴图:castle_brick_02_red_disp_2k image 置换贴图提供高度值, 需要对平面表面细分。

Displacement Map(置换贴图,也叫移位贴图)可以改变模型对象的几何形状,但要达到较好的置换效果需要提高模型本身的顶点数,通常结合曲面细分使用。因此在提供最真实的效果的同时也会大幅增加渲染性能的开销。

blender

blender-添加-网格-栅格

打开左下角栅格面板 image

增加足够的顶点: x向细分,y向细分 :300 尺寸:4M

右侧面板-添加修改器-置换 置换修改器 上 新建纹理-DisplaceTexture image DisplaceTexture使用castle_brick_02_red_disp_2k贴图纹理 image image

降低置换强度到 0.15 image image

添加修改器-平滑 防止网格尖刺

导出模型文件为 DisplaceBrick.fbx

导入值UE。 拖入关卡 image 使用材质 MI_Master image

基于 MI_Master 创建材质实例 MI_MasterWithDIsplace

DisplaceBrick.fbx 使用 MI_MasterWithDIsplace

打开 MI_MasterWithDIsplace 调整 UV Tile

image

MI_MasterWithDIsplace 具由高度细节。 MI_Master 只是一个平面。

创建项目模板 Create A Project Template

在任意项目中使用自己的预定义资产,代替资产迁移。

新建空白项目 MyBpTemplate image

打开带有自定义材质的项目 LearnMaterial 准备迁移材质

防止材质的纹理贴图被迁移

打开 材质 M_Master

选择 基础颜色纹理节点 BaseColorTexture image 将纹理替换为 DefaultTexture [引擎系统自带基础颜色占位纹理,带sRGB] image

选择 金属感 纹理节点 MetalicTexture 将纹理替换为 127grey [引擎系统自带线性颜色占位纹理,无sRGB] image

选择 粗糙度 纹理节点 RoughnessTexture 将纹理替换为 127grey [引擎系统自带线性颜色占位纹理,无sRGB] image

选择 法线 纹理节点 NormalTexture 将纹理替换为 T_Default_Normal [引擎系统自带法线占位纹理,无sRGB] image

选择 环境光遮挡 纹理节点 AOTexture 将纹理替换为 127grey [引擎系统自带线性颜色占位纹理,无sRGB] image

选择 打包AO,Roughness, Metalic 纹理节点 ORM 将纹理替换为 127grey [引擎系统自带线性颜色占位纹理,无sRGB] image

修复 材质实例MI_Master的纹理

迁移材质 M_Master

选择 M_Master-右键-zi'chan资产操作-迁移-确定-选择 新的模板项目的Content文件夹下 image image image 完成

模板项目可以看到材质 M_Master

image

安装模板项目到引擎

打开引擎模板目录 E:\UnrealEngine-5.3.2\Templates 新建文件夹 TP_MyBpTemplate

将模板项目MyBpTemplate的 文件 MyBpTemplate.uproject,Config 文件夹,Content文件夹拷贝至TP_MyBpTemplate。

将引擎 E:\UnrealEngine-5.3.2\Templates\TP_Blank\Config\TemplateDefs.ini配置文件 拷贝至TP_MyBpTemplate 的 E:\UnrealEngine-5.3.2\Templates\TP_MyBpTemplate\Config 目录下。

纯蓝图模板使用 TP_BlankBP文件夹。

修改该文件 TemplateDefs.ini

LocalizedDisplayNames=(Language="en", Text="MyBpTemplate")
LocalizedDisplayNames=(Language="zh-Hans", Text="我的蓝图模板")

LocalizedDescriptions=(Language="zh-Hans", Text="我的材质模板。")

源码版引擎-执行 GenerateProjectFiles.bat

完成。

使用材质模板

新建项目-游戏-我的蓝图模板 image

WangShuXian6 commented 10 months ago

创建场景 Create A Scene

规划场景 Planning A Scene

场景是什么样子的?

知道你所看到的会是什么样子

是一片森林。 是一座房子还是一座鬼屋? 是一片沙漠还是某种外星环境或赛博朋克?

三个主要的步骤:寻找参考图片,绘制出场景。资产分层。

image image

创建空白关卡

image 导入场景模型 材质-材质导入法-不创建材质 导入纹理-不启用 2.1 Geometry.zip image

全选导入的静态网格体-拖入关卡 image

照亮我们的场景 Lightning Our Scene

基础光照设置

image

定向光源 directional light

https://docs.unrealengine.com/5.3/zh-CN/directional-lights-in-unreal-engine/ 模拟太阳和月亮

定向光源 将模拟从无限远的源头处发出的光线。这意味着此光源投射出的阴影均为平行,因此适用于模拟太阳光。定向光源放置后,可对其 移动性 进行如下设置:

静态 ——(左图)即无法在游戏中改变光源。这是速度最快的渲染方法,可用于已烘焙的光照。

静止 ——(同见左图)即光源通过 Lightmass 只烘焙静态几何体的投影和反射光照。其他则为动态光源。此设置还允许光源在游戏中改变颜色和强度,但其并不会移动,且允许部分烘焙光照。

可移动 ——(左图)即为完全动态光源,可进行动态投影。这是最慢的渲染方法,但在游戏过程中拥有最高灵活性。

点光源

https://docs.unrealengine.com/5.3/zh-CN/point-lights-in-unreal-engine/ 点光源(Point Light) 的工作原理很像一个真实的灯泡,从灯泡的钨丝向四面八方发出光。然而,为了性能考虑,点光源被简化为从空间中的一个点均匀地向各个方向发射光。放置的点光源可以设置为三个移动设置之一:

静态(Static) - (如左图所示)它意味着,不能在游戏中更改光源。这是最快的渲染方法,并且允许烘焙的光照。

固定(Stationary) - (亦如左图所示)它意味着,光源将仅有自己的阴影和来自 全局光照(Lightmass) 烘焙的静态几何体的反射光照,所有其他光照都将为动态。该设置还允许光源在游戏中更改颜色和强度,但它不会移动且允许局部烘焙光照。

可移动(Moveable) - (如左图所示)这意味着光是完全动态的,并考虑到了动态阴影。从渲染的角度看这是最慢的,但顾及到了游戏进程中的最大灵活性。

矩形光源

https://docs.unrealengine.com/5.3/zh-CN/rectangular-area-lights-in-unreal-engine/

矩形光源(Rect Light) 从一个定义好宽度和高度的矩形平面向场景发出光线。您可以用它来模拟拥有矩形面积的任意类型光源,如电视或显示器屏幕、吊顶灯具或壁灯。 矩形光源的行为并非在所有情况下都与真实面积光源一样。请参阅下面有关移动性设置的讨论

天空光照

https://docs.unrealengine.com/5.3/zh-CN/sky-lights-in-unreal-engine/ 天空光照(Sky Light)捕获关卡的远处部分并将其作为光源应用于场景。这意味着,即使天空来自大气层、天空盒顶部的云层或者远山, 天空的外观及其光照/反射也会匹配。你还可以手动指定要使用的立方体贴图。

聚光源

https://docs.unrealengine.com/5.3/zh-CN/spot-lights-in-unreal-engine/

聚光源 从圆锥形中的单个点发出光照。使用者可通过两个圆锥形来塑造光源的形状:内圆锥角 和 外圆锥角。在内圆锥角中,光照将达到完整亮度。从内半径的范围进入外圆锥角的范围中时将发生衰减,形成一个半影,或在聚光源照明圆的周围形成柔化效果。光照的半径将定义圆锥的长度。简单而言,它的工作原理类似于手电筒或舞台照明灯。

和其他光源一样,聚光源可设为以下3种移动性设置中的一种:

静态(Static) ——(左图)即无法在游戏中改变光源。这是最快的渲染方法,可用于已烘焙的光照。

固定(Stationary) ——(同见左图)即光源通过Lightmass仅烘焙静态几何体的投影和反射光照。其他则为动态光源。此设置还会允许光源在游戏中改变颜色和强度,但其不会移动并允许部分烘焙光照。

可移动(Moveable) ——(左图)即为完全动态光源,可进行动态投影。这是最慢的渲染方法,但在游戏过程中拥有最高灵活性。

场景

image

拖入点光源

image

点光源-细节面板-使用色温 启用 点光源-细节面板-温度-降低到4100,【温暖橘色光】 image image

下载窗户window资产导入,分别放置到关卡窗户位置

image image

添加4个矩形光 放置在窗户位置

调整 矩形光-光源 -源宽度,源高度,与窗户一致 image image 矩形光-光源-使用色温 矩形光-光源-温度-3600 温暖橘色光 矩形光-光源-强度-3 cd image

关闭 自动曝光,使用手动曝光

此时 移动到墙角会自动曝光 image 移动到中心灯光会自动变量

后期处理体积

https://docs.unrealengine.com/5.2/zh-CN/post-process-effects-in-unreal-engine/ 后期处理效果(Post-processing effect)使美术师和设计师能够对影响颜色、色调映射、光照的属性和功能进行组合选择,从而定义场景的整体外观。要访问这些功能,可以将一种称为 后期处理体积(Post Process Volume) 的特殊类型的体积添加到关卡。可以放置多个体积来定义特定区域的外观,也可以将其设置为影响整个场景。

放置Actor-视觉效果-后期处理体积 添加 后期处理体积 image

image

后期处理体积-细节面板-镜头-exposure-计量模式[亮度计算法]-手动 image 默认效果只在体积内生效。故场景灯光无变化。

后期处理体积-细节面板-后期处理体积设置-无限范围(未指定)-启用 后期处理体积将影响整个关卡。 场景变黑。 image

image

后期处理体积-细节面板-镜头-exposure-曝光补偿-14 这将增加场景亮度 image image

此时移动到角落,场景曝光将保持不变。 image

自发光材质 Emissive Material

https://docs.unrealengine.com/5.3/zh-CN/using-the-emissive-material-input-in-unreal-engine/

use simple shapes as lights 使用简单的形状作为灯光

为窗户添加自发光平面

添加平面 image

新建材质 M_Emissive image image

基于 M_Emissive 创建材质实例 MI_Emissive

窗户平面使用材质实例 MI_Emissive image

调整窗户平面 MI_Emissive 颜色与场景一致 image image

下载长条灯罩light导入关卡 image 添加圆柱体制作灯管 灯管使用材质实例 MI_Emissive image 按G键,不显示选择场景的物体的轮廓。

在灯管下添加矩形灯光 image 矩形灯光-光源-衰减半径 -减小值555

image

使用色温 4100 image

材质混合 Material Blend

在UE内容浏览器中选择基础层材质实例,然后在Bridge中选择按顺序选择下载的3种材质(基础→中→上)。这将在内容浏览器目标中 BlendMaterials 目录创建 Blend 材质。

为墙壁材质混合多种材质

bridge-home-surface 下载材质 砖墙,混凝土,裂缝 image image image

在 内容-Megascans-Surfaces 目录下,过滤出材质实例 image

创建 混合材质

基础材质实例 砖墙基础颜色 image

金属材质实例 裂缝材质 image

混凝土材质实例 image

后选的材质会覆盖在先选的材质之上。

1-在 内容-Megascans-Surfaces 目录下选择基础材质实例

MI_Brick_Wall_wmknbhe_2K image

实际应按顺序选择3个材质实例,虚幻5.3.2依然存在bug,所以只能选择少于3个材质实例。

2-打开 bridge-local-megascans-依次选择 以上材质 :基础材质 ,裂缝材质,混凝土材质,-点击设置按钮

实际只需选择一个,虚幻5.3.2依然存在bug,所以随便选。

image image 材质名称改为:MI_WallBlend image 点击按钮 创建材质混合 这将在 内容-BlendMaterials 目录创建混合材质 MI_WallBlend image

image

修复混合材质实例

打开混合材质实例 MI_WallBlend image

按选择顺序修复 各layer 的纹理 相关纹理使用对应材质目录下的纹理即可。 材质不包含的纹理不需要替换。

使用混合材质

将 混合材质实例 MI_WallBlend 赋给 墙面 image

当前墙壁只显示一种材质-基础材质 砖墙。 且UV平铺需要调整。

顶点绘制 Vertex Painting

create meterial variation by ourselves 自己创造材质变化

使用 顶点绘制 Vertex Painting 显示3种材质。

默认只显示基础材质。

顶点绘制允许你把某些东西钉在顶点上。

进入 网格体绘制 模式

image

image

选择-选择 点击选取要绘制的网格体 [墙壁]

image

选择-绘制 可在之前选择的网格体上显示绘制笔刷提示,开始绘制

image image 这些绿点是曲面的顶点,可以快速告诉你这个曲面有多少个顶点。

切换到线框模式

渲染场景,显示笔刷线框 image

image image 这些表面有很多顶点,而且它们的密度比一般墙壁的要高很多。方便顶点绘制。

切换到光照模式

缩小笔刷尺寸 image

颜色绘制-通道 RGB红绿蓝3个通道分别对存了混合材质实例 MI_WallBlend的 3各layer Middle/Base/Top R 红色:Middle Layer G 绿色:Base Layer B 蓝色:Top Layer 勾选的通道对应的layer将被绘制或擦除。 image X键 切换绘制/擦除模式。

绘制颜色 -改为黑色 才可以将材质绘制到网格体。 点击后方交换图标即可切换为黑色。或按X键。 这将和擦除颜色调换。 image

调整 混合材质实例 MI_WallBlend

贴花 Decals

https://docs.unrealengine.com/5.3/zh-CN/using-decals-in-unreal-engine/

贴花作为材质实例,可以直接拖放到网格体上使用。 image image image image

对于不受场景的水材质影响的贴花,需要找到贴花的主材质,断开其中的粗糙度节点。

两个贴花叠加时,可以修改: 贴花-排序顺序 image

植被模式 Foliage Mode

https://docs.unrealengine.com/5.3/zh-CN/foliage-mode-in-unreal-engine/ image 植被模式(Foliage Mode) 允许你在经过筛选的Actor和几何体上批量绘制或擦除 静态网格体(Static Meshes) 或 Actor植被(Actor Foliage) 。借助此模式,你可以在大型户外场景中填充植被。 选择多种资产后绘制 image image

设置关卡序列 Set Up Level Sequence

关卡序列

添加关卡序列,命名为Shot1 image image

序列摄像机

添加 电影摄像机Actor 到关卡 电影摄像机Actor是具有专业电影摄像机功能的摄像机Actor image image 重命名为Shot1Camera image

将 电影摄像机 添加到关卡序列

关卡序列-轨道-Actor到Sequencer-选择相机 image image

2窗口

左上设置按钮-布局-选择两窗口 均为透视视角 image

左窗口-允许过场动画控制-取消 取消后,不允许过场动画(Sequencer)预览在这个视口中播放。 关卡序列的调整不会影响该窗口。 image

锁定摄像机视口

在右窗口,选择一个物体,点击关卡序列-相机切换-相机图标 shi'kou视口将锁定到选定物体前方。 image image

在左窗口移动电影摄像机,在右窗口预览电影摄像机视口。

过场动画视口

经调整后用于过场动画预览的视口布局。 右窗口使用过场动画视口。 image image 过场动画视口右上角可以设置脚本按钮 image 例如在屏幕上添加3*3网格 image

摄像机移动 Camera Movement

在关卡序列中创建动画

设置相机

光圈 Aperture 焦距 Focal Length 对焦距离 Foucs Distance image

光圈 Aperture 影响曝光 焦距 Focal Length 影响镜头可视范围,能容纳的物体 对焦距离 Foucs Distance 可以创造景深效果

更多设置 image

选择对焦物体手动对焦

细节面板-当前摄像机设置-焦距设置-聚焦方法-手动 细节面板-当前摄像机设置-焦距设置-手动聚焦距离-吸管吸取物体 image

显示焦点

细节面板-当前摄像机设置-焦距设置-绘制调试聚焦平面 image image

快速移动电影摄像机

选择 当前摄像机名称-摄像机图标 将shot1Camera锁定到选中的视口 image 激活后,此时在右侧窗口,鼠标右键+wasd可控制 电影摄像机 的移动。 image

找到满意位置后,点击 相机切换后的相机图标锁定右窗口视口。 image

添加关键帧使相机移动

将时间xia显示为秒,窗口将按秒显示。

image

image

点击 序列的相机下的 Transform-右侧 圆形加号-即可在当前时间添加关键帧 image image 移动电影摄像机后,继续添加关键帧。 image

点击播放按钮预览电影摄像机 image

序列右下角 更改动画时间 image 将结束线拖至时间轴末尾 image 将镜头结束线也拖至时间轴末尾 image image

更改摄像机运动过渡

点击序列的 曲线编辑器 image image 选择当前电影摄像机 查看运动曲线 image

选择曲线上的多个关键帧点,右键-从 自动 改为 线性。 更适合序列动画。 image image

渲染场景动画 Render Our Scene

通过主序列渲染动画。 主序列可包含多个镜头。 类似主材质。

创建主序列

添加一个关卡序列 ,命名MasterSequence image

在 主序列 MasterSequence 中,添加镜头轨道 image image

该轨道中可以添加关卡序列。 点击轨道右侧加号,选择之前的镜头 Shot1 image image 修改时间轴时间,与镜头时间相同。 image 将时间轴结束线拖至最后。 镜头的相机图标也可以锁定视角放置移动电影摄像机。

双击序列可进入镜头详情 image 点击 箭头可返回主序列 image

渲染

点击序列的渲染图标即可渲染 image 渲染前需要启用渲染插件 Movie Render Queue image

编辑器-窗口-过场动画-影片渲染队列 image image 点击 渲染,添加主序列 image image

点击 设置的配置 image image

选择导出的格式 image 设置-png序列 image image 只保留 png image

输出设置

image

抗锯齿

image image

重载抗锯齿: 我们是否应该在影片渲染期间重载项目的抗锯齿设置?若在编辑器中常规工作,开启TAA时此操作将十分实用,但会强制关闭其以使用诸多空间样本进行高质量渲染

临时采样数:越大,质量越好,渲染时间越长。 我们应该组合在一起产生每个输出顿的顿数。 这将如此数量的子步的结果混合在一起,生成一个输出顿。请参考CameraShutterAngle以控制每个子顿之间经过的时间量。请参考SpatialSampleCount以了解我们将多少个样本进行平均以生成一个子步。(这意味着染复杂度为SampleCountTileCount'2SpatialSampleCount*NumPasses)。

image

点击渲染: image image

渲染完成后为png图片组 image

须在视频编辑软件中合成视频。

premiere 序列帧转视频

导入序列文件夹

image image image image

新建序列

帧率与UE项目一致 image image

将序列文件夹拖入序列1轨道 V1 image

全选轨道 V1的图片-右键-速度/持续时间 image 持续时间:00:00:00:01 波纹编辑,移动尾部剪辑:启用 image

缩放时间轴,预览动画 image

到处媒体即可 image

WangShuXian6 commented 10 months ago

创建一个自动地形材质 Create An Auto Landscape Material -1

设置地形项目 Set Up Landscape Project

新建空白关卡 image

进入地形模式 image image 创建地形 image

进入 无光照模式 以显示地形。

启用运行时虚拟纹理

项目设置-引擎-渲染-虚拟纹理-启用虚拟纹理支持 :启用 节省编译着色器时间。

项目设置-引擎-渲染-虚拟纹理-启用虚拟纹理支持-在纹理导入时启用虚拟纹理 : 关闭 启用时新导入的纹理将成为虚拟纹理,该纹理会非常模糊。可能会导致编辑器崩溃。

项目设置-编辑器-纹理导入-虚拟纹理-自动虚拟纹理大小 : 10000 如果导入的纹理大于等于该值,将会作为虚拟纹理导入。 所以需要一个极大的值。

image

重启编辑器。

基本照明设置 Basic Lighting Set Up

image

进入光照模式,场景将全黑。

主光源 :光源-定向光源 directional light 太阳光/月光

https://docs.unrealengine.com/5.3/zh-CN/directional-lights-in-unreal-engine/ 非常具有方向性。用于模拟阳光月光

拖入 定向光源 image image

天空,云:天空大气

视觉效果 image

拖入 天空大气

image image

拖入 体积云

image

此时物体不能被照亮: image

模拟天空光:

拖入 光源-天空光 天空光 可照亮物体。 image image

升到高空后会看到黑色边缘,需要指数级高度雾。

image 拖入 视觉效果-指数级高度雾 https://docs.unrealengine.com/5.3/zh-CN/exponential-height-fog-in-unreal-engine/ image image

后期处理体积 锁定曝光,防止自动曝光

https://docs.unrealengine.com/5.3/zh-CN/post-process-effects-in-unreal-engine/

拖入 视觉效果-后期处理体积 image image 默认只影响立方体内部空间

后期处理体积-细节面板-后期处理体积设置-无限范围(未指定)-启用 后期处理体积将影响整个关卡。 image

后期处理体积-细节面板-镜头-exposure-计量模式[亮度计算法]-手动 【默认场景变黑】 后期处理体积-细节面板-镜头-exposure-曝光补偿-10.8 这将增加场景亮度

image image

使用 环境光照混合器 从0设置光照

新建空白关卡,添加地形。 编辑器-窗口-环境光照混合器 image image 依次点击按钮创建对应光照。点击后显示设置面板 image

构建光照:构建-仅构建光照

image

窗口-世界场景设置 世界场景设置-细节面板-Lightmass-高级-强制无预计算光照-启用 这使用Lumen光照。 是否强制不创建光照贴图和其他预计算光照,即使引擎认为其是必要项时也同样如此。此方法适用于改良全动态光影关卡中的迭代。注意:启用此项后,以通常方式预计算的光影交互将丢失 image image

将定向光-变换-移动性-改为 固定 或 可移动。 否则 会出现光照警告。

image 手动添加的其他光源同样需要设置。环境光照混合器创建的光源无需设置。 image

简单雕刻地形 Simple Sculpting

进入地形模式

噪点

使用噪点纹理生成高度信息 噪点-不刷设置-笔刷尺寸-设置为极大值 可以覆盖全部关卡 image image

地形预览材质

进入选项模式 下载草地材质 image

修复 虚拟纹理

如果纹理上右VT标志,表明是虚拟纹理,使用后会非常模糊。需要修复。 1-可以禁用虚拟纹理。耗时。

2-手动设置为非虚拟纹理:we纹理-虚拟纹理流送-关闭 image

批量设置纹理属性:

多选纹理-右键-资产操作-编辑属性矩阵中的选择 image image image 选择多行编辑 image

地形使用草地材质

image

新建 主材质 M_AutoLandscape,基于主材质新建 材质实例 MI_AutoLandscape 地形使用 MI_AutoLandscape

打开 M_AutoLandscape

添加 Texture Sample,使用基础颜色纹理 image image

材质函数 Material Function

将 之前 主材质 M_Master的基础颜色部分节点复制到 M_AutoLandscape 替换Texture Sample纹理。 image image image

地形材质通常有多层,例如9层。 每层的基础颜色纹理都需要使用如上的节点的参数调节。 这将使主材质 M_AutoLandscape 变得混乱。 所以需要材质函数。

材质函数

https://docs.unrealengine.com/5.3/zh-CN/material-functions-in-unreal-engine/

材质函数相当于材质的"片段",允许你保存为模块并在多个材质中复用。

材质函数 允许你将材质图表的一部分打包成可复用的资产,分享到一个函数库中,并轻松插入到其他材质中。它们旨在让你能够快速访问一些常用材质网络,实现简化材质创建。材质函数允许你将复杂的材质逻辑抽象成一个节点,使美术师更容易创建材质。

材质函数的另一个好处是,只要编辑单个函数,就会影响所有使用该函数的材质。因此,如果你需要修复某个材质函数,你不必再去修改其他使用该函数的许多个材质。

例如 材质函数 FlattenNormal image

创建 材质函数 Material Function

右键-材质-材质函数 名称为 MF_ 开头:MF_LandscapeMaterialProcess image image

打开 MF_LandscapeMaterialProcess image

材质表达式函数输入 FunctionInput

添加 材质表达式函数输入 节点 FunctionInput image image image

输入命名:BaseColorTexture

输入类型:函数输入2D纹理 image

BaseColorTexture输入需要纹理对象数据。 Texture Sample RGB 输出 常量3数据。 两者不兼容。不能使用 Texture Sample。

为 BaseColorTexture添加一个预览纹理对象 Texture Object. image

将 MF_LandscapeMaterialProcess 直接拖入 M_AutoLandscape 图表中 image

每次更新 MF_LandscapeMaterialProcess 后,需删除,重新拖入MF_LandscapeMaterialProcess 到用到的材质中。 image

Texture Object Parameter [参数分组]

需要使用 Texture Object Parameter 将 Texture Sample 转为 Texture Object。使基础颜色纹理可输入给 MF_LandscapeMaterialProcess。 添加 Texture Object Parameter 节点:BaseColorTexture image image

MF_LandscapeMaterialProcess

使 MF_LandscapeMaterialProcess 输出RGB信息而非纹理对象

添加节点 SetMaterialAttributes ,单独设置材质属性 材质属性-属性设置类型-添加多列 image

将 Texture2D输出给 Texture Sample 的 Tex 节点。然后将 Texture Sample RGB 输出给 SetMaterialAttributes 的 新添加的 基础颜色 节点。

image

总输出改名为 :ProcessLandscapeMaterial image image

在 Texture Sample 和 SetMaterialAttributes 之间处理基础颜色参数。

M_AutoLandscape

打开 M_AutoLandscape, 选中主材质输出-细节面板-材质-使用材质属性 启用 image

image image 此时 MF_LandscapeMaterialProcess 输出 兼容 主材质输入类型 将 MF_LandscapeMaterialProcess 输入给 主材质的 材质属性

MI_AutoLandscape 材质实例可配置基础颜色纹理 image MI_AutoLandscape -BaseColorTexture 使用下载的草地纹理 image image image

MF_LandscapeMaterialProcess 可以复制多个,为其他层的材质所使用。

image

而不需要复制以上的复杂参数节点。 image

材质函数中的基本颜色控制 Base Color Control In Material Function

多输入材质函数

MF_LandscapeMaterialProcess 控制基础颜色亮度

将 M_AutoLandscape 中控制基础颜色的参数节点复制到 MF_LandscapeMaterialProcess

添加 添加 材质表达式函数输入 节点 FunctionInput, 输入类型 :函数输入标量 用以控制基础颜色亮度 【常量1类型】 image

image

M_AutoLandscape

image

MI_AutoLandscape

image

警告: 地形:将重新构建1个带物理材质的Actor

image

编辑器-构建-仅生成物理材质 【生成地形物理材质】 image

MF_LandscapeMaterialProcess 控制基础颜色饱和度

继续复制M_AutoLandscape的饱和度节点 image

M_AutoLandscape

image

改变 MF_LandscapeMaterialProcess 输入参数的额顺序

input (Texture 2d)-材质表达式-排序优先级-5 image image

MF_LandscapeMaterialProcess 控制基础颜色亮度

image

M_AutoLandscape

image

MF_LandscapeMaterialProcess 控制基础颜色对比度

image

M_AutoLandscape

image

MI_AutoLandscape

image

使用 constant3Vector/3 float 整合 constant/1 float 基础颜色参数

打开 M_AutoLandscape 新建 constant3Vector/3 float 重命名:BaseColorAdjustment 分别命名RGB通道为 Brightness,Saturation,Contrast alpha 通道命名:N/A RGB通道默认值均为1. image

image

image

完整

MF_LandscapeMaterialProcess image M_AutoLandscape image

image

相机深度消退 Camera Depth Fade

按距离混合不同纹理 blend different texture by distance

深度材质表达式 https://docs.unrealengine.com/5.3/zh-CN/depth-material-expressions-in-unreal-engine/ DepthFade(深度消退)表达式用来隐藏半透明对象与不透明对象相交时出现的不美观接缝。

分解平铺

当前地形材质UV平铺过于规则 image

方法1:相机深度消退

CameraDepthFade 节点输出mask值,介于0-1. image

新建材质 M_TilingBreak 新建 M_TilingBreak 材质实例 MI_TilingBreak

打开 M_TilingBreak

添加节点 CameraDepthFade image 参数:消退距离,消退偏移,用于顶点着色器 Creates a gradient of O near the camera towhite at Fade Length. Useful for preventingparticles from camera clipping.0 在“淡入淡出长度”(Fade Length)下,在摄影机附近创建一个渐变为0的白色。有助于防止摄影机剪裁粒子。0

添加参数 FadeFallOff 消退过渡长度[由黑色到白色的过渡长度,越小越锐利,分界越明显] ,默认500 添加参数 FadeStartDistance 消退开始距离[距离相机],默认500

image

地形使用 材质实例 MI_TilingBreak image image

黑色表示材质完全存在,白色表示材质完全消失,中间过渡表示材质部分存在。 FadeStartDistance 消退开始距离[距离相机],增大后黑色增多。 FadeFallOff 消退过渡长度,过渡处,黑色完全变白的长度。 黑色在距离相机500单位处开始消退,再经过500单位才会完全消退变白。

将 CameraDepthFade 的输出赋值给 Lerp的Alpha节点,即可控制分解材质的UV平铺,打破材质平铺的规律性。 当值为黑色时,纹理会很小,而当值为是白色的,会有一个更大的纹理。

使用CameraDepthFade遮罩分解平铺 【虚拟纹理不适用】

M_TilingBreak

将一种纹理分别复制两份,近处纹理,远处纹理。 进处纹理UV平铺较少,材质更大,默认0.3. 远处纹理UV平铺较大材质较密,默认1.

使用 CameraDepthFade 控制两个纹理距离相机的距离,以及纹理之间的过渡。 image image

近处材质密集,远处材质稀疏,之间有过渡。 近距离时,材质UV不在规则平铺,但在高出依然会规则平铺。 image

纹理轰炸 节点 Texture_Bombing

打破纹理瓷砖排列的一种有效方法 an effient way to break up tiling image

MF_TextureBombing_Landscape 纹理轰炸材质函数,使用以下纹理来分解纹理的平铺。 image

打开 M_TilingBreak

添加 纹理轰炸 节点 Texture_Bombing 该纹理非常丰富,建议使用简化版的自制 TextureCellBombing image 对于报错节点使用自带的纹理 image

添加 Texture Object 节点 连接 Texture :基础颜色纹理 添加 Landscape Layer Coords 节点 连接 UVs 控制UV 【材质函数不使用TextureCoord,TextureCoord在使用材质函数的地方使用】 添加 常数1 节点 CellBombingTextureScale 连接 CellBombingTextureScale :控制UV缩放比例,默认1 添加 常数1 节点 TextureScale 连接 InputTextureScale :控制纹理缩放,默认1 添加 常数1 节点 RandomOffsetVariation 连接 RandomOffsetVariation 随机偏移变化,默认1 添加 StaticBoolParameter 节点 UseRotationVariation 连接 UseRotationVariation 旋转变化,默认1 添加 常数1 节点 RandomRotationVariation 连接 RandomRotationVariation 旋转变化,默认1 添加 StaticBoolParameter 节点 IsNormalMap 连接 IsNormalMap 旋转变化,只在用于法线贴图是为true,其余纹理不需要 image

添加 StaticSwitchParameter 节点 UseTextureCellBombing ,使用距离混合或纹理轰炸来打破纹理瓷砖式平铺。 image image image

纹理轰炸 效果 image image

在 MF_LandscapeMaterialProcess 材质函数中使用纹理轰炸

纹理轰炸效果应在基础颜色亮度等各种调节参数之前生效 点击节点右上角箭头可折叠节点。 image

对于函数输入functionInput (StaticBool)类型,需要一个预览输入节点 StaticBool,防止报错。 image image image

M_AutoLandscape

添加常量1节点 CellBombingTextureScale -默认值0.1 -分组 03-TilingBreak image

添加常量4节点 GrassLayer_TilingAdjustment-分组 04-GrassLayer image

3通道默认值都为1 R:InputTextureScale G:RandomOffsetVariation B:RandomRotationVariation A:N/A

添加 StaticBoolParameter 节点 GrassLayer_UseRotationVariation -分组 04-GrassLayer

其他参数-分组 04-GrassLayer,参数名称全部添加前缀 GrassLayer_ image

地形使用材质实例 MI_AutoLandscape image

宏观变化 Macro Variation

拆散瓷砖式平铺的收尾工作 finishing touches for breaking up tiling image

该蓝图所在材质位置:新手包 starterContent-materials-M_Metal_Gold image

粘贴到 材质函数 MF_LandscapeMaterialProcess image

将宏观变化节点与基础颜色相乘即可。

缓存基础颜色 CachedBaseColorOutput image

缓存hong宏观变化 CachedMacroVariationOutput image

相乘 image

image

更好的效果 image

提取宏观变化为材质函数

将用到的纹理 T_MacroVariation 放到函数同文件夹下 新建材质函数 MF_MacroVariation 复制宏观变化节点 使用文件夹下的纹理 T_MacroVariation。 image

在 材质函数 MF_LandscapeMaterialProcess 中使用 MF_MacroVariation

image

添加开关 functionInput bool类型 :UseMacroVariation image

M_AutoLandscape 更新开关参数

GrassLayer_UseMacroVariation image

image

MI_AutoLandscape image

地形高光 Specular In Landscape

摆脱塑料外观 get rid of the plastic look image image

MF_LandscapeMaterialProcess

选择 SetMaterialAttributes 节点,添加属性 Specular image

缓存基础颜色RGB: CachedBaseColorRGBOutput image

高光度需要常量1数据。 使用CachedBaseColorRGBOutput红色通道。绿色也可以。限制为 0-0.5。 image 添加bool类型函数参数: UseBaseColorAsSpecular 添加开关 高光度缓存为 CachedSpecularOutput

image image image

打开 M_AutoLandscape,添加高光开关 GrassLayer_UseBaseColorAsSpecular image image

MI_AutoLandscape image

地形的法线贴图 Normal In Landscape

image

MF_LandscapeMaterialProcess

添加函数参数,Texture2D类型:NormalTextureInput 为 NormalTextureInput 添加 TextureObject 输入,使用系统占位法线纹理 DefaultNormal image

对法线贴图使用纹理轰炸 MF_TextureBombing_Landscape 缓存 LandscapeCoords :CachedLandscapeCoordinnate image

缓存 CellBombingTextureScale :CachedCellBombingTextureScale 用以颜色,法线的共用。 image

缓存 TextureScale : CachedTextureScale

缓存 RandomOffsetVariation: CachedRandomOffsetVariation

缓存 UseRotationVariation: CachedUseRotationVariation

缓存 RandomRotationVariation:CachedRandomRotationVariation

添加 StaticBool 函数参数,默认true,输出至 IsNormalMap image

添加 mask 遮罩 MF_TextureBombing_Landscape -RGB :RG通道 xy ,使用函数参数常量1:NormalStrength 控制。 添加 mask 遮罩 MF_TextureBombing_Landscape -RGB :B通道 z

NormalStrength :法线强度

正常强度下,你的X、Y值越高,B值就会越高。 这就是你如何控制法线强度的方法。

缓存法线 CachedNormalOutput

为 SetMaterialAttributes 添加 Normal 属性

image image

M_AutoLandscape

添加 TextureObject [使用默认占位法线纹理 DefaultNormal] 节点 GrassLayer_NormalTexture 至 NormalTextureInput。

添加 常量1 节点 GrassLayer_NormalStrength 【默认值 1】至 NormalStrength

MI_AutoLandscape

GrassLayer_NormalTexture 分配草材质法线贴图纹理 image image

地形材质中的通道封装纹理 ORD In Landscape

Ambient Occulusion and Roughness

材质草自带封装纹理 ORD image R:环境光遮挡 G:粗糙度 B:位移 【虚幻5尚未支持】

image

MF_LandscapeMaterialProcess

为 SetMaterialAttributes 添加 AmbientOcclus, Roughness 属性 image

添加函数参数,Texture2D类型:ORDTextureInput 添加 Texture Object ,使用纹理 T_DefaultMaskTexture

打开材质草的ORD纹理 image 其压缩-压缩设置-遮罩(无sRGB),所以MF_LandscapeMaterialProcess ORD也需要有相应的mask设置。 所以 Texture Object 必须使用纹理 T_DefaultMaskTexture。 image

复制法线的大部分节点 纹理轰炸函数输出RGB:分别使用mask R,mask G。 mask R:使用函数参数 常量1 控制:AOStrength 缓存为 CachedAOOutput

mask G:使用函数参数 常量1 控制:MinRoughness,MaxRoughness 限制粗糙度。 缓存为 CachedRoughnessOutput

image image

M_AutoLandscape

添加 TextureObjectParamater :GrassLayer_ORDTexture,使用纹理 T_DefaultMaskTexture 。连接至 ORDtextureInput。

添加 constant4Vector :GrassLayer_DetailedAdjustment 详细调整其他参数。

R:NormalStrength 默认值1 G:AOStrength 默认值1 B:MinRoughness 默认值0 A:MaxRoughness 默认值0.8 image

删除之前的 GrassLayer_NormalStrength 参数,由R通道替代。

image image

MI_AutoLandscape

GrassLayer_ORDTexture 分配材质草的ORD纹理 image image

高光与宏观控制 Specular and Macro Variation Control

MF_LandscapeMaterialProcess 高光

在原高光度节点添加另一种高光控制 原节点: image

添加 常量1函数参数 UseBaseColorAsSpecularAmount 添加 Lerp

image

M_AutoLandscape 高光

GrassLayer_BaseAdjustment 的 A通道 重命名:BaseColorAsSpecularAmount 连接至 UseBaseColorAsSpecularAmount image

MI_AutoLandscape 高光

image

MF_LandscapeMaterialProcess 去除基础颜色的宏观控制

删除基础颜色的宏观控制部分节点。【将在M_AutoLandscape统一控制宏观变化】 将以下节点删除 image

总输出的基础颜色节点,由 CachedBaseColorMacroVariationOutput 改为 CachedBaseColorOutput image

M_AutoLandscape 统一宏观控制

宏观控制 应在全部层上统一生效,而非单个层分别调节。

使用 GetMaterialAttributes 获取 MF_LandscapeMaterialProcess 的输出材质,以单独设置。 image

选择 GetMaterialAttributes-材质属性-属性获取类型 添加一个属性 BaseColor image

拖入材质函数 MF_MacroVariation ,但直接输出给 结果将无法修改属性。 所以需要添加另一个 SetMaterialAttributes 。 选择 SetMaterialAttributes,添加属性 BaseColor。 image image

这将可以调节基础颜色参数。

缓存获取的未经过宏观变化的基础颜色 CachedDefaultBaseColorOutput image

添加宏观变化强度参数 MacroVariationStrength 【03-TilingBreak】 添加宏观变化开关 UseMacroVariation 【03-TilingBreak】 将获取的基础颜色与宏观变化相乘,然后缓存为 CachedBaseColorOutput image image

删除 GrassLayer_UseMacroVariation 参数。 缓存 草地层 MF_LandscapeMaterialProcess 输出:CachedGrassLayer image

MI_AutoLandscape

image

地形材质层混合 Landscape Layer Blend

M_AutoLandscape 土壤层

复制 MF_LandscapeMaterialProcess 处理土壤层

将 MF_LandscapeMaterialProcess 的 参数 CellBombingTextureScale 作为所有材质层的公用参数

缓存 草地层的 CellBombingTextureScale 为 CachedCellBombTextureScale image

复制草地层的 MF_LandscapeMaterialProcess 和所有输入参数。 缓存参数除外,缓存参数不能复制,复制将会生成新的缓存参数。两者不同。

土壤层 MF_LandscapeMaterialProcess 使用 CachedCellBombTextureScale

分组名称使用 05-SoilLayer 参数名称使用 SoilLayer_前缀

缓存 土壤层 MF_LandscapeMaterialProcess 输出:CachedSoilLayer image

使用 LandscapeLayerBlend 合并 M_AutoLandscape 土壤层,M_AutoLandscape 草地层

image 选择 LandscapeLayerBlend, 图层-添加层 AutoLandscapeMaterial [自动应用到地形] 图层-添加层 GrassMaterial 图层-添加层 SoilMaterial 图层名称不可有空格,否则层不可见。 image image

此时材质将变黑,此时需要创建图层信息。 image

绘制地形

进入地形模式-绘制-绘制 image

如果默认不显示任何材质层,bug.

需要 打开材质实例 MI_AutoLandscape,将草地纹理重制,然后重新设置纹理。 image

创建图层信息

点击图层右侧加号-权重混合层(法线)- image image 可保存到默认创建的目录 image 这将直接绘制好默认层材质。草地层为默认材质层。

image

依次为每个层 创建图层信息。 image

为土壤层分配纹理

image 选择 土壤层即可绘制土壤材质到地形上

image image

修复边界接缝问题

打开 MF_MacroVariation 选择 Texture Sample-材质表达式纹理采样-采样器源-改为 共享:包裹 image 设置全部3个Texture Sample。

如果不共享,最多只能平移三层。

在 Gaea 中制作地形 Make A Landscape In Gaea

ALT+左键 旋转地形。 中键 缩放地形。

添加 山 Mountain 节点 image image

Bulky:启用 使山脉隆起。 image image

Height:山脉高度。

空格键使地形居中显示。

Fold 提供细节变化

从 Mountain 输出节点 拖拽-输入 Fold -选择 Fold节点 添加 image image

点击节点,将预览该使用该节点效果后的地形。 image

FractalTerraces 更多细节

image image

分辨率

默认为0.5K分辨率操作高分辨率可显示更多细节。性能消耗genggeng多。

image

Erosion 侵蚀效果

image

downcutting-downcutting 水流侵蚀

可以添加多个 Erosion,多次应用侵蚀效果 image

自动应用效果按钮

启用后所有效果可及时渲染。

image

Transform 偏移/旋转/缩放

Worselands 土地

image

drop to floor 将地形落在地平面

image image

Combine 合并2个节点

image image 混合模式 image

ratio 决定第二个地形的比例。

pin 只预览当前节点

即使选择其他节点,也只预览固定的节点。 调整其他节点,预览对pin节点产生的效果。 image

MultiCombine 组合多个节点

image 使用Max混合模式,使最高点保留。 image image

从 Gaea导出地形 Output Landscape From Gaea

Zero Borders 边界

image

默认无边框,不适合导入虚幻。 image 增加 Zero Borders -margin -4 增加边界 image

image

Wizard 调节节点强度

image image 点击 apply changes 应用效果。

Wizard-右键-mark for export [标记为导出该节点的数据] image

Slope 坡度信息

Y轴为地形坡度。可直接用于虚幻。 image image image min-50 max-80 Y轴为50-80度之间的都是坡度。 image

Slope-右键-mark for export [标记为导出该节点的数据]坡度数据也导出。黄点标注。

image

Build 导出

选择 格式 Slope-ALL-png Wizard-Exporting,Output,Flow-png image

defintion-resolution-1009 [虚幻专用分辨率] options-Range-Raw [倒是虚幻避免伪影] 选择构建目录

image

start build -开始导出 image 导出的各信息文件 image

Slope.png 坡度图 Wizard.png 高度图 Wizard-Flow.png 模拟水流流动

将 gaea 地形数据导入虚幻引擎 Import Landscape Maps To Unreal

删除默认地形。只保留光照。 image 删除地形图层,强制删除。 image

使用新导入的gaea地形创建图层信息。

进入 地形模式-管理-从文件导入 image 高度图文件 按钮-选择 Wizard.png image 点击 导入 按钮 image image

默认地形太低,在选项模式将其拉高。 image 为地形分配材质实例 MI_AutoLandscape image

创建图层信息 地形模式-绘制-依次在各材质层点击加号【权重混合层(法线)】-创建图层信息 image image image image

导入水流图信息

地形模式-管理-导入 image

为土壤层导入水流信息 勾选 土壤层-再选择 Wizard-Flow.png image 点击 导入,将显示水流沟壑 image

使用平滑工具修整山顶的尖刺

地形模式-雕刻-平滑 image

地形材质添加坡度层 Slope Layer

下载 cliff 悬崖材质 image

打开 M_AutoLandscape 选择草地层全部节点-右键-折叠节点 image 重命名-GrassLayer image 双击可进入节点内部

复制土壤层节点,修改参数为坡度层。 前缀:SlopePayer_ 分组:06-SlopeLayer [先将分组名清空,在粘贴]

缓存坡度层:CachedSlopeLayer image

landscape layer blend 节点添加 图层 SlopeMaterial

image

折叠

折叠土壤层:SoilLayer 折叠坡度曾:SlopeLayer image

MI_AutoLandscape

为 坡度层分配纹理 image

坡度层信息

重置地形材质为空。重新选择材质实例 MI_AutoLandscape。防止新材质层不生效。

进入地形模式-绘制-绘制-点击坡度层加号-创建图层信息-权重混合层(法线) image

image

进入地形模式-管理-导入-勾选 坡度层 ,选择 Slope.png 点击 导入 image

image

修复山顶上不应存在的草材质

山顶不应该长草。 image 在山峰生成白色遮罩。山峰以下生成黑色遮罩。

自动地形材质的意义 What does Auto Landscape mean

自动材质通过mask遮罩生成材质。白色区域1表示生成,黑色区域0表示不生成。

创建坡度遮罩 Create A Slope Mask

减少坡度上的轰炸纹理比例,使坡度上的纹理更大。

打开 M_AutoLandscape 添加常量1参数:SlopeLayer_CellBombTextureScale 替换 坡度层的 CachedCellBombTextureScale image 这可以单独控制坡度层纹理轰炸缩放。不使用全局参数。

打开 MI_AutoLandscape SlopeLayer_CellBombTextureScale-0.01 SlopeLayer_TilingAdjustment-InputTextureScale-0.1 此时坡度纹理变大恢复正常 image

创建坡度遮罩

要创建坡度蒙版,需要处理不同的法线。

存在不同类型的法线。

面法线(face normal)

通过顶点间向量的叉乘求取的法线称为面法线(face normal). 垂直于表面。长度很短。主要提供方向信息。 image 每个面法线都可以告诉我们该面朝哪个方向。

顶点法线(vertex normal)

三角形每个顶点附带的法线信息称为顶点法线(vertex normal) image 顶点法线中的线不是来自面,而是来自顶点。 顶点法线可以告诉我们该顶点面向哪个方向。 通过使用顶点法线可以提供的方向信息,我们可以设法获取坡度。

VertexNormalWS

https://docs.unrealengine.com/5.3/zh-CN/coordinates-material-expressions-in-unreal-engine/

VertexNormalWS 表达式输出世界场景空间顶点法线。它只能用于在顶点着色器中执行的材质输入,例如WorldPositionOffset。该表达式对于设置网格体增大或缩小很有用。请注意,沿法线偏移位置会导致几何图形沿UV缝隙拆分。 获取虚幻中的顶点法线:VertexNormalWS 可以使用此节点来获取使用此材质的任何匹配的顶点法线。

Dot节点 输出结果将告诉我们两个向量的面方向有多相似。

顶点法线,有方向信息,所以是向量。是长度为一的向量。 向量,通过使用乘积,它可以告诉我们两个向量的方向有多么不同。返回一个浮点数。 如果这两个向量平行,则该值将为 1。 如果它们垂直,则该值将为0。 如果它们完全相反。该值将为负值. 这就是我们获得地形坡度的方法。

假设我使用顶点法线与另一个向量点积运算。 该向量的 x 轴为零,y 轴为零,z 轴为 1。长度为1。 将这个向量与顶点法线进行比较。 image

坡度即两个向量之间的角度。是一些灰度值。范围在0和1之间。 image

坡度遮罩材质

新建主材质 M_SlopeMask

添加VertexNormalWS节点

添加 constant3Vector/3 float,值为 0,0,1 表示Z轴1。

添加 Dot 点积,输出至基础颜色。【将输入的顶点法线与0,0,1,比较】 获取所有的顶点法线,与向量0,0,1比较,即垂直向上的为1,全白。 image image

基于 M_SlopeMask 新建材质实例 MI_SlopeMask

地形使用材质 MI_SlopeMask image 平坦的地方,顶点法线接近0,0,1.为白色1。

添加节点 Power 提高对比度以增加灰度值。 添加 constant1 坡度遮罩强度 SlopeMaskStrength 默认1 image

提高 SlopeMaskStrength 至50,对比度增大,只有顶点法线接近0,0,1的水平面才为纯白色1.

image

image

我们希望斜坡上是白色值1,平坦的地面为黑色值0。【坡度值】。所以需要反转该值。并且限制在0-1.

添加 Saturate 限制:0-1。 添加 CheapContrast 调整遮罩边缘的锐度。
添加 constant 1: SlopeMaskSharpness 坡度遮罩明锐度。默认1。 添加 1- 反转值,使水平面为黑色,垂直面【斜坡】为白色。负值白色已过滤。 image image

坡度遮罩锐度0.1。 坡度遮罩强度1。 image

image

在地形材质中使用坡度遮罩 Use Slope Mask In Landscape Material

地形材质使用材质实例 MI_AutoLandscape

M_AutoLandscape

将草地层与土壤层一起作为默认材质层。

BlendMaterialAttributes 混合2各材质层; 草地层与土壤层输入A,B节点。 坡度遮罩输入Alpha节点。控制2种材质的比例。

MF_SlopeBlend 坡度混合材质函数

新建 MF_SlopeBlend 坡度混合材质函数 总输出为:SlopeBlendedMaterial

拷贝 M_SlopeMask 的全部节点,作为 坡度遮罩,输入至 BlendMaterialAttributes的Alpha节点 Alpha =0,使用A。表示地面。草地材质的平面。 Alpha=1,使用B。表示斜坡。土壤材质的山坡。

添加 materialAttributes 函数输入材质属性:BaseMaterial 赋值给 A. image

添加 materialAttributes 函数输入材质属性:SlopeMaterial 赋值给 B.

添加 函数输入标量 :SlopeMaskStrength 控制坡度遮罩强度,越小,坡度材质越少【土壤层】。 添加 函数输入标量 :SlopeMaskSharpness 控制坡度遮罩锐度,越小,材质过度越柔和。 替换之前节点的2个参数。 image

M_AutoLandscape

将材质函数 MF_SlopeBlend 拖入M_AutoLandscape

缓存 MF_SlopeBlend的输出为 CachedAutoLandscapeMaterial landscape Layer Blend 默认层使用 CachedAutoLandscapeMaterial

MF_SlopeBlend - BaseMaterial : 草地层

MF_SlopeBlend - SlopeMaterial : 土壤层

MF_SlopeBlend - SlopeMaskStrength: constant1 - SlopeMaskStrength 默认1 -分组:01-SlopeBlend

MF_SlopeBlend - SlopeMaskSharpness: constant1 - SlopeMaskSharpness 默认0.5 -分组:01-SlopeBlend

image image

地形默认拥有草地层和土壤层。土壤层仅存在于陡峭斜坡悬崖上。 image

image image image

坡度混合渐变 Transition Slope Blend

过渡区域的混合材质 blend material for transitioning areas 当前草地与土壤之间的缺少过度材质

M_AutoLandscape

继续使用 MF_SlopeBlend 混合 草地与土壤层 添加constant 1 参数 TransitionSlopeMaskStrength -坡度遮罩过渡强度 默认1 添加constant 1 参数 TransitionSlopeMaskEdgeSharpness -坡度遮罩过渡边缘锐度 默认1

MF_SlopeBlend - BaseMaterial : 草地层

MF_SlopeBlend - SlopeMaterial : 土壤层

MF_SlopeBlend - SlopeMaskStrength: constant1 - TransitionSlopeMaskStrength -坡度遮罩过渡强度 默认1 -分组:01-SlopeBlend

MF_SlopeBlend - SlopeMaskSharpness: constant1 - TransitionSlopeMaskEdgeSharpness 默认1 -分组:01-SlopeBlend

image

为其添加开关 UseTransitionSlopeBlend 分组:01-SlopeBlend 过渡混合材质 UseTransitionSlopeBlend 输出至最终的 MF_SlopeBlend 混合材质。 image

岩石土壤更明显,过渡柔和。 image image

解决纹理拉伸——Triplanar Projection(三平面投影)

避免锐角拉伸 avoid streching in sharp angles

https://zhuanlan.zhihu.com/p/623046123

Triplanar projection是一种基于表面法线的纹理投影技术,它可以在表面的三个平面方向上使用三个2D纹理来进行投影,从而创建出更加真实和自然的纹理映射效果。该技术可以避免纹理拉伸的效果,常用于拥有不规则与复杂表面物体的材质。

当前山峰岩石材质存在纹理拉伸问题: image

左:拉伸 ,右:正常 image

MF_TriplanarProjection 材质函数

WorldAlignedTexture 的修改加强版。 处理颜色纹理

MF_TriplanarProjection 材质函数与MF_TriplanarProjection_Normal 材质函数文件: 024 TriplanarProjection.zip image image

MF_TriplanarProjection_Normal 材质函数

处理法线纹理

image image image image

M_TriplanarProjection 主材质

新建 M_TriplanarProjection 主材质 基于 M_TriplanarProjection 新建 MI_TriplanarProjection 材质实例 打开 M_TriplanarProjection 拖入 材质函数 MF_TriplanarProjection

添加节点 TextureObject ,使用纹理 S_WindDirectional image 添加 constant 1 参数:TextureBlendEdgeSharpness 默认1 添加 constant 1 参数:TextureScale 默认1

线性投影:相同的纹理被投影三次。 image image

TextureBlendEdgeSharpness 改为 15: 现在,把同一个纹理从x轴、y轴和Z轴共投影三次,这就是避免拉伸的方法。 image

普通投影: image

添加开关控制 UseTriplanar 三平面投影与普通投影 image

测试 M_TriplanarProjection

添加一个球体,使用材质 MI_TriplanarProjection

普通投影,UVTile :6 次

该纹理仅从上到下投影一次,顶部发生了一些奇怪的拉伸。 image image image

这在平坦表面没有影响,但在斜坡,山峰处会拉伸纹理。因为斜坡在水平方向仅被投影一次。 但在x长度一样时,斜面比平面的表面积更大,y,z被拉长,导致纹理也被拉长。 在一个坐标相同时,斜面的其他坐标比平面更长。 所以其他坐标需要多次投影。

三平面投影

image image image

对坡度层使用三平面投影 Use Triplanar Projection For Slope Layer

apply triplanar to landscape 使用 三平面投影 替代 纹理轰炸 。

MF_Triplanar_LandscapeMaterialProcess 三平面投影自动地形材质处理 材质函数

不修改原自动地形材质函数。 拷贝 材质函数 MF_LandscapeMaterialProcess 为 MF_Triplanar_LandscapeMaterialProcess 打开 MF_Triplanar_LandscapeMaterialProcess 使用 三平面投影 MF_TriplanarProjection 替代 纹理轰炸 MF_TextureBombing_Landscape 法线部分使用 MF_TriplanarProjection_Normal 替代。

基础颜色

保留 函数参数 CellBombingTextureScale 纹理轰炸缩放:重命名为-TriplanarEdgeBlendSharpness 对应缓存 CachedCellBombingTextureScale :重命名为- CachedTriplanarEdgeBlendSharpness

保留 函数参数 TextureScale 纹理缩放 :重命名为-TriplanarTextureScale 对应缓存 CachedTextureScale 重命名为-CachedTriplanarTextureScale 删除多余的函数参数

image image

法线贴图

使用 MF_TriplanarProjection_Normal 替代 纹理轰炸 MF_TextureBombing_Landscape

image

高光度 不需要修改

ORD 环境光遮挡 ,粗糙度

同基础颜色 image

完整

image

M_AutoLandscape

在 SlopeLayer 部分,拖入 MF_Triplanar_LandscapeMaterialProcess 为 MF_Triplanar_LandscapeMaterialProcess 添加参数: 添加 constant1 参数 TriplanarEdgeBlendSharpness 默认0,分组:06-SlopeLayer 添加 constant1 参数 TriplanarTextureScale 默认1,分组:06-SlopeLayer image

拷贝 MF_LandscapeMaterialProcess 的输入参数,连接至 MF_Triplanar_LandscapeMaterialProcess 。 只拷贝需要的参数。 image

添加开关 UseTriplanar ,切换 普通投影 MF_LandscapeMaterialProcess 和 三平面投影 MF_Triplanar_LandscapeMaterialProcess 分组 :06-SlopeLayer 。优先级 :-1 image

参数调整

开启三平面投影 image

调整UV平铺: TriplanarEdgeBlendSharpness :10 TriplanarTextureScale:0.02 image 山峰斜坡不再拉伸。 image

三平面投影更加消耗场景性能

因为投影了3次,比普通投影1次更加消耗性能。 所以只将 三平面投影 应用在 主材质 M_AutoLandscape 的 SlopeLayer 坡度层上。 山峰斜面由坡度层生成控制。

解决办法:运行时虚拟纹理

创建高度遮罩 Create A Height Mask

use height to blend materials 使用高度值混合材质,为山峰添加雪材质层。使雪材质层只存在于山顶位置。

使用顶点法线来获取高度遮罩。

绝对世界位置 Absolute World Position: 该节点将输出使用该材质的对象的每个像素的位置数据

WorldPosition 全局位置

https://docs.unrealengine.com/5.3/zh-CN/coordinates-material-expressions-in-unreal-engine/#worldposition

WorldPosition(全局位置)表达式输出当前像素在全局空间中的位置xyz。要实现可视化,只需将输出连接到"自发光"(Emissive):

World Position Example image

常见用法是确定从摄像机到像素的径向距离,而不是像 PixelDepth(像素深度)那样确定正交距离。WorldPosition(全局位置)也可用作纹理坐标,并让不相关的网格在它们彼此邻近时进行纹理坐标匹配。以下是使用 WorldPosition.xy 对纹理进行二维贴图的基本示例:

Planar projection WS image

HeightMask 创建高度遮罩的原理

创建 示例材质 M_HeightMask,材质实例 MI_HeightMask 打开 M_HeightMask 添加节点 Absolute World Position 【通过搜索 World Position】 image image

通过组件遮罩B通道,新版直接使用Z值,当前只使用 Absolute World Position 输出的Z位置。 预览窗口中的球体的中心为世界原点,所以球体上半部分的Z坐标值大于0,为正值,显示为白色,下半部分负值显示为黑色。

image

在关卡添加一个较高的立方体测试材质 MI_HeightMask image

查看 立方体的世界坐标 21018,-5096,1695。 立方体自身的原点在立方体中心。 image

当前Z值为正数,立方体显示为白色。 要使立方体出现黑色,需要将Absolute World Position输出的Z值 减去 大于(立方体的世界位置Z值 - 立方体高度的一半)的值。

打开 M_HeightMask 添加constant 1 参数:HeightMaskStartHeight 遮罩的开始高度 image image

调整 HeightMaskStartHeight 值为立方体的世界位置Z坐标:1695.506733 【即立方体自身中心点Z】 立方体中心点以上为正值白色,中心点以下为负值黑色。【中心点附近会有1到0到-1的小段灰色位置】 image 这就是创建高度遮罩的原理。

Divide

https://docs.unrealengine.com/5.3/zh-CN/math-material-expressions-in-unreal-engine/#divide Divide 表达式取两个输入,将第一个输入除以第二个输入,并输出值。

如果使用多个通道传递值,每个通道将单独相除。例如,如果将RGB颜色值传递给每个输入,则将第一个输入的R通道除以第二个输入的R通道中,结果存储在输出的R通道中;将第一个输入的G通道除以第二个输入的G通道中,结果存储在输出的G通道中,以此类推。

两个输入必须有相同数量的值,但其中一个值是单个浮点值时例外。在这种情况下,将多通道输入的每个通道除以单个浮点值,并将结果存储在输出值的单独通道中。

如果除数在任何通道内都介于0和0.00001之间,则将其提升至0.00001。如果除数在任何通道内都介于0和-0.00001之间,则将其降低至-0.00001。这避免了出现除以零的错误可能性。但是,这也意味着通道的输出值可能非常大。

属性 说明
常量A(Const A) 接受要被除的值,即被除数。仅在未使用A输出时使用。
常量B(Const B) 接受要除以的值,即除数。仅在未使用B输出时使用。
输入  
A 接受要被除的值,即被除数。
B 接受要除以的值,即除数。

示例:A=(1.0)且B=(5.0),相除得(0.2),显示为深灰色。

image

创建 FallOff 区域,即中心1至-1的渐变区域

打开 M_HeightMask 添加constant 1 参数 HeightMaskFallOff 默认1 [通过Absolute World Position的Z的除,使Z值稀疏,1至-1占比增大,灰色区域变大] 添加节点 Divide image

image 调节 HeightMaskFallOff =100. 中心灰色区域变多,这类似于 CameraDepthFade 相机深度消退 函数。 image

地形使用材质实例 MI_HeightMask

image 准备将学材质层应用到白色部分。 HeightMaskStartHeight 调节雪材质生效的高度。 HeightMaskFallOff 调节雪材质与其他材质的过渡区域大小。 image

在地形材质中使用高度遮罩 Use Height Mask In Landscape Material

使用高度值混合雪材质到默认材质中

下载雪材质snow image

M_AutoLandscape 创建雪材质层

打开 M_AutoLandscape

进入 SlopeLayer 层,拷贝下半部分节点 image 粘贴为新的层 折叠为 SnowLayer, MFLandscapeMaterialProcess 输出缓存为 CachedSnowLayer 参数前缀使用 `Snowlayer 分组为07-SnowLayer` image image image

在 混合材质部分 Landscape Layer Blend 节点,增加材质层 SnowMaterial 使用 CachedSnowLayer 材质 image

MI_AutoLandscape

打开 MI_AutoLandscape 配置 SnowLayer 的雪材质纹理 image

重置地形材质为空,再次使用材质实例 MI_AutoLandscape。 防止地形编辑不显示雪材质层。

地形编辑 创建雪层地图信息

进入地形模式-绘制-绘制 dian'ji点击雪材质层右侧加号添加地形信息 image 权重混合层(法线) image image

高度混合 材质函数 MF_HeightBlend

创建 材质函数 MF_HeightBlend 总输出为 HeightMask 从示例主材质 M_HeightMask 拷贝所有节点到 MF_HeightBlend

替换普通参数为函数参数, 使用Saturate 将结果限制在0-1 image

image

M_AutoLandscape 再默认层的坡度混合之后混合雪材质层

打开 M_AutoLandscape 添加节点 BlendMaterialAttributes

拖入材质函数 MF_HeightBlend

BlendMaterialAttributes - Alpha : MF_HeightBlend BlendMaterialAttributes - A : MF_SlopeBlend BlendMaterialAttributes - B : CachedSnowLayer

添加 constant 1 参数 :SnowMaskStartHeight 默认0,分组 02-HeightBlend 添加 constant 1 参数 :SnowMaskFallOff 默认1000,分组 02-HeightBlend 均连接至 MF_HeightBlend

最终雪混合节点输出至 地形默认材质层 CachedAutoLandscapeMaterial image

image

调节参数使雪材质只在山顶出现。 image image 此时雪材质与其他材质的分界线明显,需要修复。

高度遮罩的细节调整 More Adjustment For Height Mask

为边缘提供随机性 provide randomness to the edge

示例材质 M_HeightMask

打开 M_HeightMask

添加节点 Subtract 到节点末尾,进一步调节高度遮罩的高度值。 通过减去一个噪声纹理,使减去的高度不固定,随机化。 image

M_SlopeMask 坡度遮罩 材质已经具由这种随机化。 M_SlopeMask 具由参数 坡度边缘锐利度,坡度遮罩强度。 将 M_SlopeMask 材质全部节点拷贝至 M_HeightMask 其输出连接至 Subtract 的B节点。 现在即可调整 参数控制雪材质边缘。 image

调高 HeightMaskFallOff :3000 配合 SlopeMaskStrength: 3 降低锐度 SlopeMaskSharpness : 0.1

即可使雪材质边缘再3000单位的消退区域内不规则化。 image image

MF_HeightBlendSubtractSlope 高度混合减坡度材质函数

不修改原高度混合材质函数。 拷贝 MF_HeightBlend ,新材质函数副本为 MF_HeightBlendSubtractSlope 打开 MF_HeightBlendSubtractSlope

将 M_SlopeMask 材质全部节点拷贝至 MF_HeightBlendSubtractSlope 替换 constant1 参数为 函数输入标量 SlopeMaskStrength 重命名为 EdgeAdjustmentMaskStrength 边缘细节遮罩强度 SlopeMaskSharpness 重命名为 EdgeAdjustmentMaskSharpness 边缘细节遮罩锐利度

添加节点 Subtract 输入至 Saturate 节点。

总输出重命名为 HeightBlendedMaterial

添加 参数 函数输入材质属性 :BaseMaterial 添加 参数 函数输入材质属性 :TopMaterial

添加 BlendMaterialAttributes 合并 BaseMaterial,TopMaterial Saturate 节点 输入至 HeightBlendedMaterial - Alpha.

BlendMaterialAttributes 输出至总输出 image

M_AutoLandscape

打开 M_AutoLandscape 将材质函数 MF_HeightBlendSubtractSlope 拖入雪混合部分。 替换材质函数 MF_HeightBlend

删除雪混合部分的 BlendMaterialAttributes

配置 MF_HeightBlendSubtractSlope: TopMaterial :CachedSnowLayer BaseMaterial : MF_SlopeBlend 的输出 SlopeBlendedMaterial HeightMaskStartHeight : SnowMaskStartHeight HeightMaskFallOff : SnowMaskFallOff EdgeAdjustmentMaskStrength :新建constant 1 参数 SnowEdgeAdjustmentStrength 默认1 ,分组 02-HeightBlend EdgeAdjustmentMaskSharpness :新建constant 1 参数 SnowEdgeAdjustmentMaskSharpness 默认1 ,分组 02-HeightBlend

MF_HeightBlendSubtractSlope 输出至 CachedAutoLandscapeMaterial 地形默认材质层 image image

锐度0.5 强度 6 image image

坡度层使用高度遮罩 Use Height Mask With Slope Layer

修复缩放问题 移动文件后,文件夹-右键-修复重定向器 修复。

土壤材质同意缩放为较小值。地面土壤材质会模糊。 但山峰使用了三平面投影不会模糊。导致只有地面的土壤模糊。 但缩放过大时,会导致山峰平铺。

image

斜坡处土壤岩石,由于缩放比例太大而模糊。 image

这是由于 06-Slopelayer : TriplanarTextureScale 为 0.02 过小导致, 将其改为 0.1.土壤岩石将不模糊。 image image

但山峰岩石土壤材质会出现规则的瓷砖式UV平铺错误。 image

方法1

image

打开 M_AutoLandscape 进入 坡度层 SlopeLayer 部分修改

缓存 MF_Triplanar_LandscapeMaterialProcess 为 CachedTriplanarSlope image

缓存 MF_LandscapeMaterialProcess 为 CachedTextureBombedSlope image

添加 BlendMaterialAttributes BlendMaterialAttributes A : CachedTextureBombedSlope BlendMaterialAttributes B : CachedTriplanarSlope BlendMaterialAttributes Alpha : 拖入材质函数 MF_HeightBlend 的输出

添加 constant 4 参数:TriplanarAdjustment 分组 06-SlopeLayer TriplanarAdjustment R 名称 TriplanarStartHeight 默认0: 输入至 MF_HeightBlend :HeightMaskStartHeight TriplanarAdjustment G 名称 TriplanarMaskFallOff 默认 500: 输入至 MF_HeightBlend :HeightMaskFallOff TriplanarAdjustment B 名称 TriplanarEdgeBlendSharpness 默认15 缓存为 CachedEdgeBlendSharpness TriplanarAdjustment A 名称 TriplanarTextureScale 默认 0.02 缓存为 CachedTriplanarTextureScale

image

image

MF_Triplanar_LandscapeMaterialProcess 替换输入参数: TriplanarEdgeBlendSharpness :CachedEdgeBlendSharpness TriplanarTextureScale : CachedTriplanarTextureScale image

BlendMaterialAttributes 输出至 UseTriplanar 的 True 节点 CachedTextureBombedSlope 输出至 UseTriplanar 的 False 节点

image

方法2

使用Lerp根据高度混合分别处理不同高度的材质缩放。 image

MI_AutoLandscape [方法1]

调节 06-SlopeLayer :TriplanarAdjustment image

拷贝 02-HeightBlend 的 SnowMsakStartHeight 数值 雪存在的地方, image

赋值给 06-SlopeLayer :TriplanarAdjustment :TriplanarStartHeight

在高处使用三平面投影。通过 TriplanarAdjustment 调整。

在低处使用纹理轰炸。通过 SlopeLayer_TilingAdjustment 调整。 image

地面岩石不再模糊 image

高处山峰不会拉伸和规则平铺 image

WangShuXian6 commented 10 months ago

创建一个自动地形材质 Create An Auto Landscape Material -2

运行时虚拟纹理 Runtime Virtual Texture

https://docs.unrealengine.com/5.3/zh-CN/runtime-virtual-texturing-in-unreal-engine/

运行时虚拟纹理 (RVT)在运行时使用GPU按需创建其纹素数据,工作方式与传统纹理映射类似。较大区域上的RVT缓存着色数据非常适用于使用贴花类材质的地形和适配地形的样条。

image

运行时虚拟纹理缓存,就是整个地形材质的材质结果。 它可以将所有材质数据缓存到纹理中。 之后我们可以通过自上而下的方法将该纹理重新应用到我们的地形上。

优点:

可以提高材质的性能,更具体地说,它可以提高复杂地形材质的性能。 image

查看场景的性能: 渲染场景,显示着色器复杂度 优化视图模式-着色器复杂度 image image

红色表示一个非常糟糕的结果。场景性能很低。

但使用运行时虚拟纹理可以将着色器复杂性从红色变为绿色。

它还可以帮助我们将非地形Actor与地形融合在一起。 image 这块岩石目前正在与我们的地形材质混合。 岩石顶部的材质是它的原始材质,岩石底部的材质是地形材质。 之间有一个很好的过渡区域,显示这两种不同的材质相互融合。 而这只能通过运行时虚拟纹理来实现。

缺点

运行时虚拟纹理的缺点和限制是它不适用于动态事物。 例如,CameraDepthFade 相机深度消退。运行时虚拟纹理不适用于任何动态事物。 它不知道相机。也不知道时间 Time。 如果当前正在使用运行时虚拟纹理的材质进行动画,动画则不会工作。 例如使用 World Position Offset 制作的岩石浮动材质。 image image

设置运行时虚拟纹理 Set Up Runtime Virtual Texture

image 在项目设置中启用RVT支持 Enable RVT support in project settings 将材质数据输出到RVT Output material data to RVT 将RVTasset指定到地形 Assign RVTasset to landscape 指定RVTVolume体积 Specify RVTVolume 在地形材质中使用RVT数据 Use RVT data in landscape materia

在项目设置中启用RVT支持

编辑-项目设置-引擎-渲染-虚拟纹理-启用虚拟纹理支持 image

Transform

https://docs.unrealengine.com/5.3/zh-CN/vector-operation-material-expressions-in-unreal-engine/#transform Transform(变换) 材质表达式将三通道向量值从一种参考坐标系转换到另一种参考坐标系。

默认情况下,材质的所有着色器计算都在切线空间中完成。向量常量、摄像机向量和光线向量等在材质中使用之前,都会转换到切线空间。Transform表达式允许将这些向量从切线空间转换到全局空间、局部空间或视图空间坐标系。另外,它允许将全局空间和局部空间向量转换到任何其他参考坐标系。

当材质图表中选中了Transform节点时,细节面板中会显示以下属性:

属性 说明
源(Source) 指定要转换的向量的当前坐标系。这可以是以下其中一项:全局(World)、局部(Local)或切线(Tangent)。
目标(Destination) 指定要将向量转换到的目标坐标系。这可以是以下其中一项:全局(World)、视图(View)、局部(Local)或切线(Tangent)。

Transform节点会对镜像 UV 加以考虑,例如,以使凸显仅影响人物的右侧边缘。

对于生成全局空间法线以便对立方体贴图进行取样,Transform节点非常有用。法线贴图可转换到全局空间。以下示例将法线从 切线空间 转换到 全局空间,以便对立方体贴图进行取样。

image

将法线转换到视图空间可用于创建边缘效果。这可通过使用网格法线生成纹理坐标(通常称为"球面映射")来实现。使用这种方法,正对着摄像机的法线将映射到纹理坐标的中心,而垂直于摄像机的法线将映射到纹理坐标的边缘。例如,你可以使用Transform表达式来映射一张准星纹理,让它始终面对摄像机。 image 值为 (0,0,1) 的 Constant3Vector(常量 3 向量)输送到设置了 TRANSFORM_View 的 Transform,接着将结果传递到 ComponentMask(分量蒙版)(仅传递 R 和 G)。因为 Transform将输出 -1 到 1 范围内的值,我们必须使这些值偏离以使其处于 0-1 范围内。实现方法是乘以 0.5 再加上 0.5。然后,直接将结果连接到纹理的"坐标"(Coordinates)。 image 围绕静态网格体旋转时,准星会一直对准屏幕。但如果把变幻节点中的 目标 改为 世界空间(World Space) 而非视图空间,则准星会朝上。

由于插值器受限制,VertexColor(顶点颜色)与 Transform节点互斥。如果您同时使用 Transform节点和 VertexColor(顶点颜色),那么 VertexColor(顶点颜色)的结果为全白色。

目前,Transform节点无法正确处理不一致的比例缩放。

将材质数据输出到RVT

使用节点 材质表达式运行时虚拟纹理输出 Runtime Virtual Texture Output 输出RVT image

打开 M_AutoLandscape 在 混合材质层 部分,添加 Runtime Virtual Texture Output

缓存 混合材质层 的 SetMaterialAttributes 为 CachedDefaultLandscapeMaterialOutput 用来缓存获取地形材质 image

添加 GetMaterialAttributes CachedDefaultLandscapeMaterialOutput 输出至 GetMaterialAttributes

GetMaterialAttributes 添加属性:BaseColor,Specular,Roughness,Normal image BaseColor,Specular,Roughness 输出至Runtime Virtual Texture Output 同名节点。

Normal 需要经过变换才能输出至 Runtime Virtual Texture Output 同名节点.

添加 切线空间 到 世界场景空间 TransformVector [节点名为Transform] image image

image 原因是为了使法线贴图能够在关卡中的其他静态匹配上正常工作。 如果我们想要将所有静态匹配与该地形材质混合,我们必须执行此步骤。这将保证一切正常。 因此,需要将法线从切线空间转换为工作空间,并将其插入法线插座。

WorldHeight 将存储我们整个地形的更多信息。稍后可以用它来生成一个遮罩来混合材质。

添加 绝对世界位置 Absolute World Position ,用Mask遮罩其B通道只获取高度 Z值,输出至Runtime Virtual Texture Output 的 WorldHeight。

image

为地形分配一个运行时虚拟纹理资源。

将Runtime Virtual Texture Output输出数据的所有数据存储到这个纹理中。

新建 运行时虚拟纹理 RVT_Landscape 右键-纹理-运行时虚拟纹理 image image 这将在创建资产后存储我们地形的材质数据。 需要将其分配给我们的地形。

选择地形,搜索 virtual 细节面板-虚拟纹理-在虚拟纹理中绘制 image 指定要使用哪个纹理来存储数据。 添加一行,选择 RVT_Landscape image 所有输出数据都将进入该虚拟纹理。

指定RVTVolume体积

为了输出数据能够正常工作,我们还需要指定一个体积,运行时虚拟纹理数据工作的体积。

方法1

选择地形,搜索 virtual 细节面板-虚拟纹理-创建体积 点击按钮即可 image 这将创建 RuntimeVirtualTextureVolume0

image 该虚拟纹理体积将自动包含整个地形 image 重命名该体积为 RVTVolume_Lanscape image

方法2

放置Actor面板-体积 image image 添加 运行时虚拟纹理体积 image 选择 运行时虚拟纹理体积-细节面板-从边界构造变换-边界对齐Actor-点击吸管工具 选择地形 image 选择 运行时虚拟纹理体积-细节面板-虚拟纹理-虚拟纹理-选择 RVT_Landscape image

选择 运行时虚拟纹理体积-细节面板-从边界构造变换-设置边界-设置边界 按钮,点击使体积适配地形 image image

在地形材质中使用RVT数据

使用节点 Runtime Virtual Texture Sample 打开 M_AutoLandscape 需要将 运行时虚拟纹理输出 返回到地形 添加 Runtime Virtual Texture Sample Runtime Virtual Texture Sample-细节面板-虚拟纹理-虚拟纹理-选择 RVT_Landscape 注意虚拟纹理内容。 image

添加 SetMaterialAttributes,为其添加属性 BaseColor,Specular,Roughness,Normal image Runtime Virtual Texture Sample 的 BaseColor,Specular,Roughness 节点连接至 SetMaterialAttributes 同名节点。 Normal 需要经过变换再连接。 与运行时虚拟纹理输出相反,需要变换回来以获得正确的阴影。 添加 TransformVector [节点名为Transform] 源:世界场景空间 目标: 切线空间 image 转换Normal,连接。 image

缓存 SetMaterialAttributes 【运行时虚拟纹理输出】为 CachedRVTLandscapeMaterial

image

在混合材质层,即最终输出部分,添加开关 UseRuntimeVirtualTexture 决定是否使用运行时虚拟纹理 分组:00-GlobalControl UseRuntimeVirtualTexture - True :CachedRVTLandscapeMaterial UseRuntimeVirtualTexture - False :CachedDefaultLandscapeMaterialOutput

UseRuntimeVirtualTexture 输出至最终输出 M_AutoLandsacpe

image image

MI_AutoLandscape

启用运行时虚拟纹理 image 进入 优化视图模式-着色器复杂度 查看性能 image

创建运行时虚拟纹理混合材质 Create Runtime Virtual Texture Blend

将 RVT与其他材质混合 image image

M_RVTBlend

创建示例材质 M_RVTBlend,材质实例MI_RVTBlend

在关卡添加测试球体,使用材质实例 MI_RVTBlend

打开 M_RVTBlend

物体材质:

添加 BlendMaterialAttributes

选择主材质输出节点 M_RVTBlend-细节面板-材质-使用材质属性-启用 将主输出折叠以接受BlendMaterialAttributes输出的完整材质。 image image

添加 SetMaterialAttributes 以设置颜色属性为材质 SetMaterialAttributes 添加属性 BaseColor image image

SetMaterialAttributes 输出的物体材质缓存为 CachedOriginalMaterial

地形运行时虚拟纹理材质

添加节点 Runtime Virtual Texture Sample,使用虚拟纹理 RVT_Landscape image 为 Runtime Virtual Texture Sample 添加节点 SetMaterialAttributes SetMaterialAttributes 添加属性 BaseColor,Specular,Roughness,Normal

添加 TransformVector [节点名为Transform] 用以转换Normal 源:世界场景空间 目标:切线空间

SetMaterialAttributes 输出的地形材质缓存为 CachedRVTLandscapeMaterial image

混合两种材质

image

RVT Mask

image 需要使用存储在运行时虚拟纹理中的高度数据. 需要为高度数据创建一个运行时虚拟纹理资产并将它分配给地形。并且需要指定它自己的体积。 image

新建 运行时虚拟纹理 RVT_Height 打开 RVT_Height-布局-虚拟纹理内容-场景高度 image

选择地形-细节面板-虚拟纹理-在虚拟纹理中绘制-再添加一个资产,选择 RVT_Height。 这将存储地形材质输出的高度信息。 image 为了让数据能够正常工作,还需要指定它自己的体积。

将关卡中已存在的 虚拟纹理体积 RVTVolume_Landscape 拷贝一份,重命名为 RVTVolume_Height image

指定 RVTVolume_Height 的纹理资产 RVTVolume_Height-虚拟纹理-虚拟纹理-RVT_Height image 现在可以访问来自运行时虚拟纹理的高度数据。

打开 M_RVTBlend 添加节点 Runtime Virtual Texture Sample,使用虚拟纹理 RVT_Height 缓存 Runtime Virtual Texture Sample 的 WorldHeight 为 CachedRVTHeight image

添加 Absolute Wold Position 绝对世界位置 ,遮罩 B通道获取高度Z值。对其减去 CachedRVTHeight

image

现在通过雪材质一样的原理来设置物体材质与地形材质在物体上的分布。 只是分界点Z存储在 CachedRVTHeight。 image

添加 SetMaterialAttributes SetMaterialAttributes 添加属性 BaseColor 为 CachedRVTHeight 添加控制参数 RVTMaskStartHeight

预览遮罩效果 image 打开 MI_RVTBlend RVTMaskStartHeight :50 image image

打开 M_RVTBlend 使用高度值混合材质

为 RVT添加 控制 Divide, 添加控制参数 RVTMaskFallOff 默认100 添加 Saturate 限制高度遮罩 0-1 添加 1- 反转高度遮罩,使上黑下白,上位物体材质,下位地形材质。 缓存高度遮罩为 CachedRVTMask image 删除多余的 SetMaterialAttributes

将 CachedRVTMask 输出至 BlendMaterialAttributes 的 Alpha BlendMaterialAttributes 混合后的材质输出给主材质输出 M_RVTBlend image

完整图 image

打开 MI_RVTBlend image 无论如何移动物体,地面上的物体将与地形材质混合。 image image

提高运行时虚拟纹理样本

使材质不模糊 打开 RVT_Landscape image

尺寸-虚拟纹理大小(以切片计)-10 image

在物体材质中使用RVT混合材质 Use RVT Blend In Material

添加石头物体使用RVT混合材质

image 找到物体位置 image 打开石头材质实例,找到父项主材质 image image 复制一封 父项主材质为 M_MS_Default_Material_RVTBlend 打开 M_MS_Default_Material_RVTBlend

创建运行时虚拟纹理混合材质函数 MF_RVTBlend

输出重命名为:RVTBlendedMaterial

打开 M_RVTBlend 主材质,复制 地形运行时虚拟纹理材质 部分节点 至 MF_RVTBlend image

打开 M_RVTBlend 主材质,复制 RVT Height 高度值 部分节点 至 MF_RVTBlend image

打开 M_RVTBlend 主材质,复制 高度遮罩 部分节点 至 MF_RVTBlend image RVTMaskStartHeight 分组:00-RVTBlend RVTMaskFallOff 分组:00-RVTBlend

打开 MF_RVTBlend 添加 函数输入材质属性 BaseMaterialForBlending ,缓存为 CachedBaseMaterial

添加 BlendMaterialAttributes

添加 开关参数 UseRVTBlend 分组 00-RVTBlend image

MF_RVTBlend 完整图: image

岩石母材质混合版

打开 M_MS_Default_Material_RVTBlend 拖入材质函数 MF_RVTBlend 至最终输出 原材质输出至 MF_RVTBlend 输入节点。 MF_RVTBlend 输出至总输出节点。

原材质: image

整合 MF_RVTBlend: image

岩石的材质实例 MI_Canyon_Sandstone_Rocks_Pile_umcjabuva_2K 的父项材质改为 混合版材质 M_MS_Default_Material_RVTBlend image image

岩石的材质实例 MI_Canyon_Sandstone_Rocks_Pile_umcjabuva_2K : 调节 参数 UseRVTBlend RVTMaskStartHeight RVTMaskFallOff image image

自动植被 Auto Foliage

修复土壤错误材质高光

打开 MI_AutoLandscape 增加材质粗糙度 06-SlopeLayer -- SlopeLayer_DetailedAdjustment -- MinRoughness 06-SlopeLayer -- SlopeLayer_DetailedAdjustment -- MaxRoughness image

自动生成植被

image image

方法1: Landscape Grass Type 地形草地类型

https://docs.unrealengine.com/5.3/zh-CN/grass-quick-start-in-unreal-engine/

优点: 可以实时预览所有更改。 它的工作原理与我们的材质实例非常相似。 每当进行一些更改时,界面就能够实时看到更改。

局限性: 它的局限性是它严重依赖遮罩。 为了使这种方法发挥作用,需要一个遮罩来指定叶子生长的位置。 生成遮罩的方法也有多种。

此方法生成的树叶不会发生碰撞。

对于草来说,通常我们不希望发生任何碰撞。 使用这种方法来生成树,这些树也将不会发生碰撞。 这意味着如果您控制场景中的角色,您可以穿过这些树木。

方法2:Procedural Foliage Spawner 程序化植被工具

https://docs.unrealengine.com/5.3/zh-CN/procedural-foliage-tool-in-unreal-engine/

优点: 可以指定一个体积来告诉引擎希望叶子在哪里生长,我们可以根据自己的喜好指定具体的位置。

它不需要遮罩。

有时这可以节省计算所有遮罩所需的大量时间,甚至可以手工绘制这些遮罩。

用这种方法生成的树叶可以发生碰撞。

缺点: 速度可能很慢。 无法预览我们所做的所有更改。 如果你的体积很大并且里面有很多树叶,这有时可能需要很长时间

下载植被树木资源包

open world demo collection 开放世界演示集 image

megascans trees:european black alder (early access) Megascans树木:欧洲桤木(抢先体验) Megascans - 该抢先体验合集包含22种唯一模型,覆盖不同树龄,可帮你构建起照片级逼真的桤木树林。该资产包含有一种强大的植被主材质,可控制季节和风向。 image

目录:BlackAlder,KiteDemo

地形草地类型 Landscape Grass Type

LOD、剔除距离和地形层样本 LOD,Cull Distance and Landscape Layer Sample

设置步骤: 1-创建一个地形草类型资产 create a LGT asset 2-在材质图中创建一个专门为此资产设计的节点。 3-指定遮罩。 image 要使此方法发挥作用,需要一个遮罩来指定植被的位置。 image

创建一个地形草类型资产 create a LGT asset

指定静态网格体。

右键-植被-地形草类型 名称:LGT_Grass image image 打开 LGT_Grass 细节-草地-草地种类 添加一个草地种类:

草地网格体 - SM_fieldGrass_01

草地密度质量 - 200 决定草的密度

起始剔除距离: 如使用PerlnstanceFadeAmount材质节点,实例将开始淡出的距离。0值则禁用。 直接决定树叶或网格何时开始消失。 当它们与相机之间的距离达到该值时,其中一些将开始消失。 通过适当设置这个距离,我们可以得到更好的性能。

起始剔除距离质量:

结束剔除距离: 使用一个PerlnstanceFadeAmount材质节点时实例完全淡出的距离。为0则禁用此项。 整个簇超过此距离时,簇将被完全剔除,完全不会被渲染。 当距离达到该值时,该网格的所有类型都将在我们的场景中消失。

结束剔除距离质量:

最小 LOD: 指定将用于此组件的最小LOD。 如为-1(默认),将转而使用静态网格体资产的MinLOD。 它可以帮助我们减少网格的多边形数量。 依赖于场景中草与相机的距离。与相机距离越远,草地细节越少。 例如草 : LOD 0 - 765 个三角形 LOD 1 - 278 个三角形 LOD 2 - 18 个三角形 image

屏幕尺寸 current screen size 决定了应该使用哪种LOD。 打开一个树木的静态网格体 image

LOD选取器-LOD 可手动更改设置 image

当屏幕尺寸为 1 时,使用LOD 0 image 当屏幕尺寸为 0.99 时,使用LOD 1 image

缩放:指定草地实例缩放类型 统一 - 草地实例将拥有统一的X、Y和Z标度 自由 - 草地实例将拥有随机的X、Y和Z标度 锁定XY - X和Y将为相同的随机标度,Z将为另一个标度 image

投影动态阴影:可极大提高场景性能 image

在材质图中创建一个专门为此资产设计的节点

打开 M_AutoLandscape

添加 节点 材质表达式地形草地输出 LandscapeGrassOutput LandscapeGrassOutput - 细节-U材质表达式地形草地输出-草地类型-索引0-草地类型-选择一个地形草地类型 :LGT_Grass image image

指定遮罩

打开 M_AutoLandscape

添加 节点 材质表达式地形图层采样 LandscapeLayerSample 地形图层采样输出一个浮点数,即遮罩。 没有输入,但可以通过参数名指定遮罩 image

参数名为该地形材质的某一材质层。 材质层 由 Landscape Layer Blend 节点指定 image

例如GrassMaterial 如果在参数名称中输入此名称,将输出一个仅包含白色值的遮罩.在使用该层的部分上 image

设置 LandscapeLayerSample 参数名:SoilMaterial LandscapeLayerSample 输出至 LandscapeGrassOutput 这将地形材质中土壤层材质遮罩输出给 地形草地类型 的 地形草 :LGT_Grass image

现在,地面上将出现草地植被。 这是由于地形默认层为草地层+土壤层,土壤层教习庶,故地形草地类型 LGT_Grass 也稀疏。 image 它的工作原理是每当我们将这一层土壤层绘制到地形上时,草也会在该层上生成。

例如进入地形模式-绘制-绘制 选择土壤层绘制。【土壤层输出遮罩值1,由 LGT_Grass 使用】 将出现大片土壤和之上的草地类型 LGT_Grass 植被。 image image

我们想要的是一键生成草,而不是手动绘制图层。为此,需要创建另一个遮罩。

创建植被遮罩 Create A Foliage Mask

填充植被 populate foliage

清除土壤层以清除生成 的LGT_Grass 植被。

地形模式-绘制-绘制-土壤层-右键-清除图层 在整个地形上将此图层清除至0%。若此图层为权重混合(法线)图层,将对其他混合权重图层进行调整,以便抵消. image

新的植被遮罩

想更有效地生成草,显然我们需要一个新的遮罩。 我希望草生成的区域就在这里的某个地方。 不希望草生成山峰,因为这没有意义,也不在斜坡上。 所以需要在山峰的Y值的反转。 同时需要坡度的Y值的反转。HeightMask [HeightMask也由雪材质所使用] image

打开 M_AutoLandscape 拖入材质函数 MF_HeightBlend 至 Landscape Grass 节点附近 添加constant 1参数 FoliageMaskStartHeight 植被遮罩起始高度 分组:00-GlobalControl 添加constant 1参数 FoliageMaskFallOff 植被遮罩消退距离 默认500 分组:00-GlobalControl

MF_HeightBlend - HeightMaskStartHeight : FoliageMaskStartHeight MF_HeightBlend - HeightMaskStartFallOff : FoliageMaskFallOff

MF_HeightBlend 输出至 Landscape Grass

image

此时,植被会在山上生成。所以需要反转该值。

MF_HeightBlend 之后添加 oneMinus 节点 image

打开 MI_AutoLandscape 手动调整 FoliageMaskStartHeight,FoliageMaskFallOff 以生成植被。 参考地面上的物体的位置 Z 1499 image FoliageMaskStartHeight - 1499 FoliageMaskFallOff - 100

继续 增大 FoliageMaskStartHeight -2763 植被将出现在斜坡上,这不符合自然规律。 image image

之所以长在斜坡上,是因为我们只有一个高度值HeightMask来限制草。 因此同时需要坡度值SlopeMask的反转来限制。 当前植被减去SlopeMask即可。 image

为 MF_SlopeBlend 增加遮罩输出

打开 MF_SlopeBlend 添加节点 FunctionOutput ,重命名 SlopeMaskUsed 将 坡度遮罩同时输出至 SlopeMaskUsed image

M_AutoLandscape

打开 M_AutoLandscape 1-定位到 材质混合过渡 部分 缓存材质混合过渡的坡度混合函数 MF_SlopeBlend 的 输出节点 SlopeMaskUsed 为 CachedTransitionSlopeBlendMask

image

2-定位到 坡度混合 部分 缓存 坡度混合 的坡度混合函数 MF_SlopeBlend 的 输出节点 SlopeMaskUsed 为 CachedSlopeBlendMask image

3-从植被遮罩中减去2个坡度遮罩 CachedTransitionSlopeBlendMask 和 CachedSlopeBlendMask

添加Saturate 限制最后的值在 0-1 之间。

添加开关 UseAutoGrass 控制是否自动生成植被 -分组 00-GlobalControl True 植被 False 输入0

image

4-打开 MI_AutoLandscape 开启自动植被生成 image 同时斜坡没有植被 image

植被比较消耗性能。

植被性能优化 Performance Optimization For Foliage

image

方法1-虚拟阴影贴图 Virtual Shadow Map

https://docs.unrealengine.com/5.3/zh-CN/virtual-shadow-maps-in-unreal-engine/ 高分辨率阴影系统。该系统专为处理电影级品质资产以及为大型开放世界动态打光而设计。

虚拟阴影贴图(VSM)是一种全新的阴影贴图方法,可以提供稳定的高分辨率阴影。通过与虚幻引擎5的Nanite虚拟几何体Lumen全局光照和反射以及世界分区功能结合使用,它能够实现电影级的品质效果,为大型开放场景提供光照。

虚拟阴影贴图只是分辨率非常高的阴影贴图。

但是它提供的阴影质量,在我们的场景中可能非常昂贵。

启用虚拟阴影贴图

在项目设置(Project Settings)的 引擎(Engine)>渲染(Rendering) 的 阴影(Shadows) 分段中,你可以设置项目支持的 阴影贴图方法(Shadow Map Method) ,可以是 虚拟阴影贴图(Virtual Shadow Maps) 或是此前虚幻引擎版本中的传统 阴影贴图(Shadow Maps) 。

image 虚拟阴影贴图 比 阴影贴图 效果更好,但性能稍差。 image

既保留虚拟阴影贴图,同时又稍微提高性能

输入控制台命令: 通过键入此控制台命令并键入0将禁用不匹配的跨页。 对于植被,Epic 建议我们关闭此功能,这可以明显提高性能。

r.Shadow.Virtual.NonNanite.IncludeInCoarsePages 0

使用这个命令,可以关闭远处植被的阴影

r.Shadow.Virtual.UseFarShadowCulling 0

方法 2 关闭 投射动态阴影

打开 地形草地类型 LGT_Grass 草地-草地种类-索引0-投射动态阴影 关闭 image 但植被效果会降低。

方法3 减少 场景中的 LOD 三角形数量

打开 地形草地类型 LGT_Grass 通过 草地-草地种类-索引0-草地网格体 找到该植被的静态网格体 文件 image

打开 SM_FieldGrass_01 静态网格体 细节-LOD选取器-LOD 改为手动 手动设置每一级别LOD,增大对应LOD的 屏幕尺寸,使该LOD尽早在大屏幕尺寸时启用。 以减少场景的三角形数量。LOD2比LOD1 的三角形数量更少。 image

方法4 消隐距离 Cull Distance

通过减少这个距离,场景中的草就会减少. 打开 地形草地类型 LGT_Grass

起始剔除距离: 结束剔除距离: image

方法 5 禁用风

我们导入到场景中的大多数植被都会有风效果。

打开 地形草地类型 LGT_Grass 通过 草地-草地种类-索引0-草地网格体 找到该植被的静态网格体 文件 再定位其主材质 M_FieldGrass_01 image

打开 M_FieldGrass_01 定位到 Wind 部分节点,断开时间Time节点 image 这将禁用此类材质的所有风和所有运动。 image

草地消退 Fade In Grass

PerInstanceFadeAmount and Dither AA

当前 移动时的植被边缘过于明显 image

这是因为 结束剔除距离之外的草的不透明度立即为0. 我希望不透明度从0慢慢增加到1。 image

这与不透明度密切相关。 这意味着需要对材质图内部的不透明度进行一些处理。 实现植被的不透明度和半透明度。

不透明蒙板 Opacity Mask

https://docs.unrealengine.com/4.27/zh-CN/Resources/ContentExamples/MaterialNodes/1_8/ 不透明遮罩(Opacity Mask) 类似于不透明度(Opacity),但仅在使用遮罩(Masked)混合模式时可用。与不透明度(Opacity)一样,它的值在0.0到1.0之间,但与不透明度(Opacity) 不同 的是,结果中看不到不同深浅的灰色。 在遮罩模式下时,材质要么完全可见,要么完全不可见。当你需要可以定义复杂实心表面(如铁丝网、链环围栏等等)的材质时,它将成为一种理想的解决方案。不透明部分仍将遵循光照。

你可以使用基础材质节点上的 不透明度遮罩剪切值(Opacity Mask Clip Value) 属性来控制剪切发生点。欲知更多详情,请参阅遮罩混合模式文档

寻找草的主材质

打开 地形草地类型 LGT_Grass 通过 草地-草地种类-索引0-草地网格体 找到该植被的静态网格体 文件 image 打开草的静态网格体 image 你可以看到通常对于不同的负载会使用不同的材质。 单击此放大镜可以选择其中之一,它将带您到材质实例所在的位置。 image

双击打开材质实例 M_FieldGrass_Inst_01,向下滚动到 父项,M_FieldGrass_01 是它的主材质。 image image

打开 主材质 M_FieldGrass_01 查看 连接到 不透明蒙版 的节点 Diffuse 漫反射 image image

定位Diffuse 漫反射使用的纹理 T_FieldGrass_01_D image

打开 纹理 T_FieldGrass_01_D,查看Alpha 通道,即 该材质不透明蒙版使用的通道 image

植被使用不透明蒙版而不使用不透明度是因为不透明蒙版的性能消耗更低。 通过不透明蒙版操作来实现半透明通常比直接操作要便宜得多。 不透明度,不透明蒙版非常相似,但有一些差异。 不透明蒙版仅在蒙版模式下可用。 不透明蒙版,材质最终结果将是完全可见或不可见。所以没有中间过渡。 如果插入灰度值,则需要调整不透明度蒙版剪切值。

为了实现植被消退,需要对不透明蒙版套接字进行一些操作

需要根据距离值来缓慢的溶解。 使用节点 PerInstanceFadeAmount(按实例消退量) https://docs.unrealengine.com/5.3/zh-CN/constant-material-expressions-in-unreal-engine/#perinstancefadeamount

输出结果与相机深度消退类似。 它将输出一个遮罩,但该遮罩的行为方式将取决于消退距离。 PerInstanceFadeAmount(按实例消退量)表达式输出一个浮点值,该值与应用于实例化静态网格(例如植物叶子)的消退量相关联。它是常量,但对于网格的每个实例,可以是不同的数值。

使用节点 DitherTemporalAA 它会根据数据模式在地图上戳洞,只是一堆小黑点。

输入为 PerInstanceFadeAmount ,决定 DitherTemporalAA 开始溶解的距离

材质函数 MF_FoliageFade 植被渐变消退

新建材质函数 FoliageFade 输出改为名:FadeInOpacityMask

添加 PerInstanceFadeAmount 读取距离值 PerInstanceFadeAmount - Random 定义随机性

添加 DitherTemporalAA

添加 函数输入标量 OriginalOpcityMask 读取材质的原始不透明蒙版, 缓存为 CachedOriginalOpcityMask 不开启消退时使用该值

将 OriginalOpcityMask 与 PerInstanceFadeAmount 相乘合并

添加开关 UseFoliageFade 分组:00-FoliageFade ,默认为True

image

再主材质中使用 MF_FoliageFade

打开草地主材质 M_FieldGrass_01 da 拖入 MF_FoliageFade 连接在 不透明蒙版处,源节点输入至 MF_FoliageFade。 image 起始剔除距离1000, 结束剔除距离2000

启用MF_FoliageFade: image

未启用MF_FoliageFade: image

启用颤动LOD转换 -去除不同LOD的过渡线

这在起始剔除距离和结束距离较大时非常明显 起始剔除距离3000, 结束剔除距离3500 image

解决方案: 打开草地主材质 M_FieldGrass_01 细节面板- 【搜索 dither】材质-高级-颤动LOD转换 启用 image 不同LOD的过渡线不在那么明显 image

添加更多种类的草

打开 地形草地类型 LGT_Grass 草地-草地种类-添加一个种类-SM_DeadLeaves 从索引0的草位置找到其他类别草。【过滤静态网格体】 image

草低密度:10 起始剔除距离500, 结束剔除距离1000

image

修复 SM_DeadLeaves 的过渡问题

打开 SM_DeadLeaves 的主材质 M_DeadLeaves image

拖入 MF_FoliageFade 到不透明蒙版。 按 Ctrl + 左键 重新连接 image

image

起始剔除距离2000, 结束剔除距离5000 image

自动树木 Auto Trees

在地形材质中创建树木 地形草地类型

虚幻引擎使用Nanite 解决多边形过多时的性能问题。

创建树木 地形草地类型

image

新建地形草地类型 LGT_Trees

image 打开 LGT_Trees 细节面板-草地-草地种类-添加一个种类 草地网格体-SM_BlackAlder_Field_02 草地密度-0.1 【关键】 树木性能消耗较高。 缩放X-最小 0.7. 最大1.2 增加随机性 起始剔除距离3000, 结束剔除距离5000 最小 LOD -1 image

在材质图中创建一个专门为此资产设计的节点,并指定遮罩。

打开 M_AutoLandscape 定位到自动生成植被区域

在Saturate 输出节点 缓存 植被 遮罩数据为 CachedFoliageMask image

选择 材质表达式地形草地输出 节点 image

在 细节面板-草地类型-新增一种草地类型 命名:Trees 草地类型 :LGT_Trees image

添加开关 UseAutoTrees 输出至 Landscape Grass 的 Trees。 分组 00-GlobalControl UseAutoTrees 的输入使用 CachedFoliageMask 和 常量0 image image

打开 MI_AutoLandscape

开启 UseAutoTrees image

修改项目配置文件以优化性能

打开 E:\Unreal Projects 532\LearnMaterial\Config\DefaultEngine.ini 每次打开编辑器时,该命令会自动运行

r.Shadow.Virtual.Enable=1
r.Shadow.Virtual.NonNanite.IncludeInCoarsePages=0

修复树木摇晃问题

这是由于风力强度过大,需要找到其父项材质修改。 通过 LGT_Trees 找到树木静态网格体。 image 点击第一个定位到其材质实例,打开 image image 定位到父项主材质 MAI_BlackAlder image 打开 父项主材质 MAI_BlackAlder 调节 10-wind-wind animation strength :0.01 风力动画强度 image image

环境碰撞 Block Surrounding

隐藏远处的蓝色空间

image 下载资产包 Landscape Backgrounds image

image 有一些非常漂亮的背景,可以让我们隐藏场景中的空白。

内容浏览器-PhotoR_Backgrounds-Meshs :这里有适合不同季节的山。 image Modular_Spring 文件夹,过滤静态网格体 image

导航到场景边缘,拖入山网格体,缩放至约场景大小, image

image

设置/导航到场景书签:ctrl + 数字0-9 【非小键盘】 移动到自定义位置后设置。 按 0 -9 可移动到自定义位置。 image

复制多个山,包围场景。旋转调整位置。

image image

后处理效果 Post Processing

土壤层不生成植被

打开 M_AutoLandscape 定位到植被遮罩区域 image 在 Saturate 之后添加节点 Subtract ,减去土壤材质层,表示土壤层裸漏,上面不生成植被。可用于生成小路。 添加 Landscape Layer Sample 节点。 细节面板-参数名: SoilMaterial 【 土壤材质层】 image

参数名来自 Landscape Layer Blend 节点的索引图层名称 image

完整: image

可进入地形模式,使用土壤层绘制小路。

后期处理效果 Post Process Effects

https://docs.unrealengine.com/5.3/zh-CN/post-process-effects-in-unreal-engine/ 在渲染之前应用于整个渲染场景的效果。 PostProcessVolume image

后期处理效果 面板 image

场景亮度:

PostProcessVolume-细节面板-镜头-Exposure-计量模式-手动 PostProcessVolume-细节面板-镜头-Exposure-曝光补偿-10.8 image

温度

PostProcessVolume-细节面板-镜头-颜色分级-Temperature-色温类型-色温 PostProcessVolume-细节面板-镜头-颜色分级-Temperature-色温-5420 【黄昏】 image

image

光晕

PostProcessVolume-细节面板-镜头-Lens Flares-强度-2

image

image

旋转定向光 Ctrl + L

image

定向光 光束泛光

选择定向光 DirectionalLight image

细节面板-光束-光束泛光 启用 细节面板-光束-泛光范围-0.05 细节面板-光束-泛光颜色-淡黄色

image image

WangShuXian6 commented 10 months ago

最终材质图

Materials - 
--Example
----HeightMask
------M_HeightMask
------MI_HeightMask
----RVTBlend
------M_RVTBlend
------MI_RVTBlend
----SlopeMask
------M_SlopeMask
------MI_SlopeMask
----TilingBreak
------M_TilingBreak
------MI_TilingBreak
----TriplanarProjection
------M_TilingBreak
------MI_TilingBreak
--Foliage
----Grass
------LGT_Grass
----Trees
------LGT_Trees
--MaterialFunction
----FoliageFade
------MF_FoliageFade
----HeightBlend
------MF_HeightBlend
------MF_HeightBlendSubtractSlope
----MacroVariation
------MF_MacroVariation
------T_MacroVariation
----RVTBlend
------MF_RVTBlend
----SlopeBlend
------MF_SlopeBlend
----TriplannerProjection
------MF_TriplanarProjection
------MF_TriplanarProjection_Normal
----MF_LandscapeMaterialProcess
----MF_Triplanar_LandscapeMaterialProcess
--RuntimeVirtualTexture
----RVT_Height
----RVT_Landscape
--TextureCellBombing
----MF_TextureBombing_Landscape
----T_Voronoi_Perturbed_4k
--M_AutoLandscape
--MI_AutoLandscape
--M_Master1

Example

HeightMask

M_HeightMask

M_HeightMask

MI_HeightMask

MI_HeightMask

RVTBlend

M_RVTBlend

M_RVTBlend

MI_RVTBlend

MI_RVTBlend

SlopeMask

M_SlopeMask

M_SlopeMask

MI_SlopeMask

MI_SlopeMask

TilingBreak

M_TilingBreak

M_TilingBreak

MI_TilingBreak

MI_TilingBreak

TriplanarProjection

M_TilingBreak

M_TilingBreak

MI_TilingBreak

MI_TilingBreak

Foliage

Grass

LGT_Grass

LGT_Grass

Trees

LGT_Trees

LGT_Trees

MaterialFunction

FoliageFade

MF_FoliageFade

MF_FoliageFade

HeightBlend

MF_HeightBlend

MF_HeightBlend

MF_HeightBlendSubtractSlope

MF_HeightBlendSubtractSlope

MacroVariation

MF_MacroVariation

MF_MacroVariation

T_MacroVariation

RVTBlend

MF_RVTBlend

MF_RVTBlend

SlopeBlend

MF_SlopeBlend

MF_SlopeBlend

TriplannerProjection

MF_TriplanarProjection

MF_TriplanarProjection

MF_TriplanarProjection_Normal

MF_TriplanarProjection_Normal

MF_LandscapeMaterialProcess

MF_LandscapeMaterialProcess

MF_Triplanar_LandscapeMaterialProcess

MF_Triplanar_LandscapeMaterialProcess

RuntimeVirtualTexture

RVT_Height

RVT_Height

RVT_Landscape

RVT_Landscape

TextureCellBombing

MF_TextureBombing_Landscape

MF_TextureBombing_Landscape

T_Voronoi_Perturbed_4k

M_AutoLandscape

M_AutoLandscape

MI_AutoLandscape

MI_AutoLandscape-1 MI_AutoLandscape-2 MI_AutoLandscape-3

M_Master

M_Master