确保你有一个深度缓冲区:
#include <GL/glew.h>
#include <GL/glut.h>
GLuint pbo = 0;
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glEnable( GL_DEPTH_TEST );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -2, 2, -2, 2, -1, 1 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glColor3ub( 255, 0, 0 );
glBegin( GL_QUADS );
glVertex3i( -1, -1, 0 );
glVertex3i( 1, -1, 0 );
glVertex3i( 1, 1, 0 );
glVertex3i( -1, 1, 0 );
glEnd();
int w = glutGet( GLUT_WINDOW_WIDTH );
int h = glutGet( GLUT_WINDOW_HEIGHT );
glBindBuffer( GL_PIXEL_PACK_BUFFER, pbo );
glBufferData( GL_PIXEL_PACK_BUFFER, w * h * sizeof( GLfloat ), 0, GL_STREAM_READ );
glReadPixels( 0, 0, w, h, GL_DEPTH_COMPONENT, GL_FLOAT, 0 );
GLfloat* ptr = (GLfloat*)glMapBuffer( GL_PIXEL_PACK_BUFFER, GL_READ_ONLY );
if( ptr )
{
// look for values of ~0.5 here in ptr...
}
glUnmapBuffer( GL_PIXEL_PACK_BUFFER );
glBindBuffer( GL_PIXEL_PACK_BUFFER, 0 );
glutSwapBuffers();
}
int main( int argc, char **argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE );
glutInitWindowSize( 128, 128 );
glutCreateWindow( "GLUT" );
glewInit();
glGenBuffers( 1, &pbo );
glutDisplayFunc( display );
glutMainLoop();
return 0;
}