Самый эффективный способ, который я нашел, - это получить доступ к данным текстуры (вам все равно нужно декодировать наш PNG, чтобы превратить в текстуру) и самостоятельно интерполировать тексели. Предполагая, что ваши texcoords равны [0,1], умножьте texwidth u и texheight v и затем используйте это, чтобы найти положение на текстуре. Если они являются целыми числами, просто используйте пиксель напрямую, в противном случае используйте части int, чтобы найти ограничивающие пиксели и интерполировать их на основе дробных частей.
Вот некоторый HLSL-подобный psuedocode для него. Должно быть достаточно ясно:
float3 sample(float2 coord, texture tex) {
float x = tex.w * coord.x; // Get X coord in texture
int ix = (int) x; // Get X coord as whole number
float y = tex.h * coord.y;
int iy = (int) y;
float3 x1 = getTexel(ix, iy); // Get top-left pixel
float3 x2 = getTexel(ix+1, iy); // Get top-right pixel
float3 y1 = getTexel(ix, iy+1); // Get bottom-left pixel
float3 y2 = getTexel(ix+1, iy+1); // Get bottom-right pixel
float3 top = interpolate(x1, x2, frac(x)); // Interpolate between top two pixels based on the fractional part of the X coord
float3 bottom = interpolate(y1, y2, frac(x)); // Interpolate between bottom two pixels
return interpolate(top, bottom, frac(y)); // Interpolate between top and bottom based on fractional Y coord
}