| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 | 
							- /* showbuffer.c */
 - 
 - 
 - /*
 -  * Copy the depth buffer to the color buffer as a grayscale image.
 -  * Useful for inspecting the depth buffer values.
 -  *
 -  * This program is in the public domain.
 -  *
 -  * Brian Paul   November 4, 1998
 -  */
 - 
 - 
 - #include <assert.h>
 - #include <stdlib.h>
 - #include <GL/gl.h>
 - #include "showbuffer.h"
 - 
 - 
 - 
 - /*
 -  * Copy the depth buffer values into the current color buffer as a
 -  * grayscale image.
 -  * Input:  winWidth, winHeight - size of the window
 -  *         zBlack - the Z value which should map to black (usually 1)
 -  *         zWhite - the Z value which should map to white (usually 0)
 -  */
 - void
 - ShowDepthBuffer( GLsizei winWidth, GLsizei winHeight,
 -                  GLfloat zBlack, GLfloat zWhite )
 - {
 -    GLfloat *depthValues;
 - 
 -    assert(zBlack >= 0.0);
 -    assert(zBlack <= 1.0);
 -    assert(zWhite >= 0.0);
 -    assert(zWhite <= 1.0);
 -    assert(zBlack != zWhite);
 - 
 -    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 -    glPixelStorei(GL_PACK_ALIGNMENT, 1);
 - 
 -    /* Read depth values */
 -    depthValues = (GLfloat *) malloc(winWidth * winHeight * sizeof(GLfloat));
 -    assert(depthValues);
 -    glReadPixels(0, 0, winWidth, winHeight, GL_DEPTH_COMPONENT,
 -                 GL_FLOAT, depthValues);
 - 
 -    /* Map Z values from [zBlack, zWhite] to gray levels in [0, 1] */
 -    /* Not using glPixelTransfer() because it's broke on some systems! */
 -    if (zBlack != 0.0 || zWhite != 1.0) {
 -       GLfloat scale = 1.0 / (zWhite - zBlack);
 -       GLfloat bias = -zBlack * scale;
 -       int n = winWidth * winHeight;
 -       int i;
 -       for (i = 0; i < n; i++)
 -          depthValues[i] = depthValues[i] * scale + bias;
 -    }
 - 
 -    /* save GL state */
 -    glPushAttrib(GL_CURRENT_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT |
 -                 GL_TRANSFORM_BIT | GL_VIEWPORT_BIT);
 - 
 -    /* setup raster pos for glDrawPixels */
 -    glMatrixMode(GL_PROJECTION);
 -    glPushMatrix();
 -    glLoadIdentity();
 - 
 -    glOrtho(0.0, (GLdouble) winWidth, 0.0, (GLdouble) winHeight, -1.0, 1.0);
 -    glMatrixMode(GL_MODELVIEW);
 -    glPushMatrix();
 -    glLoadIdentity();
 - 
 -    glDisable(GL_STENCIL_TEST);
 -    glDisable(GL_DEPTH_TEST);
 -    glRasterPos2f(0, 0);
 - 
 -    glDrawPixels(winWidth, winHeight, GL_LUMINANCE, GL_FLOAT, depthValues);
 - 
 -    glPopMatrix();
 -    glMatrixMode(GL_PROJECTION);
 -    glPopMatrix();
 -    free(depthValues);
 - 
 -    glPopAttrib();
 - }
 - 
 - 
 - 
 - 
 - /*
 -  * Copy the alpha channel values into the current color buffer as a
 -  * grayscale image.
 -  * Input:  winWidth, winHeight - size of the window
 -  */
 - void
 - ShowAlphaBuffer( GLsizei winWidth, GLsizei winHeight )
 - {
 -    GLubyte *alphaValues;
 - 
 -    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 -    glPixelStorei(GL_PACK_ALIGNMENT, 1);
 - 
 -    /* Read alpha values */
 -    alphaValues = (GLubyte *) malloc(winWidth * winHeight * sizeof(GLubyte));
 -    assert(alphaValues);
 -    glReadPixels(0, 0, winWidth, winHeight, GL_ALPHA, GL_UNSIGNED_BYTE, alphaValues);
 - 
 -    /* save GL state */
 -    glPushAttrib(GL_CURRENT_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL |
 -                 GL_TRANSFORM_BIT | GL_VIEWPORT_BIT);
 - 
 -    /* setup raster pos for glDrawPixels */
 -    glMatrixMode(GL_PROJECTION);
 -    glPushMatrix();
 -    glLoadIdentity();
 - 
 -    glOrtho(0.0, (GLdouble) winWidth, 0.0, (GLdouble) winHeight, -1.0, 1.0);
 -    glMatrixMode(GL_MODELVIEW);
 -    glPushMatrix();
 -    glLoadIdentity();
 - 
 -    glDisable(GL_STENCIL_TEST);
 -    glDisable(GL_DEPTH_TEST);
 -    glRasterPos2f(0, 0);
 - 
 -    glDrawPixels(winWidth, winHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, alphaValues);
 - 
 -    glPopMatrix();
 -    glMatrixMode(GL_PROJECTION);
 -    glPopMatrix();
 -    free(alphaValues);
 - 
 -    glPopAttrib();
 - }
 - 
 - 
 - 
 - /*
 -  * Copy the stencil buffer values into the current color buffer as a
 -  * grayscale image.
 -  * Input:  winWidth, winHeight - size of the window
 -  *         scale, bias - scale and bias to apply to stencil values for display
 -  */
 - void
 - ShowStencilBuffer( GLsizei winWidth, GLsizei winHeight,
 -                    GLfloat scale, GLfloat bias )
 - {
 -    GLubyte *stencilValues;
 - 
 -    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 -    glPixelStorei(GL_PACK_ALIGNMENT, 1);
 - 
 -    /* Read stencil values */
 -    stencilValues = (GLubyte *) malloc(winWidth * winHeight * sizeof(GLubyte));
 -    assert(stencilValues);
 -    glReadPixels(0, 0, winWidth, winHeight, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, stencilValues);
 - 
 -    /* save GL state */
 -    glPushAttrib(GL_CURRENT_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT |
 -                 GL_PIXEL_MODE_BIT | GL_TRANSFORM_BIT | GL_VIEWPORT_BIT);
 - 
 -    /* setup raster pos for glDrawPixels */
 -    glMatrixMode(GL_PROJECTION);
 -    glPushMatrix();
 -    glLoadIdentity();
 - 
 -    glOrtho(0.0, (GLdouble) winWidth, 0.0, (GLdouble) winHeight, -1.0, 1.0);
 -    glMatrixMode(GL_MODELVIEW);
 -    glPushMatrix();
 -    glLoadIdentity();
 - 
 -    glDisable(GL_STENCIL_TEST);
 -    glDisable(GL_DEPTH_TEST);
 -    glRasterPos2f(0, 0);
 - 
 -    glPixelTransferf(GL_RED_SCALE, scale);
 -    glPixelTransferf(GL_RED_BIAS, bias);
 -    glPixelTransferf(GL_GREEN_SCALE, scale);
 -    glPixelTransferf(GL_GREEN_BIAS, bias);
 -    glPixelTransferf(GL_BLUE_SCALE, scale);
 -    glPixelTransferf(GL_BLUE_BIAS, bias);
 - 
 -    glDrawPixels(winWidth, winHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, stencilValues);
 - 
 -    glPopMatrix();
 -    glMatrixMode(GL_PROJECTION);
 -    glPopMatrix();
 -    free(stencilValues);
 - 
 -    glPopAttrib();
 - }
 
 
  |