c++ - 为什么 glCheckFramebufferStatus 对于 OpenGL ES 3.1+ 上的 GL_DEPTH_COMPONENT 总是 36054?

标签 c++ qt opengl-es

我将场景的颜色 (GL_COLOR_ATTACHMENT0) 和深度 (GL_DEPTH_ATTACHMENT) 渲染到 FBO 中,这在 PC 上运行良好 < strong>OpenGL 4+。

但是在装有 OpenGL ES 3.1+ 的智能手机上,我总是通过 glCheckFramebufferStatus(GL_FRAMEBUFFER) status = 36054 获取深度。

glGenTextures(1, &m_textCol);
glBindTexture(GL_TEXTURE_2D, m_textCol);
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, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, wth, hgt, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_2D, 0);

glGenTextures(1, &m_textDepth);
glBindTexture(GL_TEXTURE_2D, m_textDepth);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, wth, hgt, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
glBindTexture(GL_TEXTURE_2D, 0);

GLuint framebuffer;
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_textCol, 0);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); always 36053 -> ok

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_textDepth, 0);
status = glCheckFramebufferStatus(GL_FRAMEBUFFER); // always 36054 -> not ok

我也试过

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, wth, hgt, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);

但没有变化。

也许有人知道我做错了什么?谢谢。

最佳答案

状态 36054 是 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

如果我们查看 OpenGL ES3.1 规范的第 9.4 节,它列出了深度附件的以下有效 internalFormat 值:

  • DEPTH_COMPONENT16
  • DEPTH_COMPONENT24
  • DEPTH_COMPONENT32F
  • DEPTH24_STENCIL8
  • DEPTH32F_STENCIL8

请注意,最后两个还包含模板部分。您可以将这些用于深度组件,如果不需要,则忽略模板附件。特别是 DEPTH24_STENCIL8 很有可能得到广泛支持。

关于c++ - 为什么 glCheckFramebufferStatus 对于 OpenGL ES 3.1+ 上的 GL_DEPTH_COMPONENT 总是 36054?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58883217/

相关文章:

c++ - QT C++ - 如何在播放列表处于事件状态时打开 Windows Media Player?

android - 你如何用opengl es显示fps(android)

ios - 带有旋转表面的 OpenGL ES 2.0 工件

python - PyQt:减少计算模块 GUI 的样板

ios - 根据触摸速度绘制

c++ - 返回类型中 && 和 no ref 的区别

c++ - 我如何为 cc_library 添加默认的 copts,如 '-fopenmp'?

c++ - 为什么这里不考虑 std::begin/end?

c++ - 为什么 QTabBar 的 tabBarDoubleClicked(int) 不能处理双击标签栏?

c++ - 使用 Qt 静态构建库时出现链接错误