- Home /
Question by
Shiver · Mar 08, 2015 at 04:22 PM ·
shadertexture2dspriterendererblur
Use result from first shader pass in second pass
I'm trying to write a shader for a SpriteRenderer which does a gaussian blur on the texture which is typically done in 2 passes. The first pass does a vertical blur and the second pass uses the result of this vertical blur and applies a horizontal blur.
I've gotten the vertical blur to work :
Shader "Tutorial/Textured Colored"
{
Properties
{
_VBlurAmount ("Vertical Blur Amount", Float) = 0.00195
_HBlurAmount ("Horizontal Blur Amount", Float) = 0.00195
_Color ("Main Color", Color) = (1,1,1,0.5)
_MainTex ("Texture", 2D) = "white" { }
_AlphaTex ("Texture", 2D) = "white" { }
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue"="Transparent" }
LOD 200
Blend SrcAlpha OneMinusSrcAlpha
ZTest Less
// Vertical blur pass
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
Name "VerticalBlur"
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float _VBlurAmount;
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
{
half4 sum = tex2D(_MainTex, float2(i.uv.x, i.uv.y)) * 0.16;
sum += tex2D(_MainTex, float2(i.uv.x, i.uv.y - _VBlurAmount)) * 0.15;
sum += tex2D(_MainTex, float2(i.uv.x, i.uv.y + _VBlurAmount)) * 0.15;
sum += tex2D(_MainTex, float2(i.uv.x, i.uv.y - 2.0 * _VBlurAmount)) * 0.12;
sum += tex2D(_MainTex, float2(i.uv.x, i.uv.y + 2.0 * _VBlurAmount)) * 0.12;
sum += tex2D(_MainTex, float2(i.uv.x, i.uv.y - 3.0 * _VBlurAmount)) * 0.09;
sum += tex2D(_MainTex, float2(i.uv.x, i.uv.y + 3.0 * _VBlurAmount)) * 0.09;
sum += tex2D(_MainTex, float2(i.uv.x, i.uv.y - 4.0 * _VBlurAmount)) * 0.05;
sum += tex2D(_MainTex, float2(i.uv.x, i.uv.y + 4.0 * _VBlurAmount)) * 0.05;
sum += tex2D(_MainTex, float2(i.uv.x, i.uv.y - 5.0 * _VBlurAmount)) * 0.025;
sum += tex2D(_MainTex, float2(i.uv.x, i.uv.y + 5.0 * _VBlurAmount)) * 0.025;
return sum;
}
ENDCG
}
// Horizontal blur pass
Pass
{
//how do I get result from previous pass?
}
}
Fallback "VertexLit"
}
But I don't know how to get the result for the second, horizontal pass. Any help appreciated, not to forget that it needs to work on a SpriteRenderer. Also, any pointers on making this shader better are appreciated :)
Comment