/* * bilinear low res scaling, samples 8 pixels of a larger image to scale to a * low resolution image below half size */ uniform float4x4 ViewProj; uniform texture2d image; sampler_state textureSampler { Filter = Linear; AddressU = Clamp; AddressV = Clamp; }; struct VertData { float4 pos : POSITION; float2 uv : TEXCOORD0; }; VertData VSDefault(VertData v_in) { VertData vert_out; vert_out.pos = mul(float4(v_in.pos.xyz, 1.0), ViewProj); vert_out.uv = v_in.uv; return vert_out; } float4 pixel(float2 uv) { return image.Sample(textureSampler, uv); } float4 DrawLowresBilinear(VertData v_in) { float2 uv = v_in.uv; float2 stepxy = float2(ddx(uv.x), ddy(uv.y)); float2 stepxy1 = stepxy * 0.0625; float2 stepxy3 = stepxy * 0.1875; float2 stepxy5 = stepxy * 0.3125; float2 stepxy7 = stepxy * 0.4375; // Simulate Direct3D 8-sample pattern float4 out_color; out_color = pixel(uv + float2( stepxy1.x, -stepxy3.y)); out_color += pixel(uv + float2(-stepxy1.x, stepxy3.y)); out_color += pixel(uv + float2( stepxy5.x, stepxy1.y)); out_color += pixel(uv + float2(-stepxy3.x, -stepxy5.y)); out_color += pixel(uv + float2(-stepxy5.x, stepxy5.y)); out_color += pixel(uv + float2(-stepxy7.x, -stepxy1.y)); out_color += pixel(uv + float2( stepxy3.x, stepxy7.y)); out_color += pixel(uv + float2( stepxy7.x, -stepxy7.y)); return out_color * 0.125; } float4 PSDrawLowresBilinearRGBA(VertData v_in) : TARGET { return DrawLowresBilinear(v_in); } float4 PSDrawLowresBilinearRGBADivide(VertData v_in) : TARGET { float4 rgba = DrawLowresBilinear(v_in); float alpha = rgba.a; float multiplier = (alpha > 0.0) ? (1.0 / alpha) : 0.0; return float4(rgba.rgb * multiplier, alpha); } technique Draw { pass { vertex_shader = VSDefault(v_in); pixel_shader = PSDrawLowresBilinearRGBA(v_in); } } technique DrawAlphaDivide { pass { vertex_shader = VSDefault(v_in); pixel_shader = PSDrawLowresBilinearRGBADivide(v_in); } }