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

时间:2011-02-04 17:12:00

标签: iphone opengl-es framebuffer

iPhone OpenGL ES 2.0 ..

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

我该怎么做?

1 个答案:

答案 0 :(得分:9)

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

// 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()从此屏幕外渲染缓冲区中提取像素。

有关此示例,您可以试用我的示例应用herehere。前者处理来自摄像机的视频帧,其中一个设置允许在屏幕外渲染缓冲区中进行处理时视频的直通。后一个示例在一个点上渲染成立方体贴图纹理,然后使用该纹理在茶壶上进行环境贴图。