从iOS(OpenGL-ES)中的屏幕外OpenGL像素缓冲区读取像素

时间:2011-07-30 01:24:43

标签: ios opengl-es

我想从屏幕外读取像素(不是由CAEAGLLayer支持)Framebuffer。我创建缓冲区的代码如下:

glGenFramebuffersOES(1, &_storeFramebuffer);
glGenRenderbuffersOES(1, &_storeRenderbuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, _storeFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, _storeRenderbuffer);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES,   GL_RENDERBUFFER_OES, _storeRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGBA8_OES, w, h);

我用:

读取原始像素
glBindFramebufferOES(GL_FRAMEBUFFER_OES, _storeFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, _storeRenderbuffer); 
glReadPixels(0, 0, _videoDimensions.width, _videoDimensions.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(outPixelBuffer)); 

这很有效。我可以渲染到这个缓冲区,并从它复制到屏幕。但我不能得到原始像素。 glReadPixels总是返回零,并且glReadBuffer似乎不存在。我可以使用glReadPixels从屏幕上的帧缓冲区中读取。有任何想法吗?

1 个答案:

答案 0 :(得分:5)

解决。 iOS上的glReadPixels不支持RGBA到BGRA转换。 改变

glReadPixels(0, 0, _videoDimensions.width, _videoDimensions.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(outPixelBuffer)); 

glReadPixels(0, 0, _videoDimensions.width, _videoDimensions.height, GL_RGBA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(outPixelBuffer));

解决问题。 glGetError是我的新朋友;)