首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >glReadPixels on DEPTH_COMPONENT throws GL_INVALID_OPERATION

glReadPixels on DEPTH_COMPONENT throws GL_INVALID_OPERATION
EN

Stack Overflow用户
提问于 2017-09-27 13:13:11
回答 2查看 849关注 0票数 1

我在读取屏幕外帧缓冲区呈现传递的深度缓冲区时遇到了问题。当使用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相对应。

在这里,框架缓冲区创建:

代码语言:javascript
运行
复制
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);

框架缓冲区已完成,并且不会引发错误。前面和下面最后一段之间的代码也不会抛出任何错误。

代码语言:javascript
运行
复制
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版本中实现的。

EN

Stack Overflow用户

发布于 2020-08-12 20:54:02

正如“xeed”已经指出的那样,“收割者”已经回答了问题的“为什么”部分。至于如何在OpenGL ES中获取深度信息,经过大量在线搜索,以及与一些同行进行交谈,我只看到了两种建议的方法:

  1. (仅限于ES 3+ )将深度纹理附加到渲染场景的框架缓冲区。然后渲染一个“全屏”四边形,在这个四边形的碎片阴影中采样深度纹理,并输出深度纹理值作为你的颜色值,例如在你的红色通道。最后,使用glReadPixels对此颜色信息,以获得深度值返回。请参阅:https://stackoverflow.com/a/35041374/11295586
  2. 使用gl_FragCoord.z获取值。请参阅:https://stackoverflow.com/a/6140714/11295586

我尝试了这两种选择,两者似乎都有效,虽然我仍然有一个深度反演的问题,第二,虽然很容易修复(减去值从1.0f),我试图破译的原因。另外,第二个选项的细节取决于您何时需要值,以及您需要的原始场景的颜色信息。例如,在我的例子中,我可以将gl_FragCoord.z作为我的alpha通道值,因为我实际上并没有显示我的呈现结果。但是,如果您确实需要原始呈现的alpha通道完整,那么解决方案可能是多个呈现目标,其中一个获得gl_FragCoord.z值?

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46448848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档