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"
|
}
|