顶点动画可以让我们的场景变得更加生动有趣。在游戏中,我们常常使用顶点动画来模拟飘动的旗帜,河流的效果。下面将学习两种常见的顶点动画应用:流动的河流以及广告牌技术,最后还给出一些顶点动画中的注意事项以及解决方法。
一、流动的河流
河流的模拟是顶点动画最常见的应用之一。原理通常是使用正弦函数等来模拟水流的波动效果。本节会展示如何模拟一个2D的河流效果。
1.声明属性:
Properties {
_MainTex ("Main Tex", 2D) = "white" {}
_Color ("Color Tint", Color) = (1, 1, 1, 1)
_Magnitude ("Distortion Magnitude", Float) = 1
_Frequency ("Distortion Frequency", Float) = 1
_InvWaveLength ("Distortion Inverse Wave Length", Float) = 10
_Speed ("Speed", Float) = 0.5
}
其中,_MainTex是河流纹理,_Color用于控制整体颜色,_Magnitude用于控制水流波动的幅度,_Frequency用于控制波动频率,_InvWaveLength用于控制波长的倒数(_InvWaveLength越大,波长越小),_Speed用于控制河流纹理的移动速度。
2.为透明效果设置合适的Subshader标签:
SubShader {
// Need to disable batching because of the vertex animation
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "DisableBatching"="True"}
我们除了为透明效果设置Queue、IgnoreProjector和RenderType外,还设置了一个新的标签——DisableBatching。一些subshader在使用unity批处理功能时会出现问题,这时可以通过该标签来直接指明是否对该Subshader使用批处理。而这些需要特殊处理的shader通常就是指包含了模型空间的顶点动画的shader。这是因为批处理会合并所有相关的模型,而这些,模型各自的模型空间就会丢失,本例我们需要在模型空间下对顶点位置进行偏移,因此这里取消对该shader的批处理操作。
3.接着设置了Pass的渲染状态:
Pass {
Tags { "LightMode"="ForwardBase" }
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Cull Off
这里关闭了深度写入,开启并设置了混合模型,并关闭了剔除功能,这是为了让水流的每个面都能显示。
4.在顶点着色器进行了相关的顶点动画:
v2f vert(a2v v) {
v2f o;
float4 offset;
offset.yzw = float3(0.0, 0.0, 0.0);
offset.x = sin(_Frequency * _Time.y + v.vertex.x * _InvWaveLength + v.vertex.y * _InvWaveLength + v.vertex.z