#include #include #include #include #define WINDSIZEX 100 #define WINDSIZEY 100 void init (void) { int i; GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 }; glClearColor (0.0, 0.0, 0.0, 1.0); glColor4fv (white); gluOrtho2D (0, WINDSIZEX, 0, WINDSIZEY); glDisable (GL_DITHER); } void Maketexture(GLsizei size, GLfloat *buf, long texnum) { GLint level, i, j, k; for (i = 0; i < size; i++) { for (j = 0; j < size; j++) { k = (i * size + j) * 3; buf[k+0] = (texnum == 0) ? 0.0 : 1.0; buf[k+1] = (texnum == 0) ? 1.0 : 0.0; buf[k+2] = 1.0; } } } static void test (void) { int i, j; GLfloat buf[WINDSIZEX * WINDSIZEY * 3]; GLuint numTextures, textureNames[2]; GLfloat *textureBuf[2]; glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &numTextures); if (numTextures <= 1) exit(0); glClearColor (0.0, 0.0, 0.0, 0.0); glColor3f (1.0, 1.0, 1.0); glClear (GL_COLOR_BUFFER_BIT); glGenTextures(2, textureNames); for (i=0; i<2; i++) { glActiveTextureARB(GL_TEXTURE0_ARB+i); glBindTexture(GL_TEXTURE_2D, textureNames[i]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); textureBuf[i] = (GLfloat *)malloc(8*8*3*sizeof(GLfloat)); Maketexture(8, textureBuf[i], i); glTexImage2D(GL_TEXTURE_2D, 0, 3, 8, 8, 0, GL_RGB, GL_FLOAT, textureBuf[i]); } // enable two texture unit separately with GL_DECAL mode for (i=0; i<2; i++) { glActiveTextureARB(GL_TEXTURE0_ARB+i); glEnable(GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glBegin(GL_POLYGON); glMultiTexCoord2fARB(GL_TEXTURE0_ARB+i, 0.0, 0.0); glVertex2i(0, 0); glMultiTexCoord2fARB(GL_TEXTURE0_ARB+i, 0.0, 1.0); glVertex2i(0, 8); glMultiTexCoord2fARB(GL_TEXTURE0_ARB+i, 1.0, 1.0); glVertex2i(8, 8); glMultiTexCoord2fARB(GL_TEXTURE0_ARB+i, 1.0, 0.0); glVertex2i(8, 0); glEnd(); // glFlush(); glReadPixels (0, 0, WINDSIZEX, WINDSIZEY, GL_RGB, GL_FLOAT, buf); glDisable(GL_TEXTURE_2D); } // enable two texture units together, with GL_MODULATE mode. for (i = 0; i < 2; i++) { glActiveTextureARB(GL_TEXTURE0_ARB+i); glEnable(GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); } glBegin(GL_POLYGON); glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0, 0.0); glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0, 0.0); glVertex2i(0, 0); glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0, 1.0); glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0, 1.0); glVertex2i(0, 8); glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1.0, 1.0); glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0, 1.0); glVertex2i(8, 8); glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1.0, 0.0); glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0, 0.0); glVertex2i(8, 0); glEnd(); glReadPixels (0, 0, WINDSIZEX, WINDSIZEY, GL_RGB, GL_FLOAT, buf); for (j = 0; j < WINDSIZEY; j++) { for (i = 0; i < WINDSIZEY; i++) { if (buf[(j * WINDSIZEX + i) * 3] != 0 || buf[(j * WINDSIZEX + i) * 3 + 1] != 0 || buf[(j * WINDSIZEX + i) * 3 + 2] != 0) { printf ("(%d, %d) = [%f, %f, %f]\n", i, j, buf[(j * WINDSIZEX + i) * 3], buf[(j * WINDSIZEX + i) * 3 + 1], buf[(j * WINDSIZEX + i) * 3 + 2]); } } } } void display (void) { glViewport (0, 0, WINDSIZEX, WINDSIZEY); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluOrtho2D (0, WINDSIZEX, 0, WINDSIZEY); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); test (); } int main (int argc, char **argv) { glutInit (&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGBA); glutInitWindowSize (WINDSIZEX, WINDSIZEY); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc (display); glutMainLoop (); return 0; }