2011-02-04 19 views
2

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

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

我该怎么做?

回答

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。前者处理来自相机的视频帧,其中一个设置允许在屏幕渲染缓冲区中进行处理时进行视频直通。后一个例子在一个点上呈现立方体贴图纹理,然后使用该纹理在茶壶上进行环境贴图。

+0

这是一个梦幻般的答案。你为什么称它为“position”Framebuffer? – Nektarios 2011-02-04 19:47:01

相关问题