|
|
Shader "Custom/Character"
|
|
|
{
|
|
|
Properties
|
|
|
{
|
|
|
_Color ("Color", Color) = (1,1,1,1)
|
|
|
[PerRendererData]_MainTex ("Sprite Texture", 2D) = "white" {}
|
|
|
_Flash ("Flash", Range(0,1)) = 0.5
|
|
|
_FlashColor ("FlashColor", Color) = (1,1,1,1)
|
|
|
_Alpha ("_Alpha", Range(0,1)) = 1
|
|
|
_PaletteTex ("PaletteTex", 2D) = "white" {}
|
|
|
_ReplaceTex ("ReplaceTex", 2D) = "white" {}
|
|
|
[IntRange]_ReplaceType ("ReplaceType", Range(0,15)) = 0
|
|
|
_Direction ("Direction", Vector) = (0, 1, 0, 0)
|
|
|
_Intensity ("Intensity", Range(0.0, 1.0)) = 0
|
|
|
_UV ("UV", Vector) = (0, 0, 0, 0)//uv中心xy,uv边界
|
|
|
_FadingTex ("FadingTex", 2D) = "white" {}
|
|
|
_FadingColor ("FadingColor", Color) = (1,1,1,1)
|
|
|
_FadingWidth ("FadingWidth", Range(0,1)) = 0
|
|
|
}
|
|
|
SubShader
|
|
|
{
|
|
|
Tags
|
|
|
{
|
|
|
"Queue" = "Geometry"
|
|
|
}
|
|
|
Cull Off
|
|
|
ZWrite On
|
|
|
|
|
|
CGPROGRAM
|
|
|
#pragma surface surf Lambert addshadow fullforwardshadows
|
|
|
#pragma target 3.0
|
|
|
|
|
|
sampler2D _MainTex;
|
|
|
sampler2D _PaletteTex;
|
|
|
sampler2D _ReplaceTex;
|
|
|
sampler2D _FadingTex;
|
|
|
fixed4 _Color;
|
|
|
fixed _Flash;
|
|
|
fixed4 _FlashColor;
|
|
|
fixed _Alpha;
|
|
|
fixed _ReplaceType;
|
|
|
fixed4 _Direction;
|
|
|
fixed _Intensity;
|
|
|
fixed4 _UV;
|
|
|
fixed4 _FadingColor;
|
|
|
fixed _FadingWidth;
|
|
|
|
|
|
struct Input
|
|
|
{
|
|
|
float2 uv_MainTex;
|
|
|
};
|
|
|
|
|
|
void surf(Input IN, inout SurfaceOutput o)
|
|
|
{
|
|
|
fixed2 uv = IN.uv_MainTex;
|
|
|
//形变
|
|
|
if (length(_Direction) > 0 && _Intensity > 0)
|
|
|
{
|
|
|
fixed2 dir_center = IN.uv_MainTex - _UV.xy;
|
|
|
fixed2 dir = normalize(_Direction.xy);
|
|
|
fixed2 dir1 = dir.xy * _Intensity;
|
|
|
fixed2 dir2 = cross(fixed3(0, 0, 1), fixed3(dir, 0)).xy * _Intensity;
|
|
|
fixed2 offset1 = -dot(dir1, dir_center) * dir1;
|
|
|
fixed2 offset2 = dot(dir2, dir_center) * dir2;
|
|
|
uv = IN.uv_MainTex + offset1 + offset2;
|
|
|
}
|
|
|
//如果采样超出sprite范围 丢弃
|
|
|
fixed4 bound = fixed4(_UV.x - _UV.z, _UV.x + _UV.z, _UV.y - _UV.w, _UV.y + _UV.w);
|
|
|
if (uv.x < bound.x || uv.x > bound.y || uv.y < bound.z || uv.y > bound.w)
|
|
|
{
|
|
|
discard;
|
|
|
}
|
|
|
//采样
|
|
|
fixed4 c = tex2D(_MainTex, uv);
|
|
|
|
|
|
//颜色替换
|
|
|
fixed4 paletteColor = tex2D(_PaletteTex, c.br);
|
|
|
fixed4 replaceColor = tex2D(_ReplaceTex, fixed2(paletteColor.r, 1 - 0.01 - _ReplaceType * 0.0625));
|
|
|
if (any(replaceColor.rgb == fixed3(0, 0, 0)))
|
|
|
{
|
|
|
replaceColor = tex2D(_ReplaceTex, fixed2(paletteColor.r, 1 - 0.01));
|
|
|
}
|
|
|
fixed3 rgb = replaceColor.rgb;
|
|
|
|
|
|
//闪光
|
|
|
if (_Flash > 0)
|
|
|
{
|
|
|
rgb = rgb * (_Flash + 1) * _FlashColor;
|
|
|
}
|
|
|
|
|
|
//消融
|
|
|
fixed2 nioseUV = fixed2((bound.x + uv.x) / (bound.y - bound.x), (bound.z + uv.y) / (bound.w - bound.z));
|
|
|
fixed4 noise = tex2D(_FadingTex, nioseUV * 40);
|
|
|
if (_Alpha < noise.r - _FadingWidth)
|
|
|
{
|
|
|
discard;
|
|
|
}
|
|
|
if (_Alpha < noise.r)
|
|
|
{
|
|
|
o.Albedo = _FadingColor;
|
|
|
o.Emission = _FadingColor;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
o.Albedo = rgb * _Color;
|
|
|
}
|
|
|
|
|
|
o.Alpha = c.a;
|
|
|
clip(o.Alpha - 0.5);
|
|
|
}
|
|
|
ENDCG
|
|
|
}
|
|
|
FallBack "Diffuse"
|
|
|
} |