在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
的值