不使用EAGLContext的OpenGL ES示例

时间:2012-06-22 19:18:26

标签: ios opengl-es opengl-es-2.0

我想更好地了解iOS下OpenGL ES帧缓冲区,渲染缓冲区等的创建,分配和绑定。据我所知,EAGLContext和EAGLSharegroup类通常管理这些对象的分配和绑定。但是,苹果文档表明,可以在不使用EAGLContext类的情况下进行GL屏幕外渲染,我对如何进行感兴趣。有没有人有任何代码示例的指针?

我也会对展示如何使用EAGLContext完成屏幕外渲染的示例感兴趣。

1 个答案:

答案 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应用程序(执行更复杂的屏幕外渲染)中查看我是如何执行此操作的使用深度缓冲区。)