在OpenGL 3.3中,GL_DEPTH_TEST无法正常工作。

3
我正在使用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
你在创建上下文时是否向操作系统请求了深度缓冲区?请发布你的上下文创建代码。 - genpfault
也许不是这样的...我对OpenGL很新,所以可能做错了一些事情。在问题中添加了上下文创建代码。 - Aleksei Petrenko
1
另外,您是否将深度缓冲区清除到适当的值? - user1118321
把那段代码编辑到问题中。Pastebin会消失,而Stack Overflow永存。 - genpfault
1个回答

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 } 这样的东西。


你的回答帮助我找到了问题,所以我会接受它。谢谢! - Aleksei Petrenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接