我有提示:
glfwWindowHint(GLFW_DEPTH_BITS, GL_TRUE);
然后我有:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
画画时我有
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
但结果显然没有使用深度缓冲区...
我觉得
glfwWindowHint(GLFW_DEPTH_BITS, GL_TRUE);
可能不正确?
我正在使用 GLFW 3、OpenGL 4.1、macOS El Capitan 10.11.6
根据GLFW指南[1],
GLFW_DEPTH_BITS
不能用于启用或禁用深度测试,而是用于设置深度缓冲区的大小(以位为单位)。
glfwWindowHint(GLFW_DEPTH_BITS, GL_TRUE);
的作用是将深度缓冲区大小设置为1位,因为GL_TRUE
被定义为1
。 OpenGL 实现可能甚至不支持 1 位的深度缓冲区大小,您可以使用 glGetError
[2] 进行检查。
在 Windows 上,您通常根本不必设置深度缓冲区格式,它只需与 GLFW 一起开箱即可使用。不过,我记得在 iOS 上配置帧缓冲区是必要的。因此,只需删除行
glfwWindowHint(GLFW_DEPTH_BITS, GL_TRUE);
看看会发生什么。
[1] http://www.glfw.org/docs/latest/window_guide.html
[2] https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glGetError.xml
如果帧缓冲区是用户定义的,请确保附加了深度缓冲区,否则将禁用深度测试,如此处所述。
如果当前帧缓冲区没有深度缓冲区,则深度测试的行为就好像它始终被禁用一样。
示例:
context_.TexImage2D(GL_TEXTURE_2D, 0, channelType, width_, height_, 0, channelConf,
(ctype == ChannelType::FLOAT) ? GL_FLOAT : GL_UNSIGNED_BYTE, nullptr);
// Attach the texture to the framebuffer
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_, 0);
glGenRenderbuffers(1, &depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);