技能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。

原文地址:https://www.cnblogs.com/jqm304775992/p/4988016.html