home *** CD-ROM | disk | FTP | other *** search
- sampler s0 : register(s0);
-
- float4 p0 : register(c0);
- float2 dxdy : register(c1);
- float2 dx : register(c2);
- float2 dy : register(c3);
-
- #define size (p0.xy)
- #define A _The_Value_Of_A_Is_Set_Here_
-
- float4 main_bilinear(float2 tex : TEXCOORD0) : COLOR
- {
- // not usable for 1:1 mapping!
- // tex * size won't be 0, 1, 2, 3, .. as you might expect, but something like 0, 0.999, 2.001, 2.999, ...
- // this means when the fractional part becomes 0.999 we will be interpolating with the wrong value!!!
-
- tex -= 0.5*dxdy;
-
- float2 dd = frac(tex * size);
-
- float4 c = lerp(
- lerp(tex2D(s0, tex), tex2D(s0, tex + dx), dd.x),
- lerp(tex2D(s0, tex + dy), tex2D(s0, tex + dxdy), dd.x),
- dd.y);
-
- return c;
- }
-
- static float4x4 tco =
- {
- 0, A, -2*A, A,
- 1, 0, -A-3, A+2,
- 0, -A, 2*A+3, -A-2,
- 0, 0, A, -A
- };
-
- float4 taps(float x)
- {
- return mul(tco, float4(1, x, x*x, x*x*x));
- }
-
- float4 c3sample(float4 taps, float2 t)
- {
- return
- mul(taps,
- float4x4(
- tex2D(s0, t-dx),
- tex2D(s0, t),
- tex2D(s0, t+dx),
- tex2D(s0, t+dx+dx)
- )
- );
- }
-
- float4 main_bicubic(float2 tex : TEXCOORD0) : COLOR
- {
- // not usable for 1:1 mapping!
- // tex * size won't be 0, 1, 2, 3, .. as you might expect, but something like 0, 0.999, 2.001, 2.999, ...
- // this means when the fractional part becomes 0.999 we will be interpolating with the wrong value!!!
-
- tex -= 0.5*dxdy;
-
- float2 dd = frac(tex * size);
-
- float4 tx = taps(dd.x);
- float4 c = mul(
- taps(dd.y),
- float4x4(
- c3sample(tx, tex-dy),
- c3sample(tx, tex),
- c3sample(tx, tex+dy),
- c3sample(tx, tex+dy+dy)
- )
- );
-
- return c;
- }
-