我想更好地了解iOS下OpenGL ES帧缓冲区,渲染缓冲区等的创建,分配和绑定。据我所知,EAGLContext和EAGLSharegroup类通常管理这些对象的分配和绑定。但是,苹果文档表明,可以在不使用EAGLContext类的情况下进行GL屏幕外渲染,我对如何进行感兴趣。有没有人有任何代码示例的指针?
我也会对展示如何使用EAGLContext完成屏幕外渲染的示例感兴趣。
答案 0 :(得分:2)
在iOS,屏幕外或屏幕上使用OpenGL ES呈现内容的唯一方法是通过EAGLContext执行此操作。来自OpenGL ES Programming Guide:
在您的应用程序可以调用任何OpenGL ES函数之前,它必须 初始化EAGLContext对象并将其设置为当前上下文。
我认为以下几行可能会导致一些混淆:
EAGLContext类还提供了应用程序使用的方法 将OpenGL ES内容与Core Animation集成。没有这些 方法,您的应用程序将限于使用屏幕外 图像。
这意味着如果您想要向屏幕呈现内容,您可以使用仅由EAGLContext类提供的一些额外方法,例如-renderbufferStorage:fromDrawable:
。即使您要在屏幕外绘制,您仍然需要EAGLContext来管理OpenGL ES命令,但是需要在屏幕上绘制这些特定于EAGLContext的特定方法。
关于第二个问题,如何设置屏幕外渲染将取决于此屏幕外渲染的配置(纹理支持的FBO,深度缓冲等)。例如,以下代码将设置一个没有深度缓冲区的简单FBO,并渲染到已设置的outputTexture
纹理:
glActiveTexture(GL_TEXTURE1);
glGenFramebuffers(1, &filterFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer);
glBindTexture(GL_TEXTURE_2D, outputTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0);
对于代码示例,您可以在开源GPUImage框架(仅执行简单的图像渲染)或我的开源Molecules应用程序(执行更复杂的屏幕外渲染)中查看我是如何执行此操作的使用深度缓冲区。)