gpt4 book ai didi

c++ - GL_DEPTH_TEST 在 OpenGL 3.3 中不起作用

转载 作者:太空狗 更新时间:2023-10-29 21:00:13 25 4
gpt4 key购买 nike

我正在使用 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);

一切开始正常工作!

最佳答案

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

glXChooseFBConfig() :

GLX_DEPTH_SIZE: Must be followed by a nonnegative minimum size specification. If this value is zero, frame buffer configurations with no depth buffer are preferred. Otherwise, the largest available depth buffer of at least the minimum size is preferred. The default value is 0.

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

关于c++ - GL_DEPTH_TEST 在 OpenGL 3.3 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22561832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com