2011-02-04 54 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

相關問題