static void Draw(void) { char str[1000]; int width = Widths[WidthIndex]; int height = Heights[HeightIndex]; int y = MAX_HEIGHT - 50; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glWindowPos2iARB(10, y); sprintf(str, "ReadPixels size: %d x %d", width, height); PrintString(str); y -= 14; glWindowPos2iARB(10, y); PrintString("Press up/down/left/right to change image size."); y -= 14; glWindowPos2iARB(10, y); PrintString("Press 'b' to run benchmark test."); y -= 14; if (Benchmark) { glWindowPos2iARB(10, y); PrintString("Testing..."); } glutSwapBuffers(); if (Benchmark) { GLuint i, pbo; #if DRAW printf("Draw size: Width=%d Height=%d\n", width, height); #else printf("Read size: Width=%d Height=%d\n", width, height); #endif for (pbo = 0; pbo <= HavePBO; pbo++) { printf("Pixel Buffer Object: %d\n", pbo); if (pbo == 0) { glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, 0); } for (i = 0; i < NUM_FORMATS; i++) { MeasureFormat(Formats + i, width, height, pbo); } } Benchmark = GL_FALSE; /* redraw window text */ glutPostRedisplay(); } }
static void Display( void ) { const int dx = (WinWidth - ImgWidth) / 2; const int dy = (WinHeight - ImgHeight) / 2; if (DrawFront) { glDrawBuffer(GL_FRONT); glReadBuffer(GL_FRONT); } else { glDrawBuffer(GL_BACK); glReadBuffer(GL_BACK); } glClear( GL_COLOR_BUFFER_BIT ); /* draw original image */ glWindowPos2iARB(dx, dy); glDrawPixels(ImgWidth, ImgHeight, ImgFormat, GL_UNSIGNED_BYTE, Image); if (Scissor) glEnable(GL_SCISSOR_TEST); if (Invert) { glPixelTransferf(GL_RED_SCALE, -1.0); glPixelTransferf(GL_GREEN_SCALE, -1.0); glPixelTransferf(GL_BLUE_SCALE, -1.0); glPixelTransferf(GL_RED_BIAS, 1.0); glPixelTransferf(GL_GREEN_BIAS, 1.0); glPixelTransferf(GL_BLUE_BIAS, 1.0); } /* draw copy */ glPixelZoom(Xzoom, Yzoom); glWindowPos2iARB(Xpos, Ypos); glCopyPixels(dx, dy, ImgWidth, ImgHeight, GL_COLOR); glPixelZoom(1, 1); glDisable(GL_SCISSOR_TEST); if (Invert) { glPixelTransferf(GL_RED_SCALE, 1.0); glPixelTransferf(GL_GREEN_SCALE, 1.0); glPixelTransferf(GL_BLUE_SCALE, 1.0); glPixelTransferf(GL_RED_BIAS, 0.0); glPixelTransferf(GL_GREEN_BIAS, 0.0); glPixelTransferf(GL_BLUE_BIAS, 0.0); } if (DrawFront) glFinish(); else glutSwapBuffers(); }
static void Redisplay(void) { CheckError(__LINE__); glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); CheckError(__LINE__); glUseProgram(program); CheckError(__LINE__); glBegin(GL_POLYGON); #if USE_RECT /* scale coords by two to test projection */ glTexCoord4f( 0, 0, 0, 2.0); glVertex2f(-1, -1); glTexCoord4f(2*TEXSIZE, 0, 2*1, 2.0); glVertex2f( 1, -1); glTexCoord4f(2*TEXSIZE, 2*TEXSIZE, 2*1, 2.0); glVertex2f( 1, 1); glTexCoord4f( 0, 2*TEXSIZE, 0, 2.0); glVertex2f(-1, 1); #else glTexCoord3f(0, 0, 0); glVertex2f(-1, -1); glTexCoord3f(1, 0, 1); glVertex2f( 1, -1); glTexCoord3f(1, 1, 1); glVertex2f( 1, 1); glTexCoord3f(0, 1, 0); glVertex2f(-1, 1); #endif glEnd(); glPopMatrix(); glUseProgram(0); glWindowPos2iARB(80, 20); PrintString("white black white black"); glutSwapBuffers(); }
static void PrintInfo(void) { char s[100]; glDisable(GL_FOG); glColor3f(0, 1, 1); sprintf(s, "Mode(m): %s Start(s/S): %g End(e/E): %g Density(d/D): %g", ModeStr, fogStart, fogEnd, fogDensity); glWindowPos2iARB(5, 20); PrintString(s); sprintf(s, "Arrays(a): %s glFogCoord(c): %s EyeZ(z/z): %g", (Arrays ? "Yes" : "No"), (fogCoord ? "Yes" : "No"), camz); glWindowPos2iARB(5, 5); PrintString(s); }
static void MeasureFormat(struct format_type *fmt, GLint width, GLint height, GLuint pbo) { double t0 = glutGet(GLUT_ELAPSED_TIME) * 0.001; double t1; int j; for (j = 0; ; j++) { glBegin(GL_POINTS); glVertex2f(1,1); glEnd(); #if DRAW glWindowPos2iARB(0,0); glDrawPixels(width, height, fmt->Format, fmt->Type, Buffer); glFinish(); #else if (pbo) { glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, PBObjects[j % NUM_PBO]); glReadPixels(0, 0, width, height, fmt->Format, fmt->Type, 0); } else { glReadPixels(0, 0, width, height, fmt->Format, fmt->Type, Buffer); } #endif t1 = glutGet(GLUT_ELAPSED_TIME) * 0.001; if (t1 - t0 > 2.0) { GLdouble rate = width * height / (1024.0 * 1024.0) * j / (t1 - t0); #if DRAW printf("%-32s %.2f draws/sec %.2f MPixels/sec %.2f MBytes/sec\n", fmt->Name, j / (t1-t0), rate, rate * fmt->Bytes); #else printf("%-32s %.2f reads/sec %.2f MPixels/sec %.2f MBytes/sec\n", fmt->Name, j / (t1-t0), rate, rate * fmt->Bytes); #endif break; } if (j == 0) { /* check for error */ GLenum err = glGetError(); if (err) { printf("GL Error 0x%x for %s\n", err, fmt->Name); return; } } } }
static GLboolean test_drawpixels_formats(void) { GLubyte *image; GLfloat result[4], expected[4]; GLfloat error = 2.0 / 255.0; /* XXX fix */ image = (GLubyte *) malloc(TexWidth * TexHeight * 2 * sizeof(GLubyte)); fill_texture_image(TexWidth, TexHeight, 2, image); glWindowPos2iARB(0, 0); glDrawPixels(TexWidth, TexHeight, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, image); if (check_error(__FILE__, __LINE__)) { fprintf(stderr, "%s: Error in glDrawPixels(format = GL_LA)\n", TestName); return GL_FALSE; } /* test center pixel */ result[0] = result[1] = result[2] = 0.0; result[3] = 1.0; glReadPixels(TexWidth/2, TexHeight/2, 1, 1, GL_LUMINANCE_ALPHA, GL_FLOAT, result); expected[0] = 1.0; expected[1] = 0.5; expected[2] = 0.0; expected[3] = 1.0; if (fabsf(result[0] - expected[0]) > error || fabsf(result[1] - expected[1]) > error || fabsf(result[2] - expected[2]) > error || fabsf(result[3] - expected[3]) > error) { fprintf(stderr, "%s: glDrawPixels failure with format GL_LA:\n", TestName); fprintf(stderr, " expected color = %g, %g, %g, %g\n", expected[0], expected[1], expected[2], expected[3]); fprintf(stderr, " result color = %g, %g, %g, %g\n", result[0], result[1], result[2], result[3]); return GL_FALSE; } free(image); return GL_TRUE; }
static void Display( void ) { GLubyte *buffer = malloc(Width * Height * 4); GLenum status; CheckError(__LINE__); /* draw to user framebuffer */ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB); glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { printf("fbotest3: Error: Framebuffer is incomplete!!!\n"); } CheckError(__LINE__); glClearColor(0.5, 0.5, 1.0, 0.0); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glPushMatrix(); glRotatef(30.0, 1, 0, 0); glRotatef(Rotation, 0, 1, 0); glutSolidTeapot(2.0); glPopMatrix(); /* read from user framebuffer */ glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); /* draw to window */ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glDisable(GL_DEPTH_TEST); /* in case window has depth buffer */ glWindowPos2iARB(0, 0); glDrawPixels(Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); free(buffer); glutSwapBuffers(); CheckError(__LINE__); }
static void Display( void ) { GLubyte *buffer = malloc(Width * Height * 4); GLenum status; /* draw to user framebuffer */ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB); glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { printf("Framebuffer incomplete!!!\n"); } glClearColor(0.5, 0.5, 1.0, 0.0); glClear( GL_COLOR_BUFFER_BIT ); glBegin(GL_POLYGON); glColor3f(1, 0, 0); glVertex2f(-1, -1); glColor3f(0, 1, 0); glVertex2f(1, -1); glColor3f(0, 0, 1); glVertex2f(0, 1); glEnd(); /* read from user framebuffer */ glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); /* draw to window */ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glWindowPos2iARB(0, 0); glDrawPixels(Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); free(buffer); glutSwapBuffers(); CheckError(__LINE__); }
static void Display(void) { GLubyte *buffer = malloc(Width * Height * 4); static const GLenum buffers[2] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT }; glUseProgram(Program); glEnable(GL_DEPTH_TEST); /* draw to user framebuffer */ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBobject); /* Clear color buffer 0 (blue) */ glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); glClear(GL_COLOR_BUFFER_BIT); /* Clear color buffer 1 (1 - blue) */ glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT); glClear(GL_COLOR_BUFFER_BIT); glClear(GL_DEPTH_BUFFER_BIT); /* draw to two buffers w/ fragment shader */ glDrawBuffersARB(2, buffers); /* different color masks for each buffer */ if (1) { glColorMaskIndexedEXT(0, GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE); glColorMaskIndexedEXT(1, GL_FALSE, GL_TRUE, GL_FALSE, GL_FALSE); } glPushMatrix(); glRotatef(Xrot, 1, 0, 0); glRotatef(Yrot, 0, 1, 0); glPushMatrix(); glTranslatef(1, 0, 0); glutSolidTorus(1.0, 2.0, 10, 20); glPopMatrix(); glPushMatrix(); glTranslatef(-1, 0, 0); glRotatef(90, 1, 0, 0); glutSolidTorus(1.0, 2.0, 10, 20); glPopMatrix(); glPopMatrix(); /* restore default color masks */ glColorMaskIndexedEXT(0, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glColorMaskIndexedEXT(1, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); /* read from user framebuffer */ /* left half = colorbuffer 0 */ glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); glPixelStorei(GL_PACK_ROW_LENGTH, Width); glPixelStorei(GL_PACK_SKIP_PIXELS, 0); glReadPixels(0, 0, Width / 2, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); /* right half = colorbuffer 1 */ glReadBuffer(GL_COLOR_ATTACHMENT1_EXT); glPixelStorei(GL_PACK_SKIP_PIXELS, Width / 2); glReadPixels(Width / 2, 0, Width - Width / 2, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); /* draw to window */ glUseProgram(0); glDisable(GL_DEPTH_TEST); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glWindowPos2iARB(0, 0); glDrawPixels(Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); free(buffer); glutSwapBuffers(); CheckError(__LINE__); }
/** * Grab the z/stencil/back/front image from the srcWin and display it * (possibly converted to grayscale) in the dstWin. */ static void redraw(Display *dpy, Window srcWin, Window dstWin ) { GLubyte *image = malloc(Width * Height * 4); glXMakeCurrent(dpy, srcWin, Context); glPixelStorei(GL_PACK_ALIGNMENT, 1); if (Buffer == BACK_BUFFER) { glReadBuffer(GL_BACK); glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, image); } else if (Buffer == FRONT_BUFFER) { glReadBuffer(GL_FRONT); glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, image); } else if (Buffer == Z_BUFFER) { GLfloat *z = malloc(Width * Height * sizeof(GLfloat)); int i; glReadPixels(0, 0, Width, Height, GL_DEPTH_COMPONENT, GL_FLOAT, z); for (i = 0; i < Width * Height; i++) { image[i*4+0] = image[i*4+1] = image[i*4+2] = (GLint) (255.0 * z[i]); image[i*4+3] = 255; } free(z); } else if (Buffer == STENCIL_BUFFER) { GLubyte *sten = malloc(Width * Height * sizeof(GLubyte)); int i, min = 100, max = -1; float step; int sz; glGetIntegerv(GL_STENCIL_BITS, &sz); glReadPixels(0, 0, Width, Height, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, sten); /* find min/max for converting stencil to grayscale */ for (i = 0; i < Width * Height; i++) { if (sten[i] < min) min = sten[i]; if (sten[i] > max) max = sten[i]; } if (min == max) step = 0; else step = 255.0 / (float) (max - min); for (i = 0; i < Width * Height; i++) { image[i*4+0] = image[i*4+1] = image[i*4+2] = (GLint) ((sten[i] - min) * step); image[i*4+3] = 255; } free(sten); } glXMakeCurrent(dpy, dstWin, Context); glWindowPos2iARB(0, 0); glDrawBuffer(GL_FRONT); glDrawPixels(Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, image); glFlush(); free(image); }
static void Draw( void ) { /* draw to user framebuffer */ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB); glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT); glReadBuffer(GL_COLOR_ATTACHMENT1_EXT); glViewport(0, 0, Width, Height); CheckError(); glClearColor(0.5, 0.5, 1.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); CheckError(); if (0) { glBegin(GL_TRIANGLES); glColor3f(0,0,.7); glVertex3f( 0.9, -0.9, -30.0); glColor3f(.8,0,0); glVertex3f( 0.9, 0.9, -30.0); glColor3f(0,.9,0); glVertex3f(-0.9, 0.0, -30.0); glEnd(); } { GLubyte *buffer = malloc(Width * Height * 4); /* read from user framebuffer */ glReadPixels(0, 0, Width-60, Height-60, GL_RGBA, GL_UNSIGNED_BYTE, buffer); CheckError(); /* draw to window */ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glViewport(0, 0, Width, Height); /* Try to clear the window, but will overwrite: */ glClearColor(0.8, 0.8, 0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glWindowPos2iARB(30, 30); glDrawPixels(Width-60, Height-60, GL_RGBA, GL_UNSIGNED_BYTE, buffer); free(buffer); } /* Bind normal framebuffer */ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glViewport(0, 0, Width, Height); if (0) { glBegin(GL_TRIANGLES); glColor3f(0,.7,0); glVertex3f( 0.5, -0.5, -30.0); glColor3f(0,0,.8); glVertex3f( 0.5, 0.5, -30.0); glColor3f(.9,0,0); glVertex3f(-0.5, 0.0, -30.0); glEnd(); } if (doubleBuffer) glutSwapBuffers(); else glFinish(); CheckError(); }