OpenGL 深度測試使用

2021-06-23 03:14:47 字數 1248 閱讀 1699

第一,什麼是opengl的深度 

所謂深度,就是在opengl座標系中,畫素點z座標距離攝像機的距離。

攝像機可能放在座標系的任何位置,那麼,就不能簡單的說z數值越大或越小,就是越靠近攝像機。

opengl 會專門用乙個緩衝區來存放這個z座標數值。就叫深度緩衝區。

第二,深度緩衝區的作用 

一般情況下,我們繪製,後繪製的會覆蓋前面的。所以,一般我們繪製順序是先後面在前面。

這就會有乙個效能問題,就是遮蓋的部分,先繪製的被覆蓋是沒有意義的運算操作。

深度緩衝區就是來解決這個問題的。

有了深度緩衝區,繪製的時候就會檢查z座標的數值,靠近攝像機的覆蓋遠離的,而不是依靠繪製順序。

這點在3d繪圖中,尤其重要。

第三,如何使用緩衝區測試 

為什麼要叫測試,是因為開啟後,想測試深度值在繪製。

glenable(gl_depth_test);

這句就會開啟深度測試。預設情況是z值小的情況下會覆蓋原有的。

如果攝影機,在z軸的正方向,那麼z值大靠近攝影機。

如果攝影機,在z軸的負方向,那麼z值小靠近攝影機。

通常,我們希望靠近攝影機的數值覆蓋遠的。所以,深度測試覆蓋規則需要能夠修改。

gldepthfunc(func);

這就是修改比較規則的設定。我們能夠根據攝影機的位置,決定z值的覆蓋方式。

其中引數func的值可以為gl_never(沒有處理)

gl_always(處理所有)

gl_less(小於)

gl_lequal(小於等於)

gl_equal(等於)

gl_gequal(大於等於)

gl_greater(大於)

gl_notequal(不等於)

其中預設值是gl_less

最後, 有一種情況,用深度測試會有些力不從心。

那就是有透明度的時候。因為深度測試只會單純的覆蓋保留不能混色。

這樣,在繪製半透明物體後,緩衝區存放了一些半透明物體的資料。那麼半透明後面的物體將會不能出現。

可是半透明應該能半透的啊 !!!

這時候,我們可以使用函式 gldepthmask(gl_false) 把深度緩衝區置為唯讀形式。

這樣半透明物體的數值就不能進入緩衝區了。後面繪製的物體只要比原緩衝區數值更靠近攝像機就行了。

所以,最後的繪製順序是,先繪製所有的不透明物體,以後禁用緩衝區寫入,繪製所有半透明的。

openGL 深度測試

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

openGL 深度測試

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

openGL 深度測試

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