在UE4中,几乎所有视觉元素都使用了**Material/材质**,材质可以应用于各种内容,例如网格、例子和UI元素
- 学习目标:
- 操作纹理以更改其亮度和颜色
- 使用材料示例快速创建变体
- 使用动态材质在玩家收集物体时更改头像的颜色
1.操作纹理
Texture/纹理是图像,而图像是像素的集合。在彩色图像中,像素的颜色由**R(红色)**、**G(绿色)**和**B(蓝色)**通道决定。- 在虚幻引擎中,
**RGB通道**的范围是(0.0 ~ 1.0),但是在大多数其他应用中,RGB通道的范围是 (0~255),但这只是显示相同信息的不同方式,而非实际色彩范围的差异。 - 纹理操作的工作原理是对纹理的每个像素执行操作,操作可以向通道添加值一样简单。
-
1.乘法节点
乘法节点:将一个输入乘以另一个输入
- 使用乘法节点,可以更改像素的亮度,而不会影响其色调或饱和度。对每个像素执行该操作,就可以更改整个纹理的亮度。

- 将乘法节点与蒙版纹理结合使用。使用蒙版,可以指定基础纹理的哪些区域变更暗)

**遮罩**之所以有效,是因为灰度表示**0(黑色)到1(白色)范围**,白色区域具有全亮度,因为通道乘以1。灰色区域更暗,因为通道乘以小于1的值。黑色区域没有亮度,因为通道乘以0
2.调整纹理亮度

**Alt + LMB**即可断开纹理与基色引脚之间的链接。- 快速操作:长按
**1**或**M**键,在空白处单击**LMB**快速创建**常量节点**和**乘法节点** 
- 此设置将循环访问每个像素,并将每个通道乘以
**Constant/常量**节点的值。最后生成的纹理随后输出为基色。 - 选择
**常量**节点,在**细节**->**材质表达式常量**->**值**进行常量的修改以完成对亮度的修改。 创建
**Material Instance/材质实例**比为每种颜色创建新材质更简单快捷。2.材质实例
Material Instance/材质实例是材质的副本,在基材中所作的任何更改也会在材质实例中进行。而材质实例无需重新编译即可对其进行更改。使用材质实例的情况:- 材料复杂,想要快速进行更改
- 想要创建基础材质的变体(更改颜色、亮度甚至纹理本身)
在创建材质实例之前,需要在基础材料中创建参数,这些参数将显示在材质实例中,并允许调整材质的属性。
1.创建参数材料
添加
**HueShift/材质函数调用**节点,并完成与**Multiply/乘法节点**->**HueShift-Texture(3)**,**Result**->**Base Color**的连接- 创建一个
**标量参数**节点,此节点包含单个值,并且可以在**材质实例**中进行编辑,创建后将其连接到**HueShift**节点上的**Hue Shift Percentage(S)**引脚。快捷指令:**长按S + LMB** 
- 将
标量参数节点重命名为HueShiftPercentage(色相偏移百分比),将常量节点转换为参数,再重命名为_Brightness_ 完成基础材料的实例化,
应用后关闭材质编辑器,然后进行材质实例的创建。2.创建材质实例
**RMB+基础材料**->**创建材质实例**->**命名**,**双击RMB+材质实例**进入材质实例编辑器
**Instance Parents/实例父项**:显示实例的父材质列表。- 更改
**Preview Mesh** 
- 在
Parameter Groups->Scalar Parameter Values勾选参数旁边的复选框激活使参数可编辑。 -
3.应用材质实例
单独编辑放置在场景中的
Actor,需要进行Details/细节->StaticMesh/静态网格组件
细节面板将静态网格组件的属性进行更新,将材质更新为MI_Banana_Green
2.材料动态变化
- 材料不必完全是装饰性的,也可以用它们来帮助游戏设计。
**Constant3Vector**节点非常适合选择颜色,因为其具有红色、绿色和蓝色通道。快速指令:**3 + LMB**要将颜色从白色更改为红色,需要一种在这两种颜色之间平滑过渡的方法。执行此操作的一种简单方法就是使用
**线性插值**1.线性插值
线性插值是一种查找A和B之间的值的方法
- 控制
**Alpha**时,线性插值就会发生变化,Alpha即是A和B之间的百分比,0的Alpha将返回A,而1的Alpha将返回B 线性插值可以与时间绑定,也可以使用某种物品的数量来控制Alpha
2.使用线性插值节点
**线性插值**节点的快速指令:**L + LMB**
线性插值节点将输出A输入的值,这是因为**alpha**的初始值为0。当**alpha**接近1时,输出接近B输入的值。要使立方体更改颜色,需要编辑**ColorAlpha**参数在
Play运行时,材质实例的参数无法被编辑,只能使用**动态材质实例**进行操作3.动态材质实例
与常规实例不同,
**动态材质实例**在**play**运行时也可以进行编辑,使用**C++**或**蓝图**进行操作。-
4.创建动态材质实例
当虚幻引擎生成
Actor,优先创建一个动态实例并将其应用于立方体网格- 添加一个
**Create Dynamic Material Instance(StaticMesh)/创建动态材质实例(静态网格)**节点,此节点将同时创建动态材质实例并将其应用于立方体网格 
- 为了便于引用该材料,应当将其存储在变量中,
RMB + Return Value—>Promote to Variable,将其升级为变量。在My Blueprint选项卡中,将变量New Var 0重命名为_**CubeMaterial**_ - 将
Event BeginPlay节点链接到Create Dynamic Material Instance(StaticMesh) - 该系列操作为 目标创建一个新的
动态材质实例,并将其应用于**StaticMesh**组件,然后将材质存储在名为CubeMaterial变量中。5.创建香蕉计数器

**On Component Begin Overlap(StaticMesh)**节点将在立方体与另一个执行组件重叠时执行**Cast To BP_Banana**节点将检查重叠时间中有无香蕉参与- 如果
Actor是香蕉,那么DestroyActor节点会将其销毁,使其从游戏中消失。
接下来创建一个用于存储收集香蕉数量的变量,之后每次立方体与香蕉重叠时,都会将变量递增1
- 创建一个
float变量命名为BananaCounter - 添加
**Increment Float**节点,使计数器递增1 
- 因为
线性插值节点的值在0 ~ 1之间,因此需要规范化将计数器转化为0 ~ 1的范围 - 添加一个
**Float / Float**节点,**Banana Counter**将作为输入值进入**Float / Float**节点,底部即为自行设定的分母 
- 使用
**Clamp**节点,将**alpha**保持在**0 ~ 1**的范围内 -
5. 更新材料
CubeMetarial变量拖放到Event Graph,并Get其属性- 添加
**Set Scalar Parameter Value**节点,此节点将为提供的值设定指定的参数 
- 将该节点的参数指定为
ColorAlpha,也就是立方体材质中创建的参数 
- 完成链接
6.总结步骤
**On Component Begin Overlap (StaticMesh)**: 当立方体与另一组件重叠时开始执行**Cast To BP_Banana**:检查重叠的参与者是否是香蕉**DestroyActor**: 将重叠事件中的香蕉销毁**Increment Float**:使Banana Counter变量递增1**Float / Float**:将传递过来的变量Banana Counter除以指定的数字以规范其范围**Clamp(float)**:限制除法的结果,使其处于0 ~ 1的范围**Set Scalar Parameter Value**:将立方体**ColorAlpha**设置为参数,其参数的变量取值是经过处理后范围为0 ~ 1的值
