« 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