zoukankan      html  css  js  c++  java
  • 技能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。

  • 相关阅读:
    虚方法与非虚方法,native关键字
    Java多态
    Java对象初始化顺序
    继承、初始化
    递归,斐波那契,对象类型数组
    方法重载
    可变形参
    idea
    ss 如何解决margin-top使父元素margin失效
    js中call和apply的用法和区别
  • 原文地址:https://www.cnblogs.com/jqm304775992/p/4988016.html
Copyright © 2011-2022 走看看