我在读取屏幕外帧缓冲区呈现传递的深度缓冲区时遇到了问题。当使用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
代替。也许这是个暗示是怎么回事。FYI主要帧缓冲区使用24位深度和8位模板。(我也尝试使用GL_DEPTH24_STENCIL8
格式,但glReadPixels调用没有成功)。
使用纹理或pbuffer无法工作,因为此解决方案所需的函数(glGetTexImage(...)
、glMapBuffer(...)
)不是在我坚持使用的GL版本中实现的。
发布于 2020-08-12 20:54:02
正如“xeed”已经指出的那样,“收割者”已经回答了问题的“为什么”部分。至于如何在OpenGL ES中获取深度信息,经过大量在线搜索,以及与一些同行进行交谈,我只看到了两种建议的方法:
我尝试了这两种选择,两者似乎都有效,虽然我仍然有一个深度反演的问题,第二,虽然很容易修复(减去值从1.0f),我试图破译的原因。另外,第二个选项的细节取决于您何时需要值,以及您需要的原始场景的颜色信息。例如,在我的例子中,我可以将gl_FragCoord.z作为我的alpha通道值,因为我实际上并没有显示我的呈现结果。但是,如果您确实需要原始呈现的alpha通道完整,那么解决方案可能是多个呈现目标,其中一个获得gl_FragCoord.z值?
https://stackoverflow.com/questions/46448848
复制相似问题