在了解深度測試前我們先了解幾個概念。
1、什么是深度?
深度是指該像素點在3D世界中距離攝像機(jī)位置的Z值。
2、什么是深度緩沖區(qū)
深度緩沖區(qū)是指一塊內(nèi)存區(qū)域,專門用來保存每個像素點在屏幕上的深度值。深度越大Z值越大
3、深度緩沖區(qū)的意義
在不使用深度測試的時候,假如我們先繪制一個近距離的物體,在繪制一個遠(yuǎn)距離的物體,遠(yuǎn)距離物體因為后繪制,就會把近距離的物體覆蓋掉,有了深度緩沖區(qū),物體繪制的順序就不那么重要了,實際上只要存在深度緩沖區(qū),OpenGL都會把像素的深度值寫入其中,除非掉用glDepthMask(GL FALSE)來禁止寫入。
所以在我們開啟深度測試的時候,首先要將表面對應(yīng)的像素的深入值和當(dāng)前深度緩沖區(qū)中的值進(jìn)行比較,如果大于深入緩沖區(qū)中的值,則丟棄這部分,否者就利用該像素對應(yīng)的深度值和顏色值分別更新深度緩沖區(qū)和顏色緩沖區(qū)。這個過程就是深度測試。(深入緩沖區(qū)和顏色緩沖區(qū)是一一對應(yīng)的)。深入測試的判斷是以像素點為單位,并非以當(dāng)前繪制的圖形為單位。
如何開啟深度測試?
?glEnable(GL_DEPTH_TEST).
在使用中我們需要注意如果項目中需要使用深度測試,我們在繪制前要對深度緩沖區(qū)進(jìn)行清除。如果不清空顏色/深度緩沖區(qū)時,會造成數(shù)據(jù)的殘留,導(dǎo)致繪制異常。
? ? glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
下面上傳開啟深入測試后的效果圖。

當(dāng)然我們在項目中也可能會遇到深度值都一樣的情況,這樣就會出現(xiàn)ZFighting 閃爍問題(即指OpenGL不能正確的判斷同一平面的繪制的深度值,導(dǎo)致深入測試結(jié)果不可預(yù)測,顯示出來的紋理交錯閃爍),就需要進(jìn)行如下處理多邊形偏移讓其深度值產(chǎn)生一些細(xì)微的變化,達(dá)到區(qū)分二者圖形深度值的效果。
glEnable(GL_POLYGON_OFFSET_POINT) //對應(yīng)GL_POINT
glEnable(GL_POLYGON_OFFSET_LINE) //對應(yīng)GL_LINE
glEnable(GL_POLYGON_OFFSET_FILL) //對應(yīng)GL_FILL
然后指定偏移量
void glPolygonOffet(Glfloat factor,Glfloat units);
一般來說,只需要將-1.0和-1這樣簡單賦值給glPolygonOffet基本就可以滿足需求
關(guān)閉Polygon Offset
glDisable(GL_POLYGON_OFFSET_FILL)
如有不妥之處,敬請指出。