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

149 lines
3.5 KiB

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/FontBlur"
{
Properties
{
[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
[Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
_WaveMap ("WaveMap", 2D) = "white" {}
_MipMapLeavel("MipMapLeavel", Float) = 0
_BlurSpread("BlurSpread", Float) = 1
_StepLength("StepLength", Float) = 0
}
SubShader
{
Tags
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
"CanUseSpriteAtlas"="True"
}
Stencil
{
Ref [_Stencil]
Comp [_StencilComp]
Pass [_StencilOp]
ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask]
}
Cull Off
Lighting Off
ZWrite Off
ZTest [unity_GUIZTestMode]
Blend SrcAlpha OneMinusSrcAlpha
ColorMask [_ColorMask]
Pass
{
Name "Default"
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 2.0
#include "UnityCG.cginc"
#include "UnityUI.cginc"
#pragma multi_compile __ UNITY_UI_ALPHACLIP
struct appdata_t
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
float4 worldPosition : TEXCOORD1;
UNITY_VERTEX_OUTPUT_STEREO
};
fixed4 _Color;
float4 _ClipRect;
sampler2D _WaveMap;
float4 _MainTex_TexelSize;
float _MipMapLeavel;
float _BlurSpread;
float4 _WaveMap_ST;
float _StepLength;
v2f vert(appdata_t IN)
{
v2f OUT;
UNITY_SETUP_INSTANCE_ID(IN);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
OUT.worldPosition = IN.vertex;
OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);
OUT.texcoord = IN.texcoord;
OUT.color = IN.color * _Color;
return OUT;
}
sampler2D _MainTex;
fixed4 frag(v2f IN) : SV_Target
{
float2 tmp_texcoord = TRANSFORM_TEX(IN.texcoord, _WaveMap);
//利用灰度图的X轴得到每个像素一个随机方向并将方向转换成弧度制
half direction = tex2D(_WaveMap, tmp_texcoord).x * 3.1415926 * 2;
//从而得到需要采样点的sin和cos
fixed s;
fixed c;
sincos(direction, s, c);
//根据外部输入的步长和模糊范围算出UV偏移
float u_offset = _StepLength * c * _BlurSpread;
float v_offset = _StepLength * s * _BlurSpread;
//获取RT,每次采样都是根据时间来调整mipmap用不同的采样结果得到模糊效果
half4 sum = tex2Dlod(_MainTex, float4(IN.texcoord,0,_MipMapLeavel)) ;
float2 uv_1 = IN.texcoord;
float2 uv_2 = IN.texcoord;
//第一次UV偏移采样
uv_1.x += u_offset;
uv_1.y += v_offset;
sum += tex2Dlod(_MainTex, float4(uv_1,0,_MipMapLeavel)) ;
//第二次UV偏移采样
uv_2.x -= u_offset;
uv_2.y -= v_offset;
sum += tex2Dlod(_MainTex, float4(uv_2,0,_MipMapLeavel)) ;
//因为采样了三次 所以除以3
sum /= 3;
half4 color = sum * IN.color;
color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
#ifdef UNITY_UI_ALPHACLIP
clip (color.a - 0.001);
#endif
return color;
}
ENDCG
}
}
}