openGL 深度測試

2021-06-29 09:32:04 字數 1155 閱讀 3435

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)將深度緩衝區設定為唯讀形式,否則可能出現畫面錯誤。為什麼呢,因為畫透明物體時,將使用混色,這時就不能繼續使用深度模式,而是利用混色函式來進行混合。這一來,就可以使用混合函式繪製半透明物體了。

openGL 深度測試

opengl裡常出現深度測試,一直不清楚。今天就來弄清楚。1 什麼是深度?深度其實就是該象素點在3d世界中距離攝象機的距離 繪製座標 深度快取中儲存著每個象素點 繪製在螢幕上的 的深度值!深度值 z值 越大,則離攝像機越遠。深度值是存貯在深度快取裡面的,我們用深度快取的位數來衡量深度快取的精度。深度...

openGL 深度測試

opengl裡常出現深度測試,一直不清楚。今天就來弄清楚。1 什麼是深度?深度其實就是該象素點在3d世界中距離攝象機的距離 繪製座標 深度快取中儲存著每個象素點 繪製在螢幕上的 的深度值!深度值 z值 越大,則離攝像機越遠。深度值是存貯在深度快取裡面的,我們用深度快取的位數來衡量深度快取的精度。深度...

OpenGL深度測試

opengl裡常出現深度測試,一直不清楚。今天就來弄清楚。1 什麼是深度?深度其實就是該象素點在3d世界中距離攝象機的距離 繪製座標 深度快取中儲存著每個象素點 繪製在螢幕上的 的深度值!深度值 z值 越大,則離攝像機越遠。深度值是存貯在深度快取裡面的,我們用深度快取的位數來衡量深度快取的精度。深度...