193 lines
5.1 KiB
C
193 lines
5.1 KiB
C
|
/* 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();
|
||
|
}
|