opengl深度測試



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

  (1)什麼是深度?

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

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

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

  (2)爲什麼需要深度?

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

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

 (2)啓用深度測試

     使用 glEnable(GL_DEPTH_TEST);

     在默認情況是將需要繪製的新像素的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)將深度緩衝區設置爲只讀形式,否則可能出現畫面錯誤。爲什麼呢,因爲畫透明物體時,將使用混色,這時就不能繼續使用深度模式,而是利用混色函數來進行混合。這一來,就可以使用混合函數繪製半透明物體了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章