lcy
2025-01-02 c867ea92cce28ea0ceb312ef8e2f8e7e0888b1d6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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"
}