« GPU Optical Flow | Main | Mac PBuffers »

May 17, 2005

Emulating Bilinear Filtering

Most graphics cards that support float textures can't bilinear filter them. We can use a fragment program to do the filtering for us, but it's tricky to get right. Here's an example of how to do it:

!!ARBfp1.0

ATTRIB inputCoords = fragment.texcoord[0];

TEMP sourceCoords;
TEMP sourceCoordsTopLeft, sourceCoordsTopRight, sourceCoordsBottomLeft, sourceCoordsBottomRight, fraction;
TEMP sourceTopLeft,sourceTopRight,sourceBottomLeft,sourceBottomRight;

SUB sourceCoords, inputCoords, {0.5, 0.5, 0.0, 0.0};
FRC fraction.x, sourceCoords.x;
FRC fraction.y, sourceCoords.y;
SUB sourceCoords, sourceCoords, fraction;
ADD sourceCoords, sourceCoords, {0.5, 0.5, 0.0, 0.0};

ADD sourceCoordsTopLeft, sourceCoords, {1,1,0,0};
ADD sourceCoordsTopRight, sourceCoords, {0,1,0,0};
ADD sourceCoordsBottomLeft, sourceCoords, {1,0,0,0};
ADD sourceCoordsBottomRight, sourceCoords, {0,0,0,0};

TEX sourceTopLeft, sourceCoordsTopLeft, texture[0], RECT;
TEX sourceTopRight, sourceCoordsTopRight, texture[0], RECT;
TEX sourceBottomLeft, sourceCoordsBottomLeft, texture[0], RECT;
TEX sourceBottomRight, sourceCoordsBottomRight, texture[0], RECT;

LRP sourceTopLeft, fraction.x, sourceTopLeft, sourceTopRight;
LRP sourceBottomLeft, fraction.x, sourceBottomLeft, sourceBottomRight;
LRP result.color, fraction.y, sourceTopLeft, sourceBottomLeft;

END

Posted by petewarden at May 17, 2005 04:32 PM

Comments

Post a comment




Remember Me?