深度缓冲区不适用于 GLFW

问题描述 投票:0回答:2

我有提示:

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

opengl glfw
2个回答
1
投票

根据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


0
投票

如果帧缓冲区是用户定义的,请确保附加了深度缓冲区,否则将禁用深度测试,如此处所述。

如果当前帧缓冲区没有深度缓冲区,则深度测试的行为就好像它始终被禁用一样。

示例:

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);
© www.soinside.com 2019 - 2024. All rights reserved.