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

MMD联动Unity学习笔记 Vol.21 ShaderGraph制作让模型随着音乐振动

2019-05-31 13:21 作者:NXL2  | 我要投稿

前言

    这期我们的主题还是ShaderGraph。这期的笔记内容来自官方达哥的视频《音Game制作让模型随着音乐摆动的特效》,下面是视频地址。

最终效果


音乐游戏里面常看到的一个特效,让模型随着音乐摆动。你可以看到上图中模型有凹凸不平的振动,并且不像平常只是一个平面,这种方法是360度的方向都会振动。

解读Shader Graph的方法

    我们先练习阅读Shader Graph的方法,这跟写代码不同,图表随着效果的复杂,必然越复杂,那你看到这么复杂的图通常会减低学习的意愿。所以了解拆解并简化这些图是很重要的,比如说像这个PBR本身会有很多通道,3D美术过都应该很熟悉这些通道的意义,当你看到一张图时,先确定你想要读的方向,比如你想要了解这个着色器的振动特效是如何做得,那它一定是Position通道负责的,因为它是跟座标系相关的。同理你只是想知道发光如何处理,那只需要解读Emission这部分的图即可。

Albedo和Normal的节点大致相同(by达哥)

    通常Albedo通道和Normal通道的图彼此会长得非常相似,因为它们处理的内容几乎是重叠在一起的,所以这里通常你只需要读懂一个,就可以明白另一个的逻辑。这个项目我只想要知道振动的效果是怎么做,那我可以把Emission的线断掉。

我们先不看Emission这部分

    这样要解读的图就已经整整砍了一大半了,剩下的Position图面,Add和Multiply,加法和乘法节点,基本都是在做数值改变。

剩下的Normal Vector和Simple Noise还没有介绍过

    因此全部都屏蔽掉之后,剩下的节点就不多了。Position和Time的结合就是让座标每一帧都改变,所以这张图里,我们没有介绍过的, 就剩下Normal Vector和Simple Noise这两个节点。

去查清楚这两个节点的用法,那就大概那读懂这张图的作用了。让练习还原效果,你可以把Position这条线断掉之后,放在上面当参考,我现在添加一个Normal Vector的节点,它的功能就是通过法线方向做位移,添加另外一个Position节点,并尝试用一个Add节点将它们串连起来。这里我把两个座标系都改为Object并存档,你就会看到整个球体都被 放大,当然这样是全部的网格点被放大,想要让每个节点的放大的幅度不一样,我添加另外一个Position和Time的节点,并把它们两个用Add节点串连起来。关于加法和乘法的差别,当座标用加法节点串连起来时,它表现的感觉像是在平移,因为很一个网格点加的数值都相同。如果是用节点乘法的方法串连起来的,它的表现的感觉好像是放大。

Add节点与Multiply节点的差别

    基础值大的偏移量就会越大,这里我加一个Simple Noise的节点,这是一张噪点图。简单来说就是拿来当乱数使用,稍后球面的振动就会依照这里的值,反映到每个网格点上的法线距离,把它连到UV就会看到图开始流动,把另外一端连上就会看到球开始反映。

    这里(Simple Noise)的Scale默认是500,数值越小,代表它影响的网格面积就越大,调整为100,让它看起来没有那么尖锐。你也可以调5试试看,看起来就像个流体的感觉,还蛮酷的,挺适合拿来做一些片头特效。先改回100,这样就和上个结果是一样的。 Emission的通道可以连回来了。

    接下来的思路是通过截取外部信息,进而影响球体变化强度,所以我添加一个乘法节点在Simple Noise节点之后,并且从左上角的窗口(黑板)添加一个Vector1,命名为Power。

    其中很重要的是Reference栏位,就是将作为脚本存取的变量名称,那我改为_Power,把这个栏位拖到图面上,并且连接刚刚新添加的乘法节点上。

    然后我在这个球上添加一个Audio Source(组件),用来发出声音的。

添加音频组件

    然后写一个DisplacementControl.cs(脚本)来读取音乐的信息。

你们没有看见对吧

    这个脚本的主要逻辑是这样的,在Start()里面会去把物件的meshRender参照下来,作为以后我要改颜色信息的一个捷径。那Update()最重要的是,audio.GetOutputData()这个函(式)数,它会实时的截取音频信息,这样我就可以拿来解析并转化成为一个值,来让模型变动。

meshRender.material.SetFloat("_Power",scale,y);

这一行就是负责把最终值传回给Power。

meshRender.material.SetColor("_Color",GetVolumeColor(scale,y));

这一行是达哥额外写的判断。

GetVolumeColor这个函数里面,如果值超过0.2的话,就随机改一个颜色。并播放一个粒子特效。如果没有超过就保持蓝色,这样就完成了。

    

    这里介绍一个小技巧,因为Shader在没播放的时候也会动,如果你觉得这样很恼人的话,可以在这里把它关闭。

关闭动画

    这样就不会看到效果了。当然播放时还是会正常的播放。

    把这个Shader应用在其它的物件上试试看,全身都在抖动。

    改为0.1试试看,可以模拟引擎启动的感觉,我把噪点调小一点,这样就好像热气流导致的热效应,调负的也可以很有意思的。

    通过这样的学习来读懂别人的Shader Graph,吸收成为自已能读懂的图,并延伸制作其它的特效。你可以把这些图的代码打开来,然后进一步的优化,转变成为自已的内容。提升自已写Shader的能力。

    最后感谢达哥的分享。


MMD联动Unity学习笔记 Vol.21 ShaderGraph制作让模型随着音乐振动的评论 (共 条)

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