在UE4中,几乎所有视觉元素都使用了**Material/材质**材质可以应用于各种内容,例如网格、例子和UI元素

  • 学习目标:
    • 操作纹理以更改其亮度和颜色
    • 使用材料示例快速创建变体
    • 使用动态材质在玩家收集物体时更改头像的颜色

1.操作纹理

  • Texture/纹理是图像,而图像是像素的集合。在彩色图像中,像素的颜色由**R(红色)****G(绿色)****B(蓝色)**通道决定。
  • 在虚幻引擎中,**RGB通道**的范围是(0.0 ~ 1.0),但是在大多数其他应用中,RGB通道的范围是 (0~255),但这只是显示相同信息的不同方式,而非实际色彩范围的差异。
  • 纹理操作的工作原理是对纹理的每个像素执行操作,操作可以向通道添加值一样简单。
  • 调整物体的亮度可以操纵其纹理,使用乘法节点调整其纹理亮度。

    1.乘法节点

  • 乘法节点:将一个输入乘以另一个输入

  • 使用乘法节点,可以更改像素的亮度,而不会影响其色调或饱和度。对每个像素执行该操作,就可以更改整个纹理的亮度。
  • image.png
  • 将乘法节点与蒙版纹理结合使用。使用蒙版,可以指定基础纹理的哪些区域变更暗)
  • image.png
  • **遮罩**之所以有效,是因为灰度表示 **0(黑色)到1(白色)范围**,白色区域具有全亮度,因为通道乘以1。灰色区域更暗,因为通道乘以小于1的值。黑色区域没有亮度,因为通道乘以0

2.调整纹理亮度

image.png

  • **Alt + LMB**即可断开纹理与基色引脚之间的链接。
  • 快速操作:长按 **1****M**键,在空白处单击**LMB**快速创建**常量节点****乘法节点**
  • image.png
  • 此设置将循环访问每个像素,并将每个通道乘以**Constant/常量**节点的值。最后生成的纹理随后输出为基色。
  • 选择**常量**节点,在**细节**->**材质表达式常量**->**值**进行常量的修改以完成对亮度的修改。
  • 创建**Material Instance/材质实例**比为每种颜色创建新材质更简单快捷。

    2.材质实例

  • Material Instance/材质实例是材质的副本,在基材中所作的任何更改也会在材质实例中进行。而材质实例无需重新编译即可对其进行更改。使用材质实例的情况:

    • 材料复杂,想要快速进行更改
    • 想要创建基础材质的变体(更改颜色、亮度甚至纹理本身)
  • 在创建材质实例之前,需要在基础材料中创建参数,这些参数将显示在材质实例中,并允许调整材质的属性。

    1.创建参数材料

  • 添加**HueShift/材质函数调用**节点,并完成与**Multiply/乘法节点**->**HueShift-Texture(3)****Result**->**Base Color**的连接

  • 创建一个**标量参数**节点,此节点包含单个值,并且可以在**材质实例**中进行编辑,创建后将其连接到**HueShift**节点上的**Hue Shift Percentage(S)**引脚。快捷指令:**长按S + LMB**
  • image.png
  • 标量参数节点重命名为HueShiftPercentage(色相偏移百分比),将常量节点转换为参数,再重命名为_Brightness_
  • 完成基础材料的实例化,应用后关闭材质编辑器,然后进行材质实例的创建。

    2.创建材质实例

  • **RMB+基础材料**->**创建材质实例**->**命名****双击RMB+材质实例**进入材质实例编辑器

  • image.png
  • **Instance Parents/实例父项**:显示实例的父材质列表。
  • 更改**Preview Mesh**
  • image.png
  • Parameter Groups->Scalar Parameter Values勾选参数旁边的复选框激活使参数可编辑。
  • image.png

    3.应用材质实例

  • 单独编辑放置在场景中的Actor,需要进行Details/细节->StaticMesh/静态网格组件

  • image.png
  • 细节面板将静态网格组件的属性进行更新,将材质更新为MI_Banana_Green
  • image.png

