欢迎光临散文网 会员登陆 & 注册

斯坦福UE4C++课程P28-P33(动态)游戏材质

2022-10-28 21:01 作者:_Hide-on-bush_  | 我要投稿

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

如下连实现溶解效果:

和前面闪光材质同理,可以在蓝图中通过控制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++上。

斯坦福UE4C++课程P28-P33(动态)游戏材质的评论 (共 条)

分享到微博请遵守国家法律