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

我想从屏幕上读取像素(不支持CAEAGLLayer)Framebuffer。 我创build缓冲区的代码如下所示:

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)); 

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

解决了。 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是我的新朋友;)