2013-01-15 68 views
1

我正在寫OpenGL ES的一個簡單的OOP包裝。雖然寫render-和幀緩存我有緩衝綁定,以便與它的工作:使用渲染緩衝區和幀緩衝區時,我應該清理OpenGL狀態嗎?

- (void) setupSomething 
{ 
    … 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, myBufferID); 
    … 
} 

現在,如果這種設置代碼被稱爲在上下文那裏有已經其他一些渲染緩衝約束是什麼?我上面提到的簡單版本會產生切換當前緩衝區的令人討厭的副作用,這聽起來很脆弱。我想我應該寫代碼更防守:

- (void) setupSomething 
{ 
    // Store current state 
    GLint previousRenderBuffer = 0; 
    glGetIntegerv(GL_RENDERBUFFER_BINDING_OES, &previousRenderBuffer); 
    // Do whatever I want to do 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, myBufferID); 
    … 
    // Restore previous state 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, previousRenderBuffer); 
} 

我的問題是:是不是真的有必要/ /按習慣來保存以前的狀態就是這樣,如果是,是否有某種glPushSomething會做它對我?

回答

1

使用像OpenGL這樣的圖形api通常是一個好主意,以儘量減少api調用的數量。有些調用可能會非常昂貴 - 我不確定glBindRenderBuffer - 雖然它可以像存儲一個int一樣便宜。但它可能是一些複雜的狀態切換操作。你最好自己處理它 - 使用你自己的'堆棧'緩衝區(在OpenGL ES中沒有glPushAttrib或類似的渲染緩衝區),或者更好地以我愚蠢的觀點,避免這些情況 - 總是確保你完成你的工作在傳遞到另一個緩衝區之前您已經綁定了渲染緩衝區。