我在读取屏幕外帧缓冲区渲染通道的深度缓冲区时遇到问题。使用 OpenGL 4.5 时,它按预期工作,但在 OpenGL ES 2.0(角度)上,我的glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, depthBuffer)
通话出错。错误是 0x502,这是一个 GL_INVALID_OPERATION 错误代码。
一些更多的背景。我在一个 Qt 环境中工作,它有一个主要的渲染例程,现在我正在做一些离屏渲染。通常我们使用 opengl 桌面实现,但是在某些机器上,我们遇到了一些糟糕的 opengl 版本的问题。因此,我目前正在努力使整个设置更加健壮。我做的一件事是改用角度。所以我只是想让角度工作,这应该对应于使用 OpenGL ES 2.0。
那么这里的帧缓冲区创建:
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glGenRenderbuffers(1, &cboId);
glBindRenderbuffer(GL_RENDERBUFFER, cboId);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, cboId);
glGenRenderbuffers(1, &dboId);
glBindRenderbuffer(GL_RENDERBUFFER, dboId);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, dboId);
帧缓冲区是完整的并且没有抛出错误。上一段和下一段之间的代码也不会引发任何错误。
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, colorData);
//No error up to this point
glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, depthData));
//This call throws 0x502 (GL_INVALID_OPERATION)
通常我使用GL_DEPTH_COMPONENT24
,由于某种原因它不起作用。所以我GL_DEPTH_COMPONENT16
改用了。也许这暗示了什么是错的。仅供参考,主帧缓冲区使用 24 位深度和 8 位模板。(我也尝试使用该GL_DEPTH24_STENCIL8
格式,但 glReadPixels 调用没有成功)。
使用纹理代替或 pbuffer 不起作用,因为此解决方法 ( glGetTexImage(...)
, glMapBuffer(...)
) 所需的功能未在我坚持使用的 GL 版本中实现。