2014-03-14 196 views
4

在我正在开发的OpenGL ES应用程序中,我注意到glReadPixels()函数无法在所有设备/模拟器中工作。为了测试这个,我创建了一个裸骨样本OpenGL应用程序。余设置的EAGLContext上下文的背景颜色,并试图读取使用glReadPixels()像素如下:glReadPixels仅在iOS 7设备上给出黑色图像

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设备。测试的场景列于下表(YES/NO =工作/不):

Test

我使用的OpenGL ES 1.1版(虽然V2也没有一个快速的测试工作后, )。

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

Here是与所有相关的代码和裸骨GitHub project作为参考依据。我已经非常容易地构建和演示这个问题。

UPDATE

这里是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设备)。

+0

你有正确的情况下,在这个时候,还是莫不是你调用此之前明确的机会吗? – prabindh

+2

我已经复制你的代码,它的工作原理。在呈现缓冲区之前,您需要调用读像素方法。 –

+0

@prabindh在此之前,我还没有打过电话。 –

回答

3

在发表评论时,我设法使用你的代码,它的工作。但是,我定义了从视图中生成渲染缓冲区的BACKING_TYPE_LAYERBACKED

虽然创建FBO的其他管道不起作用。您的FBO管道中的问题是呼叫[self.context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:nil]。删除这条线,你应该没问题。

+0

谢谢!你知道为什么这条线在iOS 6与iOS 7相比有不同的表现吗? iOS 6实施是否错误? –

+1

我不知道,没有关于传递nil参数的文档。所有说的是“这个参数的值必须是一个CAEAGLLayer对象”。无论如何,调用它是没有意义的,在iOS 6上它似乎什么都不做,而在iOS 7上它肯定会做一些邪恶的事情:) –

0

从马蒂奇Oblak的回答继续,对于那些使用第二回缓冲区时,谁可能会遇到这个问题(备份数据 - 存储不是从层)的任务,如objectpicking,在设备上,则需要重新绑定FRAMEBUFFER,渲染然后将renderBuffer重新附加到frameBuffer。对于e.g在gistbindBuffers功能将是如下

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