利用uv的连续的偏移,就可以形成一个动画
1、通过时间的不断变化
Shader "Custom/s_uv_animation1" {
Properties{
_MainTex("MainTex", 2D) = ""{}
}
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float tiling_x;
float tiling_y;
float offset_x;
float offset_y;
sampler2D _MainTex;
//unity总是会帮我们传递这样一个值
float4 _MainTex_ST;
struct v2f {
float4 pos:POSITION;
float2 uv:TEXCOORD0;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag(v2f IN) :COLOR{
IN.uv.x+=_Time.x;
fixed4 color = tex2D(_MainTex,IN.uv);
return color;
}
ENDCG
}
}
}
2、得到水波荡漾的效果
Shader "Custom/s_uv_animation1" {
Properties{
_MainTex("MainTex", 2D) = ""{}
_F("F",range(1,30))=10
}
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float tiling_x;
float tiling_y;
float offset_x;
float offset_y;
sampler2D _MainTex;
//unity总是会帮我们传递这样一个值
float4 _MainTex_ST;
float _F;
struct v2f {
float4 pos:POSITION;
float2 uv:TEXCOORD0;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag(v2f IN) :COLOR{
IN.uv.x+=0.01*sin(IN.uv.x*3.14*_F+_Time.y);
IN.uv.y += 0.01*sin(IN.uv.x*3.14*_F + _Time.y);
fixed4 color = tex2D(_MainTex,IN.uv);
return color;
}
ENDCG
}
}
}
3、通过添加颜色可以看到确实出现了圆形水波,但是是从外向内
Shader "Custom/s_uv_animation1" {
Properties{
_MainTex("MainTex", 2D) = ""{}
_F("F",range(1,30))=10
_A("A",range(0,0.1)) = 0.01
}
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float tiling_x;
float tiling_y;
float offset_x;
float offset_y;
sampler2D _MainTex;
//unity总是会帮我们传递这样一个值
float4 _MainTex_ST;
float _F;
float _A;
struct v2f {
float4 pos:POSITION;
float2 uv:TEXCOORD0;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag(v2f IN) :COLOR{
//IN.uv.x+=0.01*sin(IN.uv.x*3.14*_F+_Time.y);
//IN.uv.y += 0.01*sin(IN.uv.x*3.14*_F + _Time.y);
float2 uv = IN.uv;
float dis = distance(uv,float2(0.5,0.5));
float scale = _A*sin(dis*3.14*_F + _Time.y);
uv = uv + uv*scale;
fixed4 color = tex2D(_MainTex,uv)+fixed4(1,1,1,1)*saturate(scale)*100;
return color;
}
ENDCG
}
}
}
解决办法:
4、水波改为由内向外
Shader "Custom/s_uv_animation1" {
Properties{
_MainTex("MainTex", 2D) = ""{}
_F("F",range(1,30))=10
_A("A",range(0,0.1)) = 0.01
}
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float tiling_x;
float tiling_y;
float offset_x;
float offset_y;
sampler2D _MainTex;
//unity总是会帮我们传递这样一个值
float4 _MainTex_ST;
float _F;
float _A;
struct v2f {
float4 pos:POSITION;
float2 uv:TEXCOORD0;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag(v2f IN) :COLOR{
//IN.uv.x+=0.01*sin(IN.uv.x*3.14*_F+_Time.y);
//IN.uv.y += 0.01*sin(IN.uv.x*3.14*_F + _Time.y);
float2 uv = IN.uv;
float dis = distance(uv,float2(0.5,0.5));
float scale = _A*sin(-dis*3.14*_F + _Time.y);
uv = uv + uv*scale;
fixed4 color = tex2D(_MainTex,uv)+fixed4(1,1,1,1)*saturate(scale)*100;
return color;
}
ENDCG
}
}
}
5、通过变量_R控制波纹的大小
Shader "Custom/s_uv_animation1" {
Properties{
_MainTex("MainTex", 2D) = ""{}
_F("F",range(1,30))=10
_A("A",range(0,0.1)) = 0.01
_R("R",range(0,1))=0
}
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float tiling_x;
float tiling_y;
float offset_x;
float offset_y;
sampler2D _MainTex;
//unity总是会帮我们传递这样一个值
float4 _MainTex_ST;
float _F;
float _A;
float _R;
struct v2f {
float4 pos:POSITION;
float2 uv:TEXCOORD0;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag(v2f IN) :COLOR{
//IN.uv.x+=0.01*sin(IN.uv.x*3.14*_F+_Time.y);
//IN.uv.y += 0.01*sin(IN.uv.x*3.14*_F + _Time.y);
float2 uv = IN.uv;
float dis = distance(uv,float2(0.5,0.5));
float scale=0;
if (dis < _R) {
scale = _A*sin(-dis*3.14*_F + _Time.y);
uv = uv + uv*scale;
}
fixed4 color = tex2D(_MainTex,uv)+fixed4(1,1,1,1)*saturate(scale)*100;
return color;
}
ENDCG
}
}
}
6、水波效果
Shader "Custom/s_uv_animation1" {
Properties{
_MainTex("MainTex", 2D) = ""{}
_F("F",range(1,30))=10
_A("A",range(0,0.1)) = 0.01
_R("R",range(0,1))=0
}
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float tiling_x;
float tiling_y;
float offset_x;
float offset_y;
sampler2D _MainTex;
//unity总是会帮我们传递这样一个值
float4 _MainTex_ST;
float _F;
float _A;
float _R;
struct v2f {
float4 pos:POSITION;
float2 uv:TEXCOORD0;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag(v2f IN) :COLOR{
//IN.uv.x+=0.01*sin(IN.uv.x*3.14*_F+_Time.y);
//IN.uv.y += 0.01*sin(IN.uv.x*3.14*_F + _Time.y);
float2 uv = IN.uv;
float dis = distance(uv,float2(0.5,0.5));
float scale=0;
//扩散的幅度
_A *= saturate(1-dis / _R);
scale = _A*sin(-dis*3.14*_F + _Time.y);
uv = uv + uv*scale;
fixed4 color = tex2D(_MainTex, uv) ;
//fixed4 color = tex2D(_MainTex,uv)+fixed4(1,1,1,1)*saturate(scale)*100;
return color;
}
ENDCG
}
}
}
7、波光粼粼的效果
Shader "Custom/s_uv_animation1" {
Properties{
_MainTex("MainTex", 2D) = ""{}
_F("F",range(1,30))=10
_A("A",range(0,0.1)) = 0.01
_R("R",range(0,1))=0
}
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float tiling_x;
float tiling_y;
float offset_x;
float offset_y;
sampler2D _MainTex;
//unity总是会帮我们传递这样一个值
float4 _MainTex_ST;
float _F;
float _A;
float _R;
struct v2f {
float4 pos:POSITION;
float2 uv:TEXCOORD0;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag(v2f IN) :COLOR{
//IN.uv.x+=0.01*sin(IN.uv.x*3.14*_F+_Time.y);
//IN.uv.y += 0.01*sin(IN.uv.x*3.14*_F + _Time.y);
IN.uv+= 0.005*sin(IN.uv*3.14*_F + _Time.y);
float2 uv = IN.uv;
float dis = distance(uv,float2(0.5,0.5));
float scale=0;
//扩散的幅度
_A *= saturate(1-dis / _R);
scale = _A*sin(-dis*3.14*_F + _Time.y);
uv = uv + uv*scale;
fixed4 color = tex2D(_MainTex, uv) ;
return color;
}
ENDCG
}
}
}