ElectricityBusinessHall_Dig.../Assets/Res/Material/BackBlurRadius.shader

303 lines
15 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Shader "Custom/UI/BackBlurRadius" {
Properties
{
[PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
_Color("Main Color", Color) = (1,1,1,1)
_Size("Size", Range(0, 20)) = 1
_Radius("Radius", Range(0,0.5)) = 0
}
Category{
// We must be transparent, so other objects are drawn before this one.
Tags {
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
"PreviewType" = "Plane"
"CanUseSpriteAtlas" = "True"
}
SubShader {
// Horizontal blur
GrabPass {
Tags { "LightMode" = "Always" }
}
Pass {
Tags { "LightMode" = "Always" }
Name "BackBlurHor"
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
fixed _Radius;
struct appdata_t {
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
float4 color : COLOR;
};
struct v2f {
float4 vertex : POSITION;
float4 uvgrab : TEXCOORD0;
float4 color : COLOR;
float2 srcUV:TEXCOORD3;
float2 adaptUV:TEXCOORD1;
};
v2f vert(appdata_t v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
#if UNITY_UV_STARTS_AT_TOP
float scale = -1.0;
#else
float scale = 1.0;
#endif
o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y * scale) + o.vertex.w) * 0.5;
o.uvgrab.zw = o.vertex.zw;
o.color = v.color;
o.srcUV = v.texcoord;
// <20><><EFBFBD><EFBFBD>uv<75><76>Χ<EFBFBD><CEA7>(0,1)<29><>(-0.5,0.5)<29><><EFBFBD><EFBFBD>ͼƬuvԭ<76><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½ǵ<C2BD><C7B5><EFBFBD><EFBFBD>ĵ<EFBFBD>
o.adaptUV = v.texcoord - fixed2(0.5, 0.5);
return o;
}
sampler2D _GrabTexture;
float4 _GrabTexture_TexelSize;
float4 _MainTex_TexelSize;
float _Size;
uniform float4 _Color;
// static float GaussianKernel[9] = {
// 0.05, 0.09, 0.12,
// 0.15, 0.18, 0.15,
// 0.12, 0.09, 0.05
// };
// static float GaussianKernel[19] = {
// 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09,
// 0.1,
// 0.09, 0.08, 0.07, 0.06, 0.05, 0.04, 0.03, 0.02, 0.01,
// };
// static float GaussianKernelD[19] = {
// -9.0, -8.0, -7.0, -6.0, -5.0, -4.0, -3.0, -2.0, -1.0,
// 0.0,
// +1.0, +2.0, +3.0, +4.0, +5.0, +6.0, +7.0, +8.0, +9.0,
// };
half4 GrabPixel(v2f i, float weight, float kernelx) {
if (i.uvgrab.x == 0 && i.uvgrab.y == 0) {
kernelx = 0;
}
return tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x + _GrabTexture_TexelSize.x * kernelx * _Size, i.uvgrab.y, i.uvgrab.z, i.uvgrab.w))) * weight;
}
half4 frag(v2f i) : COLOR {
half4 sum = half4(0,0,0,0);
// #define GRABPIXEL(weight, kernelx) tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x + _GrabTexture_TexelSize.x * kernelx*_Size, i.uvgrab.y, i.uvgrab.z, i.uvgrab.w))) * weight
sum += GrabPixel(i, 0.05, -4.0);
sum += GrabPixel(i, 0.09, -3.0);
sum += GrabPixel(i, 0.12, -2.0);
sum += GrabPixel(i, 0.15, -1.0);
sum += GrabPixel(i, 0.18, 0.0);
sum += GrabPixel(i, 0.15, +1.0);
sum += GrabPixel(i, 0.12, +2.0);
sum += GrabPixel(i, 0.09, +3.0);
sum += GrabPixel(i, 0.05, +4.0);
// sum += GrabPixel(i, 0.01, -9.0);
// sum += GrabPixel(i, 0.02, -8.0);
// sum += GrabPixel(i, 0.03, -7.0);
// sum += GrabPixel(i, 0.04, -6.0);
// sum += GrabPixel(i, 0.05, -5.0);
// sum += GrabPixel(i, 0.06, -4.0);
// sum += GrabPixel(i, 0.07, -3.0);
// sum += GrabPixel(i, 0.08, -2.0);
// sum += GrabPixel(i, 0.09, -1.0);
// sum += GrabPixel(i, 0.10, 0.0);
// sum += GrabPixel(i, 0.09, +1.0);
// sum += GrabPixel(i, 0.08, +2.0);
// sum += GrabPixel(i, 0.07, +3.0);
// sum += GrabPixel(i, 0.06, +4.0);
// sum += GrabPixel(i, 0.05, +5.0);
// sum += GrabPixel(i, 0.04, +6.0);
// sum += GrabPixel(i, 0.03, +7.0);
// sum += GrabPixel(i, 0.02, +8.0);
// sum += GrabPixel(i, 0.01, +9.0);
float4 col5 = tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(i.uvgrab));
float decayFactor = 1.0f;
if (i.uvgrab.x == 0 && i.uvgrab.y == 0) {
decayFactor = 0;
}
sum = lerp(col5, sum, decayFactor) * i.color * _Color;
fixed4 col = fixed4(0, 0, 0, 0);
// <20><><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD>м䲿<D0BC>֣<EFBFBD><D6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD>ǰ뾶<C7B0><EBBEB6><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>(adaptUV x y <20><><EFBFBD><EFBFBD>ֵС<D6B5><D0A1> 0.5-Բ<>ǰ뾶<C7B0>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>)
if (abs(i.adaptUV).x < (0.5 - _Radius) || abs(i.adaptUV).y < (0.5 - _Radius))
{
col = tex2D(_GrabTexture, i.srcUV);
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>Բ<EFBFBD>Dz<EFBFBD><C7B2>֣<EFBFBD><D6A3><EFBFBD><E0B5B1><EFBFBD><EFBFBD> <20><>0.5-Բ<>ǰ뾶<C7B0><EBBEB6>0.5-Բ<>ǰ뾶<C7B0><EBBEB6>ΪԲ<CEAA>ģ<EFBFBD><C4A3><EFBFBD> uv <20><> Բ<>ǰ뾶<C7B0>ڵ<EFBFBD>uv<75><76><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>
if (length(abs(i.adaptUV) - fixed2(0.5 - _Radius, 0.5 - _Radius)) < _Radius) {
col = tex2D(_GrabTexture, i.srcUV);
}
else// <20><><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2>ֺ<EFBFBD><D6BA>Ե<EFBFBD>
{
discard;
}
}
return sum;
}
ENDCG
}
// Vertical blur
GrabPass {
Tags { "LightMode" = "Always" }
}
Pass {
Tags { "LightMode" = "Always" }
Name "BackBlurVer"
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
//sampler2D _MainTex;
fixed _Radius;
//fixed4 _Color;
//struct v2f {
// float4 pos:SV_POSITION;
// float2 srcUV:TEXCOORD0; // ԭ<><D4AD><EFBFBD><EFBFBD>uv
// float2 adaptUV:TEXCOORD1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uv
//};
struct appdata_t {
float4 vertex : POSITION;
float2 texcoord: TEXCOORD0;
float4 color : COLOR; // ԭ<><D4AD><EFBFBD><EFBFBD>uv
//float2 adaptUV:TEXCOORD1;
};
struct v2f {
float4 vertex : POSITION;
float4 uvgrab : TEXCOORD0;
float4 color : COLOR; // ԭ<><D4AD><EFBFBD><EFBFBD>uv
float2 srcUV:TEXCOORD3;
float2 adaptUV:TEXCOORD1;
};
v2f vert(appdata_t v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
#if UNITY_UV_STARTS_AT_TOP
float scale = -1.0;
#else
float scale = 1.0;
#endif
o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y * scale) + o.vertex.w) * 0.5;
o.uvgrab.zw = o.vertex.zw;
o.color = v.color;
//o.pos = UnityObjectToClipPos(v.vertex);
o.srcUV = v.texcoord;
// <20><><EFBFBD><EFBFBD>uv<75><76>Χ<EFBFBD><CEA7>(0,1)<29><>(-0.5,0.5)<29><><EFBFBD><EFBFBD>ͼƬuvԭ<76><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½ǵ<C2BD><C7B5><EFBFBD><EFBFBD>ĵ<EFBFBD>
o.adaptUV = v.texcoord - fixed2(0.5, 0.5);
return o;
}
//v2f vert(appdata_base v) {
// v2f o;
// o.pos = UnityObjectToClipPos(v.vertex);
// o.srcUV = v.texcoord;
// // <20><><EFBFBD><EFBFBD>uv<75><76>Χ<EFBFBD><CEA7>(0,1)<29><>(-0.5,0.5)<29><><EFBFBD><EFBFBD>ͼƬuvԭ<76><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½ǵ<C2BD><C7B5><EFBFBD><EFBFBD>ĵ<EFBFBD>
// o.adaptUV = o.srcUV - fixed2(0.5, 0.5);
// return o;
//}
sampler2D _GrabTexture;
float4 _GrabTexture_TexelSize;
float _Size;
uniform float4 _Color;
half4 GrabPixel(v2f i, float weight, float kernely) {
if (i.uvgrab.x == 0 && i.uvgrab.y == 0) {
kernely = 0;
}
return tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x, i.uvgrab.y + _GrabTexture_TexelSize.y * kernely * _Size, i.uvgrab.z, i.uvgrab.w))) * weight;
}
half4 frag(v2f i) : COLOR {
half4 sum = half4(0,0,0,0);
// #define GRABPIXEL(weight,kernely) tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x, i.uvgrab.y + _GrabTexture_TexelSize.y * kernely*_Size, i.uvgrab.z, i.uvgrab.w))) * weight
sum += GrabPixel(i, 0.05, -4.0);
sum += GrabPixel(i, 0.09, -3.0);
sum += GrabPixel(i, 0.12, -2.0);
sum += GrabPixel(i, 0.15, -1.0);
sum += GrabPixel(i, 0.18, 0.0);
sum += GrabPixel(i, 0.15, +1.0);
sum += GrabPixel(i, 0.12, +2.0);
sum += GrabPixel(i, 0.09, +3.0);
sum += GrabPixel(i, 0.05, +4.0);
// sum += GrabPixel(i, 0.01, -9.0);
// sum += GrabPixel(i, 0.02, -8.0);
// sum += GrabPixel(i, 0.03, -7.0);
// sum += GrabPixel(i, 0.04, -6.0);
// sum += GrabPixel(i, 0.05, -5.0);
// sum += GrabPixel(i, 0.06, -4.0);
// sum += GrabPixel(i, 0.07, -3.0);
// sum += GrabPixel(i, 0.08, -2.0);
// sum += GrabPixel(i, 0.09, -1.0);
// sum += GrabPixel(i, 0.10, 0.0);
// sum += GrabPixel(i, 0.09, +1.0);
// sum += GrabPixel(i, 0.08, +2.0);
// sum += GrabPixel(i, 0.07, +3.0);
// sum += GrabPixel(i, 0.06, +4.0);
// sum += GrabPixel(i, 0.05, +5.0);
// sum += GrabPixel(i, 0.04, +6.0);
// sum += GrabPixel(i, 0.03, +7.0);
// sum += GrabPixel(i, 0.02, +8.0);
// sum += GrabPixel(i, 0.01, +9.0);
float4 col5 = tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(i.uvgrab));
float decayFactor = 1.0f;
if (i.uvgrab.x == 0 && i.uvgrab.y == 0) {
decayFactor = 0;
}
sum = lerp(col5, sum, decayFactor) * i.color * _Color;
fixed4 col = fixed4(0, 0, 0, 0);
// <20><><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD>м䲿<D0BC>֣<EFBFBD><D6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD>ǰ뾶<C7B0><EBBEB6><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>(adaptUV x y <20><><EFBFBD><EFBFBD>ֵС<D6B5><D0A1> 0.5-Բ<>ǰ뾶<C7B0>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>)
if (abs(i.adaptUV).x < (0.5 - _Radius) || abs(i.adaptUV).y < (0.5 - _Radius))
{
col = tex2D(_GrabTexture, i.srcUV);
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>Բ<EFBFBD>Dz<EFBFBD><C7B2>֣<EFBFBD><D6A3><EFBFBD><E0B5B1><EFBFBD><EFBFBD> <20><>0.5-Բ<>ǰ뾶<C7B0><EBBEB6>0.5-Բ<>ǰ뾶<C7B0><EBBEB6>ΪԲ<CEAA>ģ<EFBFBD><C4A3><EFBFBD> uv <20><> Բ<>ǰ뾶<C7B0>ڵ<EFBFBD>uv<75><76><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>
if (length(abs(i.adaptUV) - fixed2(0.5 - _Radius, 0.5 - _Radius)) < _Radius) {
col = tex2D(_GrabTexture, i.srcUV);
}
else// <20><><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2>ֺ<EFBFBD><D6BA>Ե<EFBFBD>
{
discard;
}
}
return sum;
}
ENDCG
}
}
}
}