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.
147 lines
3.5 KiB
147 lines
3.5 KiB
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
|
|
|
|
Shader "RapidBlurEffect"
|
|
{
|
|
Properties
|
|
{
|
|
_MainTex("Base (RGB)", 2D) = "white" {}
|
|
}
|
|
|
|
SubShader
|
|
{
|
|
ZWrite Off
|
|
Blend Off
|
|
|
|
Pass
|
|
{
|
|
ZTest Off
|
|
Cull Off
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert_DownSmpl
|
|
#pragma fragment frag_DownSmpl
|
|
ENDCG
|
|
}
|
|
|
|
Pass
|
|
{
|
|
ZTest Always
|
|
Cull Off
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert_BlurVertical
|
|
#pragma fragment frag_Blur
|
|
ENDCG
|
|
}
|
|
|
|
Pass
|
|
{
|
|
ZTest Always
|
|
Cull Off
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert_BlurHorizontal
|
|
#pragma fragment frag_Blur
|
|
ENDCG
|
|
}
|
|
}
|
|
|
|
CGINCLUDE
|
|
|
|
#include "UnityCG.cginc"
|
|
|
|
sampler2D _MainTex;
|
|
uniform half4 _MainTex_TexelSize;
|
|
uniform half _DownSampleValue;
|
|
|
|
struct VertexInput
|
|
{
|
|
float4 vertex : POSITION;
|
|
half2 texcoord : TEXCOORD0;
|
|
};
|
|
|
|
struct VertexOutput_DownSmpl
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
half2 uv20 : TEXCOORD0;
|
|
half2 uv21 : TEXCOORD1;
|
|
half2 uv22 : TEXCOORD2;
|
|
half2 uv23 : TEXCOORD3;
|
|
};
|
|
|
|
static const half4 GaussWeight[7] =
|
|
{
|
|
half4(0.0205,0.0205,0.0205,0),
|
|
half4(0.0855,0.0855,0.0855,0),
|
|
half4(0.232,0.232,0.232,0),
|
|
half4(0.324,0.324,0.324,1),
|
|
half4(0.232,0.232,0.232,0),
|
|
half4(0.0855,0.0855,0.0855,0),
|
|
half4(0.0205,0.0205,0.0205,0)
|
|
};
|
|
|
|
VertexOutput_DownSmpl vert_DownSmpl(VertexInput v)
|
|
{
|
|
VertexOutput_DownSmpl o;
|
|
o.pos = UnityObjectToClipPos(v.vertex);
|
|
o.uv20 = v.texcoord + _MainTex_TexelSize.xy* half2(0.5h, 0.5h);;
|
|
o.uv21 = v.texcoord + _MainTex_TexelSize.xy * half2(-0.5h, -0.5h);
|
|
o.uv22 = v.texcoord + _MainTex_TexelSize.xy * half2(0.5h, -0.5h);
|
|
o.uv23 = v.texcoord + _MainTex_TexelSize.xy * half2(-0.5h, 0.5h);
|
|
return o;
|
|
}
|
|
|
|
fixed4 frag_DownSmpl(VertexOutput_DownSmpl i) : SV_Target
|
|
{
|
|
fixed4 color = (0,0,0,0);
|
|
color += tex2D(_MainTex, i.uv20);
|
|
color += tex2D(_MainTex, i.uv21);
|
|
color += tex2D(_MainTex, i.uv22);
|
|
color += tex2D(_MainTex, i.uv23);
|
|
return color / 4;
|
|
}
|
|
|
|
struct VertexOutput_Blur
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
half4 uv : TEXCOORD0;
|
|
half2 offset : TEXCOORD1;
|
|
};
|
|
|
|
VertexOutput_Blur vert_BlurHorizontal(VertexInput v)
|
|
{
|
|
VertexOutput_Blur o;
|
|
o.pos = UnityObjectToClipPos(v.vertex);
|
|
o.uv = half4(v.texcoord.xy, 1, 1);
|
|
o.offset = _MainTex_TexelSize.xy * half2(1.0, 0.0) * _DownSampleValue;
|
|
return o;
|
|
}
|
|
|
|
VertexOutput_Blur vert_BlurVertical(VertexInput v)
|
|
{
|
|
VertexOutput_Blur o;
|
|
o.pos = UnityObjectToClipPos(v.vertex);
|
|
o.uv = half4(v.texcoord.xy, 1, 1);
|
|
o.offset = _MainTex_TexelSize.xy * half2(0.0, 1.0) * _DownSampleValue;
|
|
return o;
|
|
}
|
|
|
|
half4 frag_Blur(VertexOutput_Blur i) : SV_Target
|
|
{
|
|
half2 uv = i.uv.xy;
|
|
half2 OffsetWidth = i.offset;
|
|
half2 uv_withOffset = uv - OffsetWidth * 3.0;
|
|
half4 color = 0;
|
|
for (int j = 0; j< 7; j++)
|
|
{
|
|
half4 texCol = tex2D(_MainTex, uv_withOffset);
|
|
color += texCol * GaussWeight[j];
|
|
uv_withOffset += OffsetWidth;
|
|
}
|
|
return color;
|
|
}
|
|
|
|
ENDCG
|
|
|
|
FallBack Off
|
|
}
|
|
|