2012-03-17 76 views
13

我在我的IOS OpenGL ES 2.0項目中使用GLkit/GLKView來管理我的應用的默認FBO /生命週期。從GLKView/GLKit獲取默認幀緩衝區ID

在桌面上的OpenGL爲了綁定默認FBO(前緩衝區),我就可以調用glBindFrameBuffer(GL_FRAMEBUFFER,0),但是這不是在iOS應用中的情況下,因爲你必須自己創建默認FBO,這將有一個唯一的ID;

問題是GLKit/GLKView編碼風格迫使我使用GLKView的「bindDrawable」函數來激活默認的FBO,這使得我的跨平臺渲染系統的設計有點難看(必須將GLKView指針存儲爲void *引擎類和橋樑每次我想要執行默認的FBO綁定時拋出它)

有沒有什麼辦法可以獲得GLKit /在我的代碼?

在最壞的情況下,我可以恢復自己創建默認的FBO,並且解散GLKit/GLKView,但它是一個很好的框架,我希望繼續使用它。

對不起,我的英語不好,並提前感謝任何答覆。

回答

22

也許你可以只是你bindDrawable電話後得到的「當前」幀緩衝ID,通過調用類似:

GLint defaultFBO; 
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &defaultFBO); 
+0

這工作很好,感謝您的回答(對不起還不能投票)。 – 2012-03-19 05:12:34

+0

真棒,很高興它爲你工作。 – 2012-03-22 10:15:05

0

是給予肯定的是妥善解決的答案,但它不解決錯誤在理解嵌入式系統的標準openGL和openGL之間的概念上的區別。 // ----------------------------------------------- 我覺得有必要指出,glBindFramebuffer(GL_FRAMEBUFFER,0) 的調用不會返回渲染到主幀緩衝區,儘管對於運行Windows,Unix(Mac)或Linux的機器似乎是這樣。臺式機和筆記本電腦沒有主要的默認系統幀緩存的概念。這個想法從手持設備開始。當你用零作爲參數進行openGL綁定調用時,你所做的就是將這個函數設置爲NULL。這是你如何禁用這個功能。這與glBindTexture(GL_TEXTURE_2D,0)相同; 在某些手持設備上,當您將幀緩衝區設置爲NULL而不激活另一個時,驅動程序可能會自動激活主系統幀緩衝區。這將是製造商做出的選擇,並不是你應該指望的,這不是openGL ES規範的一部分。對於臺式機和筆記本電腦來說,這是絕對必要的,因爲禁用幀緩衝區需要返回到正常的OpenGL渲染。但要記住!這不是返回到任何主要幀緩衝區,您正在關閉激活的幀緩衝區。

0

在GLKit中綁定默認幀緩衝區的正確方法是在GLKview上調用bindDrawable方法。

[self bindDrawable][myglkview bindDrawable]取決於上下文。