在我正在开发的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 =工作/不):
我使用的OpenGL ES 1.1版(虽然V2也没有一个快速的测试工作后, )。
有没有人遇到过这个问题?我错过了什么吗?这最奇怪的部分是它只在iOS 7物理设备上失败。
Here是与所有相关的代码和裸骨GitHub project作为参考依据。我已经非常容易地构建和演示这个问题。
UPDATE:
这里是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设备)。
你有正确的情况下,在这个时候,还是莫不是你调用此之前明确的机会吗? – prabindh
我已经复制你的代码,它的工作原理。在呈现缓冲区之前,您需要调用读像素方法。 –
@prabindh在此之前,我还没有打过电话。 –