2011-09-12 63 views
0

編輯:我把宗教組織的方程,以確保問題不是從那裏來,所以現在我只是做了以下內容:iPhone開發:渲染深度緩衝,以黑色質感紋理效果

設置質地:

GLuint FB0Texture; 
glGenTextures(1, &FB0Texture); 
glBindTexture(GL_TEXTURE_2D, FB0Texture); 
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_DEPTH_COMPONENT16, size.width, size.height, 
       0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0); 

,然後渲染:

[self drawScene]; 

[(EAGLView *)self.view bindFB0]; 

glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 320, 480); 

[self drawFullScreenQuad]; (it's actually not full screen so I can see both the 3d scene and the resulting texture) 

,我也得到了相同的結果!黑色紋理,如果我將FB0Texture設置爲「DEPTH_COMPONENT」紋理,但正常場景,如果我將FB0Texture設置爲常規GL_RGBA紋理...

所以我想我要麼設置深度紋理錯誤,要麼可能我我在渲染中做錯了什麼,這會導致RGBA紋理看起來很正常,但深度紋理被擰緊了? GL_DEPTH_TEST已啓用且工作正常(模型看起來正確),所以我認爲實際渲染沒有任何問題,但此時我絕望尋找線索......

請幫忙!

//編輯END

我想實現在iPhone上一些基本的陰影映射,但是我堅持在呈現深度值的質地......這是推動我瘋了,我明明做一些錯誤,但無法弄清楚它是什麼......

所以我在做什麼:

  • 設置默認的幀緩衝,附上顏色渲染緩衝和深度渲染緩衝區
  • 設置一個新的幀緩衝(叫它FB0),附加紋理深度分量

後來,當我渲染:

  • 抽獎現場FB0
  • 切換到默認的framebuffer
  • 借鑑使用FB0作爲全屏四一個質地

我得到......沒有! (以及我得到一個完整的白色紋理)

如果我將紋理附加到FB0的顏色分量而不是深度分量,一切正常,因爲在我將場景繪製到FB0中,然後使用FB0作爲紋理繪製一個全屏幕四邊形,並且我確切地看到了如果我直接繪製到默認幀緩衝區時會看到的內容。

但是,當我將紋理附加到深度組件時,我所得到的就是這個白色屏幕/紋理。

一些代碼:

設置緩衝區:

// Create default framebuffer object. 
glGenFramebuffers(1, &defaultFramebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); 

// Create color render buffer and allocate backing store. 
glGenRenderbuffers(1, &colorRenderbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); 
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer]; 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer); 

// Create depth render buffer 
glGenRenderbuffers(1, &depthRenderbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 320, 480); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer); 


// Create Depth Map Frame Buffer 

glGenFramebuffers(1, &FB0); 
glBindFramebuffer(GL_FRAMEBUFFER, FB0); 

// Attach texture to depth component   

glGenTextures(1, &FB0Texture); 
glBindTexture(GL_TEXTURE_2D, FB0Texture); 
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_DEPTH_COMPONENT, size.width, size.height, 
       0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0); 

glFramebufferTexture2D(GL_FRAMEBUFFER, 
         GL_DEPTH_ATTACHMENT, 
         GL_TEXTURE_2D, 
         FB0Texture, 
         0); 

如果我檢查的幀緩衝區的狀態,這個我沒有得到任何錯誤信息後,所以我假定緩衝區正確創建。

然後在渲染:

[(EAGLView *)self.view setFB0]; (just binds the framebuffer) 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

[self drawScene]; 

[(EAGLView *)self.view setFramebuffer]; (binds back the default frame buffer) 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

[(EAGLView *)self.view bindFB0Texture]; 

[self drawFullScreenQuad]; 

[(EAGLView *)self.view presentFramebuffer]; 

在這一點上,我希望看到一個黑白紋理表示深度的灰色的水平,而是我只是得到一個純白色的四/紋理。

同樣,如果我將FB0Texture附加到GL_COLOR_ATTACHMENT0而不是GL_DEPTH_ATTACHMENT,則所有事情都按預期工作,我的場景將正確渲染到紋理。所以我想這個問題來自於我如何附加紋理,或者我在做什麼的順序?

回答

1

您的問題可能在於您只將深度紋理附加到渲染到紋理FBO並且不附加顏色緩衝區。

如果這樣做不起作用,Apple在他們的技術文檔中建議您應該使用GL_OES_depth_texture擴展名,但是我仍然無法使其自身在渲染紋理深度方面發揮作用,儘管使用它似乎顯着提高我得到的彩色渲染到紋理圖像的深度測試的保真度。

編輯:哎呀,這就是你現在正在做的。我應該更徹底地閱讀這個問題,對不起!

我目前正在遇到這個問題,所以如果它已經解決了,我很想知道如何!

編輯#2:我已經在我自己的情況下解決了這個問題。深度緩衝區將深度存儲在非線性空間中,因此有必要將深度轉換回線性空間以正確顯示它們(這可以通過投影近平面信息和遠平面信息來實現)。我遇到的問題是,我的大部分深度信息都被存儲在0.995到1.0的範圍內,這意味着在我眼中,它顯示爲完全白色的紋理。這可能是您獲得全白色紋理時遇到的問題。

作爲一個方面說明,Xcode 4.2的令人敬畏的OpenGL ES快照功能幫助我解決了這個問題。它可以讓你可視化上下文中的所有紋理和渲染緩衝區對象,甚至在數據爲非線性時爲你重新調整顏色。正如你可能猜到的那樣,這是我如何計算出來的。

相關問題