为什么在 OpenGL ES 3.1+ 上 GL_DEPTH_COMPONENT 的 glCheckFramebufferStatus 总是 36054?

Why is glCheckFramebufferStatus always 36054 for GL_DEPTH_COMPONENT on OpenGL ES 3.1+?

我将我的场景的颜色 (GL_COLOR_ATTACHMENT0) 和深度 (GL_DEPTH_ATTACHMENT) 渲染到 FBO,它在 PC 上使用 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很有可能得到广泛的支持。