Вот оригинальный шейдер http://www.gamerendering.com/2008/10/11 ... er-shader/
А вот что вышло у меня, работает только последний "пасс"
Синтаксис:
Используется csharp
Shader "ex2D/Gaussian Blur" {
Properties {
_MainTex ("Atlas Texture", 2D) = "white" {}
_BlurSize ("Blur Size", Range(0.9900, 0.9999)) = 0.2
}
SubShader {
Tags {
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
}
Cull Off
Lighting Off
ZWrite Off
Fog { Color (0,0,0,0) }
Blend SrcAlpha OneMinusSrcAlpha
BindChannels {
Bind "Color", color
Bind "Vertex", vertex
Bind "TexCoord", texcoord
}
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float _BlurSize;
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
float4 _MainTex_ST;
sampler2D hBlurSample;
v2f vert (appdata_base v) {
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
return o;
}
half4 frag (v2f i) : COLOR {
// blur in x (horizontal)
float4 sum = float4(0.0);
// take nine samples, with the distance blurSize between them
sum += tex2D (_MainTex, float2(i.uv.x - 4.0*_BlurSize, i.uv.y)) * 0.05;
sum += tex2D (_MainTex, float2(i.uv.x - 3.0*_BlurSize, i.uv.y)) * 0.09;
sum += tex2D (_MainTex, float2(i.uv.x - 2.0*_BlurSize, i.uv.y)) * 0.12;
sum += tex2D (_MainTex, float2(i.uv.x - _BlurSize, i.uv.y)) * 0.15;
sum += tex2D (_MainTex, i.uv) * 0.16;
sum += tex2D (_MainTex, float2(i.uv.x + _BlurSize, i.uv.y)) * 0.15;
sum += tex2D (_MainTex, float2(i.uv.x + 2.0*_BlurSize, i.uv.y)) * 0.12;
sum += tex2D (_MainTex, float2(i.uv.x + 3.0*_BlurSize, i.uv.y)) * 0.09;
sum += tex2D (_MainTex, float2(i.uv.x + 4.0*_BlurSize, i.uv.y)) * 0.05;
half4 texcol = sum;
return texcol;
}
ENDCG
}
Pass {
Name "Vertical Blur"
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float _BlurSize;
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
float4 _MainTex_ST;
v2f vert (appdata_base v) {
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
return o;
}
half4 frag (v2f i) : COLOR {
// blur in y (vertical)
float4 sum = float4(0.0);
// take nine samples, with the distance blurSize between them
sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y - 4.0*_BlurSize)) * 0.05;
sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y - 3.0*_BlurSize)) * 0.09;
sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y - 2.0*_BlurSize)) * 0.12;
sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y - _BlurSize)) * 0.15;
sum += tex2D (_MainTex, i.uv) * 0.16;
sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y + _BlurSize)) * 0.15;
sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y + 2.0*_BlurSize)) * 0.12;
sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y + 3.0*_BlurSize)) * 0.09;
sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y + 4.0*_BlurSize)) * 0.05;
half4 texcol = sum;
return texcol;
}
ENDCG
}
}
FallBack "ex2D/Alpha Blended"
}
Properties {
_MainTex ("Atlas Texture", 2D) = "white" {}
_BlurSize ("Blur Size", Range(0.9900, 0.9999)) = 0.2
}
SubShader {
Tags {
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
}
Cull Off
Lighting Off
ZWrite Off
Fog { Color (0,0,0,0) }
Blend SrcAlpha OneMinusSrcAlpha
BindChannels {
Bind "Color", color
Bind "Vertex", vertex
Bind "TexCoord", texcoord
}
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float _BlurSize;
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
float4 _MainTex_ST;
sampler2D hBlurSample;
v2f vert (appdata_base v) {
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
return o;
}
half4 frag (v2f i) : COLOR {
// blur in x (horizontal)
float4 sum = float4(0.0);
// take nine samples, with the distance blurSize between them
sum += tex2D (_MainTex, float2(i.uv.x - 4.0*_BlurSize, i.uv.y)) * 0.05;
sum += tex2D (_MainTex, float2(i.uv.x - 3.0*_BlurSize, i.uv.y)) * 0.09;
sum += tex2D (_MainTex, float2(i.uv.x - 2.0*_BlurSize, i.uv.y)) * 0.12;
sum += tex2D (_MainTex, float2(i.uv.x - _BlurSize, i.uv.y)) * 0.15;
sum += tex2D (_MainTex, i.uv) * 0.16;
sum += tex2D (_MainTex, float2(i.uv.x + _BlurSize, i.uv.y)) * 0.15;
sum += tex2D (_MainTex, float2(i.uv.x + 2.0*_BlurSize, i.uv.y)) * 0.12;
sum += tex2D (_MainTex, float2(i.uv.x + 3.0*_BlurSize, i.uv.y)) * 0.09;
sum += tex2D (_MainTex, float2(i.uv.x + 4.0*_BlurSize, i.uv.y)) * 0.05;
half4 texcol = sum;
return texcol;
}
ENDCG
}
Pass {
Name "Vertical Blur"
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float _BlurSize;
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
float4 _MainTex_ST;
v2f vert (appdata_base v) {
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
return o;
}
half4 frag (v2f i) : COLOR {
// blur in y (vertical)
float4 sum = float4(0.0);
// take nine samples, with the distance blurSize between them
sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y - 4.0*_BlurSize)) * 0.05;
sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y - 3.0*_BlurSize)) * 0.09;
sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y - 2.0*_BlurSize)) * 0.12;
sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y - _BlurSize)) * 0.15;
sum += tex2D (_MainTex, i.uv) * 0.16;
sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y + _BlurSize)) * 0.15;
sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y + 2.0*_BlurSize)) * 0.12;
sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y + 3.0*_BlurSize)) * 0.09;
sum += tex2D (_MainTex, float2(i.uv.x, i.uv.y + 4.0*_BlurSize)) * 0.05;
half4 texcol = sum;
return texcol;
}
ENDCG
}
}
FallBack "ex2D/Alpha Blended"
}