2

我需要将某些内容渲染到屏幕外缓冲区,并通过调用将像素读回“CPU 内存” glReadPixels。我的代码在 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 内存?有可能吗?

4

2 回答 2

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 代)。不幸的是,它在最需要它的 A4 和更早版本(iPhone4、iPod touch 第 4 代、3GS、iPad1)上不可用。

于 2012-10-31T05:47:13.127 回答
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);
}
于 2017-06-10T00:03:38.037 回答