技能CD 效果 shader
技能CD特效
这个效果主要是利用反正切函数完成。atan2(x,y)的返回值是[-PI,PI],这个支持4个象限的反正切函数。关于圆角计算,在上篇文章中有介绍。
现在,我们来看看反正切函数的效果:
在第一象限:返回[0,PI/2],有渐变;
在第二象限:返回[PI/2,PI],为白色;
在第三象限:返回[-PI,-PI/2],为黑色;
在第四象限:返回[-PI/2,0],为黑色;
uv = i.uv - fixed2(0.5,0.5); float hui = atan2(uv.y, uv.x); return float4(hui,hui,hui,alpha);
反正切的返回值在[-PI,PI],那么我们现在增加变量_angle,让他控制反正切的值;我们设置_angle值为[-PI,PI],用_angle的值,加上反正切的值,他们最后的值就会随着_angle的值变化。
当_angle = -PI时,最终值为[-2PI,0],显示黑色;
当_angle = PI时,最终值为[0,2PI],显示渐变;
现在我使用用sign函数,将大于0的部分全部设置为1,小于等于0的部分设置成为0;
源代码:
Shader "JQM/Test02" { Properties { _MainTex ("Texture", 2D) = "white" {} _angle("angle", Range(0, 1)) = 0 } SubShader { Pass { Tags {"Queue" = "Transparent"} ZWrite Off Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" float _percent; float _angle; sampler2D _MainTex; float4 _MainTex_ST; struct VertexOutPut { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; VertexOutPut vert (appdata_full v) { VertexOutPut o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord.xy; return o; } fixed4 frag (VertexOutPut i) : COLOR { //圆角计算 float2 uv = i.uv.xy - float2(0.5,0.5); float rx = fmod(uv.x, 0.4); float ry = fmod(uv.y, 0.4); float mx = step(0.4, abs(uv.x)); float my = step(0.4, abs(uv.y)); float alpha = 1 - mx*my*step(0.1, length(half2(rx,ry))); fixed4 col = tex2D(_MainTex, i.uv); uv = i.uv - fixed2(0.5,0.5); _angle = 6.283*(_angle-0.5); float hui =sign(_angle+atan2(uv.y, uv.x)); return float4(hui,hui,hui,alpha); } ENDCG } } }
CG函数
sign(x)
:如果 x 大于 0,返回 1;如果 x 小于 0,返回 01;否则返回 0。