【问题标题】:glReadPixels doesn't work for getting depth on OpenGL ES 1.0 [duplicate]glReadPixels 不适用于在 OpenGL ES 1.0 上获取深度 [重复]
【发布时间】:2017-01-03 06:22:25
【问题描述】:

我正在尝试使用 glReadPixels 函数从深度缓冲区中获取深度值。它总是返回 0 给我。

首先,我创建深度缓冲区附件:

glGenFramebuffersOES(1, &viewFramebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[self.context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

if (USE_DEPTH_BUFFER)
{
    glGenRenderbuffersOES(1, &depthRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
}

然后我调用glReadPixels函数从深度缓冲区获取深度值:

float depth = 0.0f;

glReadPixels(point.x, self.renderUIView.frame.size.height - point.y, 1, 1, GL_DEPTH_COMPONENT16_OES, GL_FLOAT, &depth);

但它不起作用,深度值始终为 0。我尝试从 glGetError() 获取错误代码,它返回 1280。有什么我错过的设置吗?

【问题讨论】:

  • @RawN 感谢您的回答,在我的问题中,OpenGL ES 1.0 和 OpenGL 2.0 是否相同?
  • 恐怕我不知道。
  • @RawN 好的,感谢您的回答。

标签: c++ ios opengl-es


【解决方案1】:

OpenGL ES(任何 API 版本)不支持您尝试的操作 - 无法在深度缓冲区上使用 glReadPixels

一般还请注意,将glReadPixels 用于任何真正的 3D 游戏作为主渲染循环的一部分是一个“非常糟糕的主意” - 它会强制执行管道刷新,这将完全影响您的性能。

【讨论】:

  • 感谢您的回答。顺便说一句,如何在 OpenGL ES 1.0 中获取深度缓冲区值?
  • 在 OpenGL ES 1.0 中,你不走运 - 没有办法做你想做的事。
  • 从 OpenGL ES 2.0 开始,如果您在屏幕外渲染到 FBO,那么您可以在第二次渲染过程中将深度值作为纹理读取,例如使用片段着色器将其编码为 RGBA 颜色缓冲区,您可以调用 glReadPixels on(尽管它仍然会影响您的性能)。如果您要渲染到主窗口表面,而不是屏幕外表面,那么您就不走运了,因为无法将窗口表面深度缓冲区映射为纹理。
  • 你到底想做什么?我听起来可能有比你正在尝试的更好的方法......
  • 谢谢你的回答,兄弟。我是 OpenGL ES 的初学者。首先,我们的产品是在Windows平台上运行的。现在我们将把它移到 iOS 上。在桌面上,我可以左键单击窗口并获取 GDI 点,然后我可以使用 GL_DEPTH_COMPONENT 调用glReadPixels 来获取深度值。通过深度值,我可以决定我选择哪个模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
相关资源
最近更新 更多