2013-07-29 279 views
2

下面是來自同一視點(虛擬相機)的同一3D場景的2張圖像,有無背視。圖像不描繪最終的網格,而是描繪深度緩衝區的內容。OpenGL - BackCulling - 深度緩衝值

沒有BackCulling

glDisable(GL_CULL_FACE); 
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 
glEnable(GL_DEPTH_TEST); 
glDepthMask(GL_TRUE); 
glDepthFunc(GL_LESS); 

enter image description here

隨着BackCulling

glEnable(GL_CULL_FACE); 
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 
glEnable(GL_DEPTH_TEST); 
glDepthMask(GL_TRUE); 
glDepthFunc(GL_LESS); 

enter image description here

問題

  1. 爲什麼這兩個圖像之間有這樣的區別?當然,有人會期待有所不同,但我不明白爲什麼沒有BackCulling的深度圖是如此的流暢,而與BackCulling的深度值似乎並沒有如此連續。
  2. 沒有BackCulling的情況下,對於某個像素,深度緩衝區的值是多少?它離攝像機較近嗎(光滑的圖像看起來像這樣),還是因爲很多東西投影到相同的2d點/像素,我應該期待別的東西嗎?

參考 - 三維場景 - 二維框架

enter image description here

enter image description here

回答

4

他們的區別,因爲你剔除錯誤的面孔。您的網格數據明確定位,以便正面不同於OpenGL的默認值。 OpenGL默認爲逆時針方向。您的網格數據將順時針臉部放在前面(或者您在某點反轉網格)。

因此,代替重新排列頂點數據,請使用the aptly named glFrontFace(GL_CW)更改您的正面。

+0

確實@NicolBolas通過檢查網格,後表面的頂點具有相似的深度(與前表面頂點相反),但我沒有想到你的建議。非常感謝,它的作品!剛剛在上面提到的代碼行上面添加了你的建議命令:) –

+0

還要注意你也可以使用glCullFace。這會改變您是否挑選正面或背面(或兩者)。 – Invalid