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

如何在iPhone OpenGL ES 2.0中在渲染和显示帧缓冲区之间切换?,iphone,opengl-es,framebuffer,Iphone,Opengl Es,Framebuffer,iPhone OpenGL ES 2.0 第一帧,渲染到我的帧缓冲区,然后呈现它(默认情况下,它在模板OpenGL ES应用程序中工作) 在下一帧中,我想使用渲染的帧缓冲区作为着色器的输入,同时渲染到另一个帧缓冲区并显示第二个帧缓冲区 在下一帧中,我希望使用framebuffer2作为着色器的输入,同时再次渲染到第一个帧缓冲区 重复 如何执行此操作?您应该能够使用如下代码设置具有纹理支持的renderbuffer: // Offscreen position framebuffer obje

iPhone OpenGL ES 2.0

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

如何执行此操作?

您应该能够使用如下代码设置具有纹理支持的renderbuffer:

// 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);
然后可以渲染到该缓冲区,并通过将结果纹理传递到一个简单的着色器(该着色器在矩形几何体中显示)来显示结果纹理。该纹理还可以输入着色器,该着色器渲染到另一个类似的由纹理支持的renderbuffer中,依此类推

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


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

这是一个非常好的答案。为什么称之为“位置”帧缓冲区?@Nektarios-这是从我链接的第一个示例项目中提取的代码。对于颜色跟踪算法,我用红色分量中的相对X位置和绿色分量中的相对Y位置(其他为1.0)替换了在某个阈值内的每个像素。因此,通过图像后,通过测试的所有像素的平均颜色就是被跟踪对象的质心。请参见此处了解更多信息: