2011-03-08 247 views
1

我有一些OpenGL ES的代碼看起來像這樣:iOS OpenGL ES:何時應該綁定幀緩衝區和渲染緩衝區?

- (void)drawView { 
    [EAGLContext setCurrentContext:context]; 

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
    glViewport(0, 0, backingWidth, backingHeight); 

    [game drawFrame]; 

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
    [context presentRenderbuffer:GL_RENDERBUFFER_OES]; 

    [self checkGLError:NO]; 
} 

我的問題是這樣的:當我應該叫glBindFramebufferOESglBindRenderbufferOES?老實說,我不記得爲什麼我以這種方式編寫代碼(這是幾個月前的版本),並且我開始回到iOS上的OpenGL ES中,並試圖瞭解幀緩衝區和渲染緩衝區如何工作。

我應該每幀調用這些函數嗎?還是應該在任何框架開始繪製之前只調用一次?

編輯:我應該甚至在每幀的基礎上調用glViewport?在draw有人被稱爲之前,我在一個單獨的函數中設置了我的視口 - 每幀連續呼叫glViewPort是否有意義?

回答

2

我傾向於忘記哪些調用是多餘的,但我可以評論我在我的有限測試中看到的內容。

設置場景時,只需要調用glViewport()一次,除非您將屏幕外渲染到不同大小的FBO。在這種情況下,當您在幀緩衝區之間切換時,您將使用glViewport()來重置大小。

同樣,在設置時只需要使用glBindFramebufferOES()一次,除非您要切換渲染到的FBO或者由於視圖大小的改變而重建當前的FBO。

在我的示例應用程序中,我發現glBindRenderbufferOES()需要在每幀中的-presentRenderbuffer:之前使用,或者什麼也沒有顯示。不過,我可能只是在錯誤的時間設置了一些東西。

我會告訴你,你可能想看看Xcode 4,其中可能有或可能沒有儀器中的新儀器,可能有助於指出這些冗餘的OpenGL ES調用。可以想像。

+0

你是對的,你必須綁定渲染緩衝區_every_框架,或者什麼都不顯示。 – bobobobo 2013-01-10 19:02:07