从glReadPixels迁移到CVOpenGLESTextureCache

时间:2014-05-13 18:17:37

标签: ios opengl opengl-es-2.0 glkit core-video

Curretly,我在iPad应用程序中使用glReadPixels将OpenGL纹理的内容保存在帧缓冲区中,这非常慢。纹理的大小为1024x768,我计划在2048x1536支持Retina显示。检索到的数据保存在文件中。

从多个来源阅读后,使用CVOpenGLESTextureCache似乎是唯一更快的选择。但是,我找不到任何指南或文档作为一个很好的起点。

如何重写我的代码以便它使用CVOpenGLESTextureCache?代码的哪些部分需要重写?除非已有关于如何执行此操作的文档,否则不使用第三方库。

代码如下:

//Generate a framebuffer for drawing to the texture
glGenFramebuffers(1, &textureFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, textureFramebuffer);

//Create the texture itself 
glGenTextures(1, &drawingTexture);
glBindTexture(GL_TEXTURE_2D, drawingTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F_EXT,  pixelWidth, pixelHeight, 0, GL_RGBA32F_EXT, GL_UNSIGNED_BYTE, NULL);

//When drawing to or reading the texture, change the active buffer like that:
glBindFramebuffer(GL_FRAMEBUFFER, textureFramebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0);

//When the data of the texture needs to be retrieved, use glReadPixels:
GLubyte *buffer = (GLubyte *) malloc(pixelWidth * pixelHeight * 4);
glReadPixels(0, 0, pixelWidth, pixelHeight, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *)buffer);

0 个答案:

没有答案