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

wom*_*t57 4 opengl-es ios

我想读取屏幕外的像素(没有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);
Run Code Online (Sandbox Code Playgroud)

我读了原始像素:

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)); 
Run Code Online (Sandbox Code Playgroud)

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

wom*_*t57 5

解决了.iOS上的glReadPixels不支持RGBA到BGRA转换.更改

glReadPixels(0, 0, _videoDimensions.width, _videoDimensions.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(outPixelBuffer)); 
Run Code Online (Sandbox Code Playgroud)

glReadPixels(0, 0, _videoDimensions.width, _videoDimensions.height, GL_RGBA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(outPixelBuffer));
Run Code Online (Sandbox Code Playgroud)

解决了这个问题.glGetError是我的新朋友;)