openGL 深度測試

  openGL裏常出現深度測試,一直不清楚。今天就來弄清楚。緩存

  (1)什麼是深度?函數

        深度其實就是該象素點在3d世界中距離攝象機的距離(繪製座標),深度緩存中存儲着每一個象素點(繪製在屏幕上的)的深度值!測試

   深度值(Z值)越大,則離攝像機越遠。spa

   深度值是存貯在深度緩存裏面的,咱們用深度緩存的位數來衡量深度緩存的精度。深度緩存位數越高,則精確度越高,目前的顯卡通常均可支持16位的Z Buffer,一些高級的顯卡已經能夠支持32位的Z Buffer,但通常用24位Z Buffer就已經足夠了。3d

  (2)爲何須要深度?orm

   在不使用深度測試的時候,若是咱們先繪製一個距離較近的物體,再繪製距離較遠的物體,則距離遠的物體由於後繪製,會把距離近的物體覆蓋掉,這樣的效果並非咱們所但願的。而有了深度緩衝之後,繪製物體的順序就不那麼重要了,都能按照遠近(Z值)正常顯示,這很關鍵。it

        實際上,只要存在深度緩衝區,不管是否啓用深度測試,OpenGL在像素被繪製時都會嘗試將深度數據寫入到緩衝區內,除非調用了glDepthMask(GL_FALSE)來禁止寫入。這些深度數據除了用於常規的測試外,還能夠有一些有趣的用途,好比繪製陰影等等。
im

 (2)啓用深度測試數據

     使用 glEnable(GL_DEPTH_TEST);margin

     在默認狀況是將須要繪製的新像素的z值與深度緩衝區中對應位置的z值進行比較,若是比深度緩存中的值小,那麼用新像素的顏色值更新幀緩存中對應像素的顏色值。

     可是可使用glDepthFunc(func)來對這種默認測試方式進行修改。

     其中參數func的值能夠爲GL_NEVER(沒有處理)、GL_ALWAYS(處理全部)、GL_LESS(小於)、GL_LEQUAL(小於等於)、GL_EQUAL(等於)、GL_GEQUAL(大於等於)、GL_GREATER(大於)或GL_NOTEQUAL(不等於),其中默認值是GL_LESS。

    通常來將,使用glDepthFunc(GL_LEQUAL);來表達通常物體之間的遮擋關係。 

(3)啓用了深度測試,那麼這就不適用於同時繪製不透明物體。


備註:

繪製半透明物體時,需注意:在繪製半透明物體時前,還須要利用glDepthMask(GL_FALSE)將深度緩衝區設置爲只讀形式,不然可能出現畫面錯誤。爲何呢,由於畫透明物體時,將使用混色,這時就不能繼續使用深度模式,而是利用混色函數來進行混合。這一來,就可使用混合函數繪製半透明物體了。

相關文章
相關標籤/搜索