#include #include #include #include #define WINDSIZEX 100 #define WINDSIZEY 100 static GLfloat grayColor[4] = { 0.5f, 0.5f, 0.5f, 1.0f }; static GLfloat envColors[][4] = { {0.8f, 0.7f, 0.8f, 0.10f}, {0.3f, 0.7f, 0.8f, 0.25f}, {0.1f, 0.0f, 0.9f, 0.35f}, {0.3f, 0.4f, 0.0f, 0.55f}, }; static GLuint texture; static GLint numTextureUnits = 2, maxNumTextUnits; static void DrawPoly(void) { int i; glBegin(GL_QUADS); for (i = 0; i < numTextureUnits; i++) { glMultiTexCoord2fARB(GL_TEXTURE0_ARB + i, 0, 0); } glVertex2f(0, 0); for (i = 0; i < numTextureUnits; i++) { glMultiTexCoord2fARB(GL_TEXTURE0_ARB + i, 0, 1); } glVertex2f(0, 1.0); for (i = 0; i < numTextureUnits; i++) { glMultiTexCoord2fARB(GL_TEXTURE0_ARB + i, 1, 1); } glVertex2f(1.0, 1.0); for (i = 0; i < numTextureUnits; i++) { glMultiTexCoord2fARB(GL_TEXTURE0_ARB + i, 1, 0); } glVertex2f(1.0, 0); glEnd(); } static void CreateTexture() { glBindTexture (GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_INTENSITY, 1, 1, 0, GL_RGBA, GL_FLOAT, grayColor); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glBindTexture (GL_TEXTURE_2D, 0); } void test() { GLfloat buf[4]; GLint unitNum, j; for(unitNum = 0; unitNum < numTextureUnits; unitNum++){ glActiveTextureARB (GL_TEXTURE0_ARB + unitNum); glBindTexture(GL_TEXTURE_2D, texture); glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, envColors[unitNum % 4]); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); } for(unitNum = 0; unitNum < numTextureUnits; unitNum++){ glActiveTextureARB (GL_TEXTURE0_ARB + unitNum); glEnable(GL_TEXTURE_2D); } glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_BLEND); DrawPoly(); glReadPixels(0, 0, 1, 1, GL_RGBA, GL_FLOAT, buf); //printf("pixel: %f %f %f\n", buf[0], buf[1], buf[2]); glDisable(GL_BLEND); DrawPoly(); glReadPixels(0, 0, 1, 1, GL_RGB, GL_FLOAT, buf); printf("pixel: %f %f %f\n", buf[0], buf[1], buf[2]); } void init(void) { glGetIntegerv (GL_MAX_TEXTURE_UNITS_ARB, &maxNumTextUnits); printf("num texture units: %d\n", maxNumTextUnits); glDisable(GL_DITHER); glClearColor(1.0, 1.0, 1.0, 1.0); glBlendFunc (GL_ZERO, GL_SRC_ALPHA); glShadeModel (GL_FLAT); glGenTextures(1, &texture); CreateTexture(); glColor4f (0.6, 0.6, 0.6, 0.0); } 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_RGB); glutInitWindowSize(WINDSIZEX, WINDSIZEY); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutMainLoop(); return 0; }