#include #include #include #include #define MAX_TEXTURES 8 #define WINDSIZEX 100 #define WINDSIZEY 100 int imgWidth = 2, imgHeight = 2; GLuint texobj; // Texture object ID. GLfloat *outrgb; GLfloat input[] = {0.0967741907, 1, 0.193548381, 0.806451559, 0.129032254, 0.387096763, 0.838709652, 0.612903237, 0.290322572, 0.806451559, 0.129032254, 0.387096763}; GLboolean checkExt(char *extName){ return gluCheckExtension(extName, glGetString(GL_EXTENSIONS)); } void init(void) { int i, j; // Check for presence of texture compression extension. if (! checkExt("GL_ARB_texture_compression")) { exit(2); } if (checkExt("GL_3DFX_texture_compression_FXT1") == GL_FALSE){ exit(2); } glHint (GL_TEXTURE_COMPRESSION_HINT_ARB, GL_NICEST); glDisable(GL_DITHER); glClearColor(1,1,1,1); glEnable (GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glGenTextures(1, &texobj); glBindTexture (GL_TEXTURE_2D, texobj); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); outrgb = malloc (3 * WINDSIZEX * WINDSIZEY * sizeof(GLfloat)); printf("imgWidth is %d, imgHeight is %d\n", imgWidth, imgHeight); for (i=0; i<2; i++) for(j=0; j<2; j++) { int index2 = (j*2+i)*3; printf("%d, %d origin img: %f %f %f\n", i, j, input[index2], input[index2+1], input[index2+2]); } printf("image format is : GL_COMPRESSED_RGB_FXT1_3DFX\n"); glTexImage2D (GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_FXT1_3DFX, 2, 2, 0, GL_RGB, GL_FLOAT, input); } void display(void) { int i, j; glViewport(0, 0, WINDSIZEX, WINDSIZEY); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, WINDSIZEX, 0, WINDSIZEY); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glGetTexImage (GL_TEXTURE_2D, 0, GL_RGB, GL_FLOAT, outrgb); for (i=0; i<2; i++) for(j=0; j<2; j++) { int index1 = (j*2+i)*3; printf("(%d, %d) get img: %f %f %f\n", i, j, outrgb[index1], outrgb[index1+1], outrgb[index1+2]); printf(" origin img: %f %f %f\n", input[index1], input[index1+1], input[index1+2]); } free(outrgb); glDeleteTextures(1, &texobj); printf("PASS!\n"); exit(0); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(WINDSIZEX, WINDSIZEY); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutMainLoop(); return 0; }