#include #include #include #include #define WINDSIZEX 100 #define WINDSIZEY 100 int useUnpackBuffer = 1; void init (void) { int i; GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat black[] = { 0.0, 0.0, 0.0, 1.0 }; GLfloat red[] = { 1.0, 0.0, 0.0, 1.0 }; GLfloat green[] = { 0.0, 1.0, 0.0, 1.0 }; GLfloat blue[] = { 0.0, 0.0, 1.0, 1.0 }; glClearColor (0.0, 0.0, 0.0, 1.0); glColor4fv (white); gluOrtho2D (0, WINDSIZEX, 0, WINDSIZEY); glDisable (GL_DITHER); } #define TEXSIZE 8 static void test (void) { int i, j; GLuint pb_unpack[1]; GLubyte bitmap[TEXSIZE * TEXSIZE / 8]; GLfloat buf[WINDSIZEX * WINDSIZEY * 3]; GLubyte * pboUnpackMem = NULL; glClearColor (0.0, 0.0, 0.0, 0.0); glColor3f (1.0, 1.0, 1.0); if (useUnpackBuffer) { glGenBuffersARB(1, pb_unpack); glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT, pb_unpack[0]); glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_EXT, TEXSIZE * TEXSIZE, NULL, GL_STREAM_DRAW); pboUnpackMem = (GLubyte *) glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT, GL_WRITE_ONLY); } else { pboUnpackMem = bitmap; } for (i = 0; i < TEXSIZE * TEXSIZE / 8; i++) { pboUnpackMem[i] = 0xAA; } glClear (GL_COLOR_BUFFER_BIT); glRasterPos2f (0.0, 0.0); glPixelStorei (GL_UNPACK_ALIGNMENT, 1); if (useUnpackBuffer) { glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT); glBitmap(TEXSIZE, TEXSIZE, 0, 0, 0, 0, NULL); glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_EXT, 0); } else glBitmap(TEXSIZE, TEXSIZE, 0, 0, 0, 0, pboUnpackMem); 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) { if (argc > 1) useUnpackBuffer = 0; glutInit (&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (WINDSIZEX, WINDSIZEY); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc (display); glutMainLoop (); return 0; }