GL_DEPTH_TEST在OpenGL 3.3中不起作用

时间:2014-03-21 14:41:09

标签: c++ opengl depth-testing

我正在使用OpenGL 3.3编写一个简单的渲染程序。

我的代码中有以下行(应该启用深度测试和剔除):

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
ExitOnGLError("ERROR: Could not set OpenGL depth testing options");

glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CCW);
ExitOnGLError("ERROR: Could not set OpenGL culling options");

然而,渲染后我看到以下结果:

flower-bad-depth

正如您所看到的,深度测试似乎不起作用。我究竟做错了什么?我应该在哪里寻找问题?

可能有用的一些信息:

  • 在投影矩阵中,我的近剪裁平面设置为0.2,远至3.2(因此近平面不为零)。
  • 我使用glDrawArrays的简单方法和顶点和纹理坐标的两个缓冲区渲染网格和纹理。用于正确显示这些数组的着色器。
  • 我不计算和绘制法线。
  • 上下文创建代码:http://pastebin.com/mRMUxPL1

更新

终于搞定了!事实证明,我没有为深度渲染创建缓冲区。 当我替换此代码(缓冲区初始化)时:

glGenFramebuffers(1, &mainFrameBufferId);

glGenRenderbuffers(1, &renderBufferId);
glBindRenderbuffer(GL_RENDERBUFFER, renderBufferId);
glRenderbufferStorage(GL_RENDERBUFFER,
                      GL_RGBA8,
                      camera.imageSize.width,
                      camera.imageSize.height);

glBindFramebuffer(GL_FRAMEBUFFER, mainFrameBufferId);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
                          GL_COLOR_ATTACHMENT0,
                          GL_RENDERBUFFER,
                          renderBufferId);
CV_Assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);

这一个:

glGenFramebuffers(1, &mainFrameBufferId);

glGenRenderbuffers(1, &renderBufferId);
glBindRenderbuffer(GL_RENDERBUFFER, renderBufferId);
glRenderbufferStorage(GL_RENDERBUFFER,
                      GL_RGBA8,
                      camera.imageSize.width,
                      camera.imageSize.height);

glBindFramebuffer(GL_FRAMEBUFFER, mainFrameBufferId);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
                          GL_COLOR_ATTACHMENT0,
                          GL_RENDERBUFFER,
                          renderBufferId);
CV_Assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);

glGenRenderbuffers(1, &depthRenderBufferId);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderBufferId);
glRenderbufferStorage(GL_RENDERBUFFER,
                      GL_DEPTH24_STENCIL8,
                      camera.imageSize.width,
                      camera.imageSize.height);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderBufferId);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depthRenderBufferId);
一切都开始好起来了!

1 个答案:

答案 0 :(得分:4)

static int visualAttribs[] = { None };
                               ^^^^
int numberOfFramebufferConfigurations = 0;
GLXFBConfig* fbConfigs = glXChooseFBConfig( display, DefaultScreen(display), visualAttribs, &numberOfFramebufferConfigurations );
CV_Assert(fbConfigs != 0);

glXChooseFBConfig()

  

GLX_DEPTH_SIZE:必须遵循非负最小尺寸规范。如果此值为零,则首选无深度缓冲区的帧缓冲区配置。否则,优选至少最小尺寸的最大可用深度缓冲器。 默认值为0.

尝试将visualAttribs[]设置为{ GLX_DEPTH_SIZE, 16, None }