如何在 iPhone OpenGL ES 2.0 中在渲染和呈现帧缓冲区之间切换?

Posted

技术标签:

【中文标题】如何在 iPhone OpenGL ES 2.0 中在渲染和呈现帧缓冲区之间切换?【英文标题】:How to switch between rendering and presenting framebuffers in iPhone OpenGL ES 2.0? 【发布时间】:2011-02-04 17:12:00 【问题描述】:

iPhone OpenGL ES 2.0..

第一帧,渲染到我的帧缓冲区,然后呈现(因为它在模板 OpenGL ES 应用程序中默认工作)。 在下一帧,我想使用渲染的帧缓冲区作为我的着色器的输入,同时渲染到另一个帧缓冲区并呈现第二个帧缓冲区。 下一帧,我想使用 framebuffer2 作为着色器的输入,同时再次渲染到第一个帧缓冲区。 重复

我该怎么做?

【问题讨论】:

【参考方案1】:

您应该能够使用如下代码设置具有纹理支持的渲染缓冲区:

// Offscreen position framebuffer object
glGenFramebuffers(1, &positionFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, positionFramebuffer);

glGenRenderbuffers(1, &positionRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, positionRenderbuffer);

glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, FBO_WIDTH, FBO_HEIGHT);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, positionRenderbuffer); 

// Offscreen position framebuffer texture target
glGenTextures(1, &positionRenderTexture);
glBindTexture(GL_TEXTURE_2D, positionRenderTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, FBO_WIDTH, FBO_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, positionRenderTexture, 0);

切换缓冲区就像使用这样的代码一样简单:

glBindFramebuffer(GL_FRAMEBUFFER, positionFramebuffer);        
glViewport(0, 0, FBO_WIDTH, FBO_HEIGHT);

然后,您可以渲染到该缓冲区并显示生成的纹理,方法是将其传递到一个简单的着色器中,该着色器将其显示在一个矩形几何体中。该纹理也可以输入到着色器中,该着色器渲染到另一个由纹理支持的类似渲染缓冲区,依此类推。

如果您需要做一些基于 CPU 的处理或读出,您可以使用glReadPixels() 从屏幕外渲染缓冲区中提取像素。

例如,您可以试用我的示例应用程序here 和here。前者处理来自相机的视频帧,其中一种设置允许在屏幕外渲染缓冲区中进行处理时通过视频。后一个示例在某一点渲染为立方体贴图纹理,然后使用该纹理在茶壶上进行环境映射。

【讨论】:

这是一个绝妙的答案。为什么叫它“位置”Framebuffer? @Nektarios - 这是从我链接的第一个示例项目中提取的代码。对于颜色跟踪算法,我将某个阈值内的每个像素替换为红色分量中的相对 X 位置和绿色分量中的相对 Y 位置(其他为 1.0)。因此,通过图像后,通过测试的所有像素的平均颜色是被跟踪对象的质心。更多信息请看这里:sunsetlakesoftware.com/2010/10/22/…

以上是关于如何在 iPhone OpenGL ES 2.0 中在渲染和呈现帧缓冲区之间切换?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 成本与收益 - OpenGL ES 1.x 与 2.0

iPad 或 iPhone 是不是支持 OpenGL ES 2.0?

iPhone 上的 OpenGL ES 2.0:无法超过小索引/顶点数

是否可以在顶点着色器内持续更改 iPhone OpenGL ES 2.0 上的 VBO 值?

iPhone OpenGL ES 2.0 奇怪的图案在 COLLADA 文件中的球体上渲染纹理

iPhone OpenGL ES 2.0 与 Cocos2D 的混合产生了意想不到的结果