0

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

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

4

1 回答 1

2

在 iOS 上使用 OpenGL ES 渲染内容的唯一方法是通过 EAGLContext 实现。来自OpenGL ES 编程指南

在您的应用程序可以调用任何 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应用程序(使用深度缓冲区进行更复杂的离屏渲染)中执行此操作。

于 2012-06-23T01:13:44.320 回答