86 lines
1.9 KiB
Plaintext
86 lines
1.9 KiB
Plaintext
/*
|
|
* 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);
|
|
}
|
|
}
|
|
|