glReadPixels仅在iOS 7设备上提供黑色图像

时间:2014-03-14 00:13:05

标签: iphone ios7 opengl-es glreadpixels

在我正在研究的OpenGL ES应用程序中,我注意到glReadPixels()函数无法在所有设备/模拟器上运行。为了测试这个,我创建了一个简单的示例OpenGL应用程序。我在EAGLContext上下文中设置了背景颜色,并尝试使用glReadPixels()读取像素,如下所示:

int bytesPerPixel = 4;
int bufferSize = _backingWidth * _backingHeight * bytesPerPixel;

void* pixelBuffer = malloc(bufferSize);
glReadPixels(0, 0, _backingWidth, _backingHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixelBuffer);

// pixelBuffer should now have meaningful color/pixel data, but it's null for iOS 7 devices

free(pixelBuffer);

这在iOS 6和7的模拟器以及物理iOS 6设备上按预期工作,但在物理iOS 7设备上失败。测试的情景如下表所示(是/否=工作/不工作):

Test

我正在使用OpenGL ES v1.1(虽然v2在快速测试后也无法工作)。

有没有人遇到过这个问题?我错过了什么吗?最奇怪的是它只能在iOS 7物理设备上失败。

Here是一个包含所有相关代码和简单GitHub project以供参考的要点。我已经很容易构建并演示了这个问题。

更新

以下是updated gistGitHub project也已更新。我已经更新了示例项目,以便您可以轻松查看glReadPixels的内存输出。

另外,我有一个新观察:当EAGLContext是图层备份([self.context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer])时,glReadPixels可以成功读取所有设备/模拟器(iOS 6和7)上的数据。但是,当您在GLView.m中切换标志以使上下文不是图层备份([self.context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:nil])时,glReadPixels会显示初始帖子中表达的条件(适用于iOS 6 sim / device, iOS 7 SIM卡,但在iOS 7设备上失败了。)

2 个答案:

答案 0 :(得分:3)

在评论中发布我设法使用您的代码并且它有效。但是,我定义了从视图生成渲染缓冲区的BACKING_TYPE_LAYERBACKED

创建FBO的另一个管道虽然不起作用。 FBO管道中的问题是调用[self.context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:nil]。删除这一行,你应该没事。

答案 1 :(得分:0)

继续Matic Oblak的回答,对于那些在设备上使用第二个后台缓冲区(数据支持 - 不是从图层存储)执行object picking等任务时可能会遇到此问题的人将需要重新绑定frameBuffer,renderBuffer,然后将renderBuffer重新附加到frameBuffer 。例如,gist中的bindBuffers函数将如下所示

- (void)bindBuffers
{
  glBindFramebufferOES(GL_FRAMEBUFFER_OES, _framebuffer);
  glBindRenderbufferOES(GL_RENDERBUFFER_OES, _renderbuffer);
  glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, _renderbuffer);
}