struct outtype {float4 color : COLOR;}; uniform float4 srctexsize; outtype blur1(float2 uv : TEXCOORD0, uniform sampler2D sampler_blur : TEX0) { float2 uv2 = uv.xy + srctexsize.zw*float2(1,1); float d=.00175; float3 val = tex2D(sampler_blur, float2(uv.x-d, uv.y)).xyz; val += tex2D(sampler_blur, float2(uv.x+d, uv.y)).xyz; val += tex2D(sampler_blur, float2(uv.x, uv.y + d)).xyz; val += tex2D(sampler_blur, float2(uv.x, uv.y - d)).xyz; float3 val2 = tex2D(sampler_blur, float2(uv.x-d, uv.y -d)).xyz; val += tex2D(sampler_blur, float2(uv.x-d, uv.y +d)).xyz; val += tex2D(sampler_blur, float2(uv.x+d, uv.y + d)).xyz; val += tex2D(sampler_blur, float2(uv.x +d, uv.y - d)).xyz; outtype OUT; val *= 0.65; val2 *= 0.35; OUT.color.xyz = val* 0.25 + val2 * 0.25; OUT.color.w = 1; return OUT; } outtype blur2(float2 uv : TEXCOORD0, uniform sampler2D sampler_blur : TEX0) { float2 uv2 = uv.xy + srctexsize.zw*float2(1,0); float d = srctexsize.z; d=.0015; float3 val = tex2D(sampler_blur, float2(uv.x-d, uv.y)).xyz; val += tex2D(sampler_blur, float2(uv.x+d, uv.y)).xyz; val += tex2D(sampler_blur, float2(uv.x, uv.y + d)).xyz; val += tex2D(sampler_blur, float2(uv.x, uv.y - d)).xyz; val *= 0.25; float t = min( min(uv.x, uv.y), 1-max(uv.x,uv.y) ); t = sqrt(t); float minimum = 0.5; float variance = 0.5; float size = 50; t = minimum + variance*saturate(t*size); t = 1; val.xyz *= t; outtype OUT; OUT.color.xyz = val; OUT.color.w = 1; return OUT; } outtype blurHoriz(float2 uv : TEXCOORD0, uniform sampler2D sampler_blur : TEX0) { // LONG HORIZ. PASS 1: const float w[8] = { 4.0, 3.8, 3.5, 2.9, 1.9, 1.2, 0.7, 0.3 }; const float w1 = w[0] + w[1]; const float w2 = w[2] + w[3]; const float w3 = w[4] + w[5]; const float w4 = w[6] + w[7]; const float d1 = 0 + 2*w[1]/w1; const float d2 = 2 + 2*w[3]/w2; const float d3 = 4 + 2*w[5]/w3; const float d4 = 6 + 2*w[7]/w4; const float w_div = 0.5/(w1+w2+w3+w4); float fscale = 1; float fbias = 0; // note: if you just take one sample at exactly uv.xy, you get an avg of 4 pixels. //float2 uv2 = uv.xy;// + srctexsize.zw*float2(0.5,0.5); float2 uv2 = uv.xy + srctexsize.zw*float2(1,1); // + moves blur UP, LEFT by 1-pixel increments float3 blur = ( tex2D( sampler_blur, uv2 + float2( d1*srctexsize.z,0) ).xyz + tex2D( sampler_blur, uv2 + float2(-d1*srctexsize.z,0) ).xyz)*w1 + ( tex2D( sampler_blur, uv2 + float2( d2*srctexsize.z,0) ).xyz + tex2D( sampler_blur, uv2 + float2(-d2*srctexsize.z,0) ).xyz)*w2 + ( tex2D( sampler_blur, uv2 + float2( d3*srctexsize.z,0) ).xyz + tex2D( sampler_blur, uv2 + float2(-d3*srctexsize.z,0) ).xyz)*w3 + ( tex2D( sampler_blur, uv2 + float2( d4*srctexsize.z,0) ).xyz + tex2D( sampler_blur, uv2 + float2(-d4*srctexsize.z,0) ).xyz)*w4 ; blur.xyz *= w_div; blur.xyz = blur.xyz*fscale + fbias; outtype OUT; OUT.color.xyz = blur; OUT.color.w = 1; return OUT; } outtype blurVert(float2 uv : TEXCOORD0, uniform sampler2D sampler_blur : TEX0) { //SHORT VERTICAL PASS 2: const float w[8] = { 4.0, 3.8, 3.5, 2.9, 1.9, 1.2, 0.7, 0.3 }; const float w1 = w[0]+w[1] + w[2]+w[3]; const float w2 = w[4]+w[5] + w[6]+w[7]; const float d1 = 0 + 2*((w[2]+w[3])/w1); const float d2 = 2 + 2*((w[6]+w[7])/w2); const float w_div = 1.0/((w1+w2)*2); // note: if you just take one sample at exactly uv.xy, you get an avg of 4 pixels. //float2 uv2 = uv.xy;// + srctexsize.zw*float2(-0.5,-0.5); float2 uv2 = uv.xy + srctexsize.zw*float2(1,0); // + moves blur UP, LEFT by TWO-pixel increments! (since texture is 1/2 the size of blur1_ps) float3 blur = ( tex2D( sampler_blur, uv2 + float2(0, d1*srctexsize.w) ).xyz + tex2D( sampler_blur, uv2 + float2(0,-d1*srctexsize.w) ).xyz)*w1 + ( tex2D( sampler_blur, uv2 + float2(0, d2*srctexsize.w) ).xyz + tex2D( sampler_blur, uv2 + float2(0,-d2*srctexsize.w) ).xyz)*w2 ; blur.xyz *= w_div; // tone it down at the edges: (only happens on 1st X pass!) float t = min( min(uv.x, uv.y), 1-max(uv.x,uv.y) ); float minimum = 0.5; float variance = 0.5; float size = 50; blur.xyz *= t; t = sqrt(t); t = minimum + variance*saturate(t*size); t=1; blur.xyz *= t; outtype OUT; OUT.color.xyz = blur; OUT.color.w = 1; return OUT; }