是否可以在OpenGL ES 2.0 / iOS上渲染到8位纹理帧缓冲区?

时间:2012-08-31 14:25:45

标签: ios opengl-es-2.0 framebuffer

我需要向屏幕外缓冲区渲染内容,并通过调用glReadPixels将像素读回“CPU内存”。我的代码在Windows下编译为普通的OpenGL时效果很好,但为了让它在iOS下的OpenGL ES 2.0下运行,我不得不用GL_ALPHA替换GL_LUMINANCE(或GL_RGBA)纹理一,意思

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,  width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

而不是

glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA,  width, height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, NULL);

我无法使用8位纹理运行代码。

但是由于我不需要这个渲染的全彩色,每个像素额外的3个字节都被浪费了。在我再次尝试之前,我的问题在这里:

是否有人成功将屏幕外渲染为8位纹理并将字节读回CPU内存?有可能吗?

2 个答案:

答案 0 :(得分:2)

将glRenderbufferStorage格式设置为GL_R8_EXT,将glReadPixels / glTexImage2D格式设置为GL_RED_EXT。

http://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_rg.txt

http://developer.apple.com/library/ios/#releasenotes/General/WhatsNewIniPhoneOS/Articles/iOS5.html#//apple_ref/doc/uid/TP30915195-SW47

编辑:我已经测试了这个并且它可以工作,但仅适用于A5及以上版本(iPad2 / 3/4 / mini,iPhone4S / 5,iPod touch第5代)。不幸的是,在最需要的地方(iPhone4,iPod touch第4代,3GS,iPad1),它不适用于A4及更旧版本。

答案 1 :(得分:0)

要使其在OpenGL 3.0中运行,可以将GL_R8用于缓冲区缓冲区:

glGenFramebuffers(1, &_framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);

glGenRenderbuffers(1, &_renderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_R8, 640, 480);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                          GL_RENDERBUFFER, _renderBuffer);

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ;
if(status != GL_FRAMEBUFFER_COMPLETE) {
  NSLog(@"failed to make complete framebuffer object %x", status);
}