unity shader —— LOGO闪烁

总算找到了一个实用的效果,就拿出来给大家分享一下。

技术分享
 1 Shader "Custom/LOGOblink" {
 2     Properties {
 3         _MainTex ("Base (RGB)", 2D) = "white" {}
 4         
 5         _BlinkColor ( "Blink Color", color ) = (1,1,1,1)
 6         _BlinkWidth ( "Blink Width", range(0, 1)  ) = 0.2
 7         _LoopTime ( "Looping Time", range(0,10)) = 1
 8         _Interval ( "Time Interval", range(0,10)) = 2
 9     }
10     SubShader {
11         Tags { "RenderType"="Opaque" }
12         LOD 200
13         
14         CGPROGRAM
15         #pragma surface surf Lambert
16 
17         sampler2D _MainTex;
18         float4 _BlinkColor;
19         float _BlinkWidth;
20         float _LoopTime;
21         float _Interval;
22         
23 
24         struct Input {
25             float2 uv_MainTex;
26         };
27         
28         float Blink( float2 uv )
29         {
30         
31             float curTime = _Time.y;    // 当前时间
32             float totalTime = _LoopTime + _Interval;
33             float curInitTime = (int)(_Time.y / totalTime) * totalTime;    // 当前起始时间
34             
35             float passedTime = _Time.y - curInitTime - _Interval;
36             
37             if(passedTime <= 0.0)
38                 return 0.0;
39             else
40             {
41             float passedTimePercent = (passedTime) / _LoopTime;
42             
43             
44             float bottomPoint1 = passedTimePercent*(_BlinkWidth + 1);    // 底点1
45             float bottomPoint2 = bottomPoint1 - _BlinkWidth;    // 底点2
46             // 默认是45度角,所以不需要太多计算
47             
48             float temp1 = bottomPoint1 - uv.y;
49             float temp2 = temp1 - (_BlinkWidth*0.5);
50             
51             
52             if( uv.x > temp1 || uv.x < temp1-_BlinkWidth)
53                 return 0.0;
54             else
55             {
56             return 1.0- abs( (temp1 - uv.x - temp2) / temp2 );
57             }
58             }
59         }
60         
61 
62         void surf (Input IN, inout SurfaceOutput o) {
63             half4 c = tex2D (_MainTex, IN.uv_MainTex);
64             float brightness = Blink(IN.uv_MainTex);
65             
66             o.Albedo = c.rgb + ( brightness * _BlinkColor.rgb );
67             o.Alpha = c.a;
68         }
69         ENDCG
70         
71     } 
72     FallBack "Diffuse"
73 }
View Code

并没有太多难度,有一个创意的部分,就是用除法归整实现计数。(这是被逼出来的招么?>_<)

注意事项:

1.UV坐标原点是左下角。

2.区别于C语言,一个分支部分有return,就必须显式地写出来else部分。

 

****************

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。