流光shader

Shader "Unlit/liuguang"
{
Properties
{
_MainTex("Base (RGB)", 2D) = "white" {}
_FlashColor("Flash Color", Color) = (1,1,1,1)
_Angle("流光角度", Range(0, 180)) = 45
_Width("流光宽度", Range(0, 1)) = 0.2
_LoopTime("持续时间", Float) = 1
_Interval("间隔", Float) = 3
}
SubShader
{
Tags
{
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
"PreviewType" = "Plane"
"CanUseSpriteAtlas" = "True"
}
// 源rgba*源a + 背景rgba*(1-源A值)
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

struct appdata_t
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
};

struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
half2 texcoord : TEXCOORD0;
};

sampler2D _MainTex;


float4 _FlashColor;
float _Angle;
float _Width;
float _LoopTime;
float _Interval;
//float _BeginTime;
float inFlash(half2 uv)
{
float brightness = 0;

float angleInRad = 0.0174444 * _Angle;
float tanInverseInRad = 1.0 / tan(angleInRad);

//float currentTime = _Time.y - _BeginTime;
float currentTime = _Time.y;
float totalTime = _Interval + _LoopTime;
float currentTurnStartTime = (int)((currentTime / totalTime)) * totalTime;
float currentTurnTimePassed = currentTime - currentTurnStartTime - _Interval;

bool onLeft = true;
float xBottomFarLeft = 0;
float xBottomFarRight = 1.8;
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;
}
v2f vert(appdata_t IN)
{
v2f OUT;
OUT.vertex = UnityObjectToClipPos(IN.vertex);
OUT.texcoord = IN.texcoord;
#ifdef UNITY_HALF_TEXEL_OFFSET
OUT.vertex.xy -= (_ScreenParams.zw - 1.0);
#endif
OUT.color = IN.color * _FlashColor;
return OUT;
}

fixed4 frag(v2f IN) : SV_Target
{
half4 color = tex2D(_MainTex, IN.texcoord) * IN.color;
half4 texCol = tex2D(_MainTex, IN.texcoord);
float brightness = inFlash(IN.texcoord);

color.rgb = texCol.rgb + _FlashColor.rgb * brightness;
color.a = texCol.a;
return color;
}
ENDCG
}
}
FallBack "Unlit/Transparent"
}

posted @ 2021-04-22 19:53  mc宇少  阅读(136)  评论(0编辑  收藏  举报