Shader 纹理动画和顶点动画

一、内置变量--时间

要实现动画,我们需要把时间添加到计算当中,让画面可以随着时间变化而变化。在Unity Shader提供了如下关于时间的内置变量以便于在shader中访问时间实现各种动态效果。

名称类型描述
_Timefloat4t是自该场景加载开始所经过的时间,4个分量的值分别是(t/20,t,2t,3t)
_SinTimefloat4t是时间的正弦值,4个分量分别是(t/8,t/4,t/2,t)
_CosTimet是时间的余弦值,4个分量分别是(t/8,t/4,t/2,t)
unity_DeltaTimedt是时间的增量,4个分量分别是(dt,1/dt,smoothDt,1/smoothDt)

二、纹理动画

纹理动画在游戏中应用十分广泛,尤其是在移动平台上,由于资源比较局限,我们一般都会用纹理动画来替代复杂的粒子系统去模拟各种动画效果。

1、序列帧动画

最常见的纹理动画。原理很简单,一次播放一系列关键帧图像,当播放速度达到一定时,看起来就是一个连续的动画。

优点:灵活性强,不需要任何物理计算就可以得到很细腻的动画效果。

缺点:需要制作大量不同的关键帧图像,美术工程量比较大。

2、滚动的背景

2D游戏中经常使用纹理动画去制作滚动的背景实现场景穿梭的效果。

三、顶点动画

在游戏中我们用顶点动画去模拟飘荡的旗帜、流淌的小溪流等。

顶点动画虽然非常灵活有效,但是有些注意事项:

如果我们在模型空间下进行了一些顶点动画,那么批处理往往就会破坏这种动画效果。这时,我们可以通过SubShader的DisableBatching标签来强制取消对该Unity Shader的批处理。然而,取消批处理会带来一定的性能下降,增加了Draw Call,因此我们应该尽量避免使用模型空间下的一些绝对位置和方向来进行计算。

为了避免显式使用模型空间的中心来作为锚点,我们可以利用顶点颜色来存储每个顶点到锚点的距离值,这种做法在商业游戏中很常见。