2012-03-28 178 views
3

我注意到,如果我的顏色緩衝區之前綁定我的深度緩存,應用按預期工作:OpenGL ES 2.0的緩衝設置

glGenRenderbuffers(1, &_depthbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, _depthbuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _sw, _sh); 
glGenRenderbuffers(1, &_renderbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer); 
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer]; 

然而,結合深度緩衝之後引起沒什麼渲染,甚至我glClearColor設置將被忽略:

glGenRenderbuffers(1, &_renderbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer); 
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer]; 
glGenRenderbuffers(1, &_depthbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, _depthbuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _sw, _sh); 

我已經得到了通過深入研究各個組件,瞭解一些如何OpenGL ES 2.0的工作流,但這好像它是每個人都只是做他們的教程中的唯一的事情/書籍,但沒有解釋爲什麼。有任何想法嗎?這是甚至是一個問題,或者可能在我的設置的其餘部分有問題嗎? (如果是的話,我會包括所有的代碼)

編輯

@cli_hlt - 深度緩衝區已經被添加到幀緩衝:

glGenFramebuffers(1, &_framebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthbuffer); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _renderbuffer); 

編輯

深度之前:

enter image description here enter image description here

深度綁定後:

enter image description here

+0

檢查這個問題的答案:http://stackoverflow.com/questions/4361516/request-a-depthbuffer-in-opengl-es-for-iphone - 你似乎缺少查詢緩衝區大小和附加它到幀緩衝區。 – 2012-03-28 14:47:53

+1

後來到了;如果它不在那裏,不管我在訂單順序上有什麼問題,我都不會使用深度緩衝區。 – 2012-03-28 15:00:51

+0

好的。 _sw和_sh是否正確?我在問上面的答案,答案海報完全是第二種方式,當答案被接受時,我認爲它正在工作。 – 2012-03-28 15:19:19

回答

3

我可能是完全錯誤的 - 我剛開把手上這個東西我自己,但我的理解是,glBind命令只告訴OpenGL渲染哪/紋理/無論用於後續功能。如果你習慣於面向對象編程,這是一個奇怪的模型。在樣板設置代碼中,您必須將您創建的緩衝區綁定到GL_RENDERBUFFER「插槽」,以便下一個glRenderbufferStorage()或 - [EAGLContext renderbufferStorage:fromDrawable:]調用知道要使用哪個緩衝區。我認爲問題在於,在調用之前,您沒有將活動的GL_RENDERBUFFER綁定回您的顏色緩衝區 - [EAGLContext presentRenderBuffer:],因此您實際上正在顯示深度緩衝區。添加

glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer); 

在presentRenderBuffer之前:調用應該解決這個問題。 …我認爲。

+0

我暫時接受了這個答案,儘管我正在尋找一個來自OpenGL ES 2.0專家的更確定的答案,並且能夠準確解釋爲什麼它會像這樣工作。 – 2012-04-17 19:21:03

+0

請讓我知道如果這不能真正解決您的問題,所以我可以理清我不瞭解OpenGL的內容。謝謝! – davehayden 2012-04-17 20:37:01

+0

它確實有效,並且您的答案背後的概念似乎是正確的。但是,在我看來,'internalformat'參數仍然是一個黑盒子。在'glRenderbufferStorage(...)'中發生了什麼,它使得爲後續調用綁定到渲染緩衝區的緩衝區有所不同。從技術上講,如果順序很重要,深度緩衝區正在完成的任何事情都被'glBindRenderbuffer(GL_RENDERBUFFER,_renderbuffer)'覆蓋,這引出了我的要求,深度緩衝區是否在做任何事情?它看起來不像它...因爲在我的應用程序中省略了代碼段的變化**沒有任何**。笑 – 2012-04-17 20:52:42

0

有人會認爲,爲了渲染,您只需將所需的幀緩衝區綁定到GL_FRAMEBUFFER--因爲幀緩衝區本身被附加到顏色和深度渲染緩衝區。

但是,在iOS/OpenGL ES 2.0上,您還需要將顏色渲染緩衝區綁定到GL_RENDERBUFFER,否則不會繪製任何內容。

因此,重新分配後盾深度渲染後,一定要做到這一點,通過調用:

glBindRenderbuffer(GL_RENDERBUFFER, colorRenderBuffer); 

這是爲什麼?那麼,在iOS上,我們習慣於使用EAGLContext將OpenGL ES渲染到CAEAGLLayer上。因此,在使用OGL調用渲染到幀緩衝區後執行渲染後,我們將EAGLContext的presentRenderbuffer:方法稱爲實際將其顯示在可繪製表面上。

EAGLContext docs

- (BOOL)presentRenderbuffer:(NSUInteger)target

顯示一個渲染的屏幕上的內容。

要顯示使用renderbufferStorage必須已分配存儲的渲染:fromDrawable:方法

可以驗證這是通過將呼叫立即glBindRenderbuffer你的電話之前[context presentRenderbuffer:GL_RENDERBUFFER] - 綁定僅影響調用,而不是之前與OpenGL的交互。