从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是我的新朋友;)