OpenGL深度缓冲区不工作

Posted

技术标签:

【中文标题】OpenGL深度缓冲区不工作【英文标题】:OpenGL depth buffer isn't working 【发布时间】:2013-01-31 04:02:47 【问题描述】:

我正在尝试使用 openGL 进行简单的绘图。但是,深度缓冲区似乎没有工作。

遇到类似问题的其他人通常会做以下两件事之一:

    不包括 glEnable(GL_DEPTH_TEST)

    错误的裁剪值

但是,我的代码没有这些问题。

...
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

gluPerspective(25.0,1.0,10.0,200.0);

// Set the camera location
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(20.0, 10.0, 50.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

// Enable depth test
glEnable(GL_DEPTH_TEST);

// Cull backfacing polygons
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE)

drawCoordinateAxis();

drawBox(5.0,2.0,5.0,0.8,0.0,0.0);

glTranslated(1.0,-1.0,1.0); //The box is 5x2x5, it is shifted 1 unit down and 1 in the x and z directions
drawBox(5.0,2.0,5.0,0.0,1.0,1.0);
...

当我执行我的代码时,这是绘制的。 http://imgur.com/G9y41O1

注意蓝框和红框相撞,所以红框应该覆盖了蓝框的一部分。

drawCoordinateAxis() 和 drawBox() 函数只是绘制了一些图元,内部没有什么花哨的。

我在 Debian Squeeze 上运行它。

【问题讨论】:

在创建 GL 上下文时是否请求深度缓冲区? 【参考方案1】:
void reshape(GLint width, GLint height)

   g_Width = width;
   g_Height = height;
   glViewport(0, 0, g_Width, g_Height);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(65.0, (float)g_Width / g_Height, g_nearPlane, g_farPlane);
   glMatrixMode(GL_MODELVIEW);

所以先将 Matrix Mode 设置为 GL_PROJECTION,然后是 gluPerspective....,然后再回到 MODELVIEW 模式。

【讨论】:

这段代码最好放在显示函数中。只要您需要 HUD 或其他类型的指示器,您就必须在渲染过程中调整视口和投影。重塑处理程序应保留给在调整窗口大小时发生的代价高昂的操作,例如重新处理后处理 FBO 附件。

以上是关于OpenGL深度缓冲区不工作的主要内容,如果未能解决你的问题,请参考以下文章

在仅触及深度缓冲区的openGL中进行绘图调用

OpenGL 中的反射和深度

OpenGL 帧缓冲区缺失面

OpenGL中的乱序Z缓冲区

3.OpenGL渲染技巧

Opengl渲染到深度纹理 - 红色?