2.材料动态变化

  • 材料不必完全是装饰性的,也可以用它们来帮助游戏设计。
  • **Constant3Vector**节点非常适合选择颜色,因为其具有红色、绿色和蓝色通道。快速指令:**3 + LMB**
  • 要将颜色从白色更改为红色,需要一种在这两种颜色之间平滑过渡的方法。执行此操作的一种简单方法就是使用**线性插值**

    1.线性插值

  • 线性插值是一种查找 AB之间的值的方法

  • image.png
  • 控制**Alpha**时,线性插值就会发生变化,Alpha即是 AB之间的百分比,0的Alpha将返回A,而1的Alpha将返回B
  • 线性插值可以与时间绑定,也可以使用某种物品的数量来控制Alpha

2.使用线性插值节点

  • **线性插值**节点的快速指令:**L + LMB**
  • image.png
  • 线性插值节点将输出A输入的值,这是因为**alpha**的初始值为0。当**alpha**接近1时,输出接近B输入的值。要使立方体更改颜色,需要编辑**ColorAlpha**参数
  • Play运行时,材质实例的参数无法被编辑,只能使用**动态材质实例**进行操作

    3.动态材质实例

  • 与常规实例不同,**动态材质实例****play**运行时也可以进行编辑,使用 **C++****蓝图**进行操作。

  • **动态材质实例**可以单独进行编辑

    4.创建动态材质实例

  • 当虚幻引擎生成Actor,优先创建一个动态实例并将其应用于立方体网格

  • 添加一个 **Create Dynamic Material Instance(StaticMesh)/创建动态材质实例(静态网格)**节点,此节点将同时创建动态材质实例并将其应用于立方体网格
  • image.png
  • 为了便于引用该材料,应当将其存储在变量中RMB + Return Value—>Promote to Variable,将其升级为变量。在My Blueprint选项卡中,将变量New Var 0重命名为_**CubeMaterial**_
  • Event BeginPlay节点链接到Create Dynamic Material Instance(StaticMesh)
  • 该系列操作为 目标创建一个新的动态材质实例,并将其应用于**StaticMesh**组件,然后将材质存储在名为CubeMaterial变量中。

    5.创建香蕉计数器

    image.png
    • **On Component Begin Overlap(StaticMesh)**节点将在立方体与另一个执行组件重叠时执行
    • **Cast To BP_Banana**节点将检查重叠时间中有无香蕉参与
    • 如果Actor是香蕉,那么DestroyActor节点会将其销毁,使其从游戏中消失。

接下来创建一个用于存储收集香蕉数量的变量,之后每次立方体与香蕉重叠时,都会将变量递增1

  • 创建一个float变量命名为BananaCounter
  • 添加**Increment Float**节点,使计数器递增1
  • image.png
  • 因为线性插值节点的值在 0 ~ 1之间,因此需要规范化将计数器转化为0 ~ 1的范围
  • 添加一个**Float / Float**节点,**Banana Counter**将作为输入值进入**Float / Float**节点,底部即为自行设定的分母
  • image.png
  • 使用**Clamp**节点,将**alpha**保持在 **0 ~ 1**的范围内
  • image.png

    5. 更新材料

  • CubeMetarial变量拖放到Event Graph,并Get其属性

  • 添加**Set Scalar Parameter Value**节点,此节点将为提供的值设定指定的参数
  • image.png
  • 将该节点的参数指定为ColorAlpha,也就是立方体材质中创建的参数
  • image.png
  • 完成链接

    6.总结步骤

  1. **On Component Begin Overlap (StaticMesh)**: 当立方体与另一组件重叠时开始执行
  2. **Cast To BP_Banana**检查重叠的参与者是否是香蕉
  3. **DestroyActor**: 将重叠事件中的香蕉销毁
  4. **Increment Float**使Banana Counter变量递增1
  5. **Float / Float**将传递过来的变量Banana Counter除以指定的数字以规范其范围
  6. **Clamp(float)**限制除法的结果,使其处于0 ~ 1的范围
  7. **Set Scalar Parameter Value**将立方体**ColorAlpha**设置为参数,其参数的变量取值是经过处理后范围为0 ~ 1的值