第一,什麼是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值 越大,則離攝像機越遠。深度值是存貯在深度快取裡面的,我們用深度快取的位數來衡量深度快取的精度。深度...