在我正在研究的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设备上失败。测试的情景如下表所示(是/否=工作/不工作):
我正在使用OpenGL ES v1.1(虽然v2在快速测试后也无法工作)。
有没有人遇到过这个问题?我错过了什么吗?最奇怪的是它只能在iOS 7物理设备上失败。
Here是一个包含所有相关代码和简单GitHub project以供参考的要点。我已经很容易构建并演示了这个问题。
的更新 :
以下是updated gist,GitHub 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设备上失败了。)
答案 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);
}