Shader顶点动画
应该可以做一下水流效果,后续改进:
Shader "Unlit/WaterWAE"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_RSpeed("旋转速速",float )=1
_moveSpeed("流动速度(水流速度)",float)=1
_waveLength("波长",float)=1
_waveSpeed("震动速度",float)=1
_waveStrenth("震动幅度(波浪高度)",float)=1
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float _waveStrenth;
float _waveSpeed;
float _RSpeed;
float _waveLength;
float _moveSpeed;
v2f vert (appdata v)
{
v2f o;
float3 offset=float3(0,0,0);
offset.y=sin((v.vertex.x+_Time.y*_waveSpeed)*_waveLength)*_waveStrenth;
o.vertex = UnityObjectToClipPos(v.vertex+offset);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float angel=_RSpeed *_Time.x;
float2 uv = i.uv.xy - float2(0.5, 0.5);//UV原点移动到UV中心点
uv.x=uv.x+_Time.y*_moveSpeed;
uv=float2(uv.x,uv.y);
uv = float2(uv.x *cos(angel) + uv.y * sin(angel), uv.y*cos(angel)-uv.x *sin(angel) );//关键步骤
uv += float2(0.5, 0.5);//UV中心转移回原来原点位置
fixed4 col = tex2D(_MainTex, uv);
return col;
}
ENDCG
}
}
}
其中像素动画的旋转代码如下:
fixed4 frag (v2f i) : SV_Target
{
float angel=_RSpeed *_Time.x;
float2 uv = i.uv.xy - float2(0.5, 0.5);//UV原点移动到UV中心点
uv = float2(uv.x *cos(angel) + uv.y * sin(angel), uv.y*cos(angel)-uv.x *sin(angel) );//关键步骤
uv += float2(0.5, 0.5);//UV中心转移回原来原点位置
fixed4 col = tex2D(_MainTex, uv);
return col;
}
普通的Texture Shader只在片元着色器部分修改成以上即可。
至于关键步骤的公式推导:
不会电脑作图,手写,凑活看吧