我需要向屏幕外缓冲区渲染内容,并通过调用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内存?有可能吗?
答案 0 :(得分:2)
将glRenderbufferStorage格式设置为GL_R8_EXT,将glReadPixels / glTexImage2D格式设置为GL_RED_EXT。
http://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_rg.txt
编辑:我已经测试了这个并且它可以工作,但仅适用于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);
}