2
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.7 KiB
GLSL

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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中心xyuv边界
_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"
}