Shader "UI/LogoFlicker" { 
 | 
    Properties { 
 | 
        _FlashColor ("Flash Color", Color) = (1,1,1,1) 
 | 
        _Angle ("Flash Angle", Range(0, 180)) = 45 
 | 
        _Width ("Flash Width", Range(0, 1)) = 0.2 
 | 
        _LoopTime ("Loop Time", Float) = 1 
 | 
        _Interval ("Time Interval", Float) = 3 
 | 
  
 | 
        [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {} 
 | 
        _Color("Tint", Color) = (1,1,1,1) 
 | 
  
 | 
        _StencilComp("Stencil Comparison", Float) = 8 
 | 
        _Stencil("Stencil ID", Float) = 0 
 | 
        _StencilOp("Stencil Operation", Float) = 0 
 | 
        _StencilWriteMask("Stencil Write Mask", Float) = 255 
 | 
        _StencilReadMask("Stencil Read Mask", Float) = 255 
 | 
  
 | 
        _ColorMask("Color Mask", Float) = 15 
 | 
    } 
 | 
    SubShader 
 | 
    { 
 | 
            Tags 
 | 
            { 
 | 
                "Queue" = "Transparent" 
 | 
                "IgnoreProjector" = "True" 
 | 
                "RenderType" = "Transparent" 
 | 
                "PreviewType" = "Plane" 
 | 
                "CanUseSpriteAtlas" = "True" 
 | 
            } 
 | 
  
 | 
            Stencil 
 | 
            { 
 | 
                Ref[_Stencil] 
 | 
                Comp[_StencilComp] 
 | 
                Pass[_StencilOp] 
 | 
                ReadMask[_StencilReadMask] 
 | 
                WriteMask[_StencilWriteMask] 
 | 
            } 
 | 
  
 | 
        LOD 200 
 | 
        Blend SrcAlpha OneMinusSrcAlpha //指定alphaBlend 
 | 
        CGPROGRAM 
 | 
        #pragma surface surf Lambert alpha exclude_path:prepass noforwardadd 
 | 
//      #pragma target 3.0 
 | 
  
 | 
        sampler2D _MainTex; 
 | 
        float4 _FlashColor; 
 | 
        float _Angle; 
 | 
        float _Width; 
 | 
        float _LoopTime; 
 | 
        float _Interval; 
 | 
  
 | 
        struct Input  
 | 
        { 
 | 
            half2 uv_MainTex; 
 | 
        }; 
 | 
  
 | 
        float inFlash(half2 uv) 
 | 
        {    
 | 
            float brightness = 0; 
 | 
  
 | 
            float angleInRad = 0.0174444 * _Angle; 
 | 
            float tanInverseInRad = 1.0 / tan(angleInRad); 
 | 
  
 | 
            float currentTime = _Time.y; 
 | 
            float totalTime = _Interval + _LoopTime; 
 | 
            float currentTurnStartTime = (int)((currentTime / totalTime)) * totalTime; 
 | 
            float currentTurnTimePassed = currentTime - currentTurnStartTime - _Interval; 
 | 
  
 | 
            bool onLeft = (tanInverseInRad > 0); 
 | 
            float xBottomFarLeft = onLeft? 0.0 : tanInverseInRad; 
 | 
            float xBottomFarRight = onLeft? (1.0 + tanInverseInRad) : 1.0; 
 | 
  
 | 
            float percent = currentTurnTimePassed / _LoopTime; 
 | 
            float xBottomRightBound = xBottomFarLeft + percent * (xBottomFarRight - xBottomFarLeft); 
 | 
            float xBottomLeftBound = xBottomRightBound - _Width; 
 | 
  
 | 
            float xProj = uv.x + uv.y * tanInverseInRad; 
 | 
  
 | 
            if(xProj > xBottomLeftBound && xProj < xBottomRightBound) 
 | 
            { 
 | 
                brightness = 1.0 - abs(2.0 * xProj - (xBottomLeftBound + xBottomRightBound)) / _Width; 
 | 
            } 
 | 
  
 | 
            return brightness; 
 | 
        } 
 | 
  
 | 
        void surf (Input IN, inout SurfaceOutput o) 
 | 
        {                 
 | 
            half4 texCol = tex2D(_MainTex, IN.uv_MainTex); 
 | 
            float brightness = inFlash(IN.uv_MainTex); 
 | 
  
 | 
            o.Emission = texCol.rgb + _FlashColor.rgb * brightness;//改为输出Emission,不受光影响 
 | 
            o.Alpha = texCol.a; 
 | 
        } 
 | 
  
 | 
        ENDCG      
 | 
    } 
 | 
        FallBack "Diffuse" 
 | 
} 
 |