float4 res : register(c0); float4 glow : register(c31); sampler2D colorSampler : register(s0); sampler2D guideSampler : register(s4); static float2 fGaussianWeights[] = { float2(-3.0f, 0.015625f), float2(-2.0f, 0.09375f), float2(-1.0f, 0.234375f), float2(0.0f, 0.3125f), float2(1.0f, 0.234375f), float2(2.0f, 0.09375f), float2(3.0f, 0.015625f) }; float4 ps_blur(float2 t : TEXCOORD0, uniform float2 vDir) : COLOR0 { float2 vDelta = vDir * res.zw; float4 fColor = 0.f; for(int i = 0; i < 7; i++) fColor += fGaussianWeights[i].y * tex2D(colorSampler, t + fGaussianWeights[i].x * vDelta); return fColor; } float4 ps_blur_hor(float2 t : TEXCOORD0) : COLOR0 { return ps_blur(t, float2(1.f, 0.f)); } float4 ps_blur_ver(float2 t : TEXCOORD0) : COLOR0 { return ps_blur(t, float2(0.f, 1.f)); } float4 ps_blur_bil(float2 t : TEXCOORD0, uniform float2 vDir) : COLOR0 { float2 vDelta = vDir * res.zw; float4 fGuide = tex2D(guideSampler, t); float4 fColor = 0.f; float fWeight = 0.f; for(int i = 0; i < 7; i++) { float2 to = t + vDelta * fGaussianWeights[i].x; float4 fSample = tex2D(colorSampler, to); float fSampleWeight = (1.f - saturate(4.f * (fGuide.w - fSample.w))) * fGaussianWeights[i].y; fColor += fSample * fSampleWeight; fWeight += fSampleWeight; } return lerp(fGuide, fColor / fWeight, fWeight); } float4 ps_blur_bil_hor(float2 t : TEXCOORD0) : COLOR0 { return ps_blur_bil(t, float2(1.f, 0.f)); } float4 ps_blur_bil_ver(float2 t : TEXCOORD0) : COLOR0 { return ps_blur_bil(t, float2(0.f, 1.f)); } float4 ps_extract_inv_alpha(float2 t : TEXCOORD0) : COLOR0 { float4 c = tex2D(colorSampler, t); c.a = 1.f - c.a; c.xyz *= c.a; return c * glow; }