斯坦福UE4C++课程P28-P33(动态)游戏材质
UE4的材质Materials,在Unity中叫着色器Shaders。
我们学习动态材质(能够与游戏交互),这意味着我们不会注重如何做逼真的材质,而是注重如何与游戏交互。
了解材质多半是要了解:基于物理的渲染PBR(Physically Based Rendering)。
PBR让材质参数能够被美术人员修改,例如金属度、粗糙度,然后引擎能够根据这些参数计算出材质的效果。
作者给了一些学习材质的资源,有官方文档的基于物理的材质预览、材质输入、还有Content Examples工程里的关于材质的学习。
另外我们发现,角色发射的魔法球能够打到自己让自己掉血,在魔法球C++类OnActorOverlap判断条件添加OtherActor!=GetInstigator()即可。

接下来介绍材质基础知识(着色器)
这里推荐先看看

创建材质实例=创建子类,材质实例会“继承”之前的材质的设定。
可以给常数、纹理等节点右键转换为参数节点,使得其可变。
开启选项栏的Live Nodes可以右键预览任一节点的情况
使用DebugScalarValues函数可以实时查看数值变化
接下来我们学习用蓝图来控制材质。创建M_SineWaveBP材质
下方的GameTime原来是time节点,我们把它换成了参数节点,使得我们可以在蓝图中控制它。

创建Actor蓝图类,添加一个staticmesh,用刚刚创建的M_SineWaveBP材质,添加如下节点

现在运行游戏,可以看到相同效果,颜色在红蓝之间正弦变化。
更好的办法是直接在材质编辑界面使用time,因为材质编辑界面的逻辑的代码会被编译为HLSL(High Level Shader Language高级着色器语言),并交给GPU处理,并不经过CPU。但是如果在蓝图处理这些逻辑,将交给CPU处理,由于CPU调用代价比交给GPU处理昂贵,所以前者更好。

接下来我们通过C++实现击中时闪光材质和如何驱动材质的参数
新建Actor继承C++类STargetDummy,添加staticmesh和角色attribute组件,并在构造函数添加
表示当角色血量变化时触发本类的OnHealthChanged函数。(之前我们在Attribute类用声明了动态组播委托事件OnHealthChanged事件),以下是本类的OnHealthChanged函数:
回到编辑器,新建蓝图类TargetDummyBP,给mesh组件一个网格体和闪光材质。
拖到视口中,击中该物体时会闪光。

接下来制作一个简单溶解材料(纹理)
新建一个溶解材质,设置Blend Mode为Masked:

连接到Opacity Mask会让低于一定阈值的像素透明不可见,我们可以通过加上DissolveAmount来控制,其为1时全部可见(RGB值全大于1),为0时低于阈值的全都不可见。

如下连实现溶解效果:


和前面闪光材质同理,可以在蓝图中通过控制DissolveAmount参数来实现被击中时溶解效果。

下面来创建可重复使用的材质功能
我们在内容浏览器右键新建一个Material Function材质函数。
可以把之前做的闪光材质的节点复制到该材质函数,和函数输出结果Output Result相连。
勾选左侧Expose to Library使得材质函数可以在编辑器中可见

现在上面这一堆和下面的输出等价。
所以可以看出,材质函数实际上就是封装了部分逻辑为一个函数节点。
函数节点也可以添加输入引脚


现在可以给里边输入一个值来覆盖其默认值(TimeToHit)。

最后是在用户界面使用材质(UMG)。
新建一个材质M_HealthBar,左侧选择Material Domain为User Interface。
添加如下节点,LinearGradient实现UV方向上的渐变效果。

我们可以在Health控件蓝图中把生命值条删掉,拖进来一个image,给image添加我们刚刚创建的材质M_HealthBar。
我们可以获取到image的材质,然后获取到材质的名为ProgressAlpha的参数,用之前生命值进度条使用过的值作为Value。

现在效果如下:

这一章只是简介材质,很多东西没有深入,因为我们的重点放在C++上。