什麼是OpenGL中的深度 深度快取 深度測試?

2021-06-19 11:06:49 字數 2144 閱讀 5643

1)直觀理解

深度其實就是該象素點在3d世界中距離攝象機的距離,深度快取中儲存著每個象素點(繪製在螢幕上的)的深度值!深度測試決定了是否繪製較遠的象素點(或較近的象素點),通常選用較近的,而較遠優先能實現透視的效果!!!

2)z值(深度值)、z buffer(深度快取)

下面先講講z座標。z座標和x、y座標一樣。在變換、裁減和透視除法後,z的範圍為-1.0~1.0。depthrange對映指定z座標的變換,這與用於將x和y對映到視窗座標的視口變換類似,但depthrange對映又與視口對映有所不同,因為深度快取的硬體方案對應用程式來說是隱藏的。呼叫depthrange的引數是[0.0,1.0],與一片斷相聯的z值(深度值)表示到眼睛的距離。在預設情況下,最接近眼睛的片斷(在近截面上)被對映到0.0,離眼睛最遠的片斷(在遠截面上)對映到1.0。片斷可以對映為深度快取範圍的子集(通過在depthrange中指定更小的值)。對映也可以相反,這樣的話離眼睛最遠的片斷在0.0,最近的片斷在1.0(呼叫depthrange(1.0,0.0)),雖然這樣反向對映是可以的,但對實際應用作用不大。

要理解為什麼渲染質量上會不一致,最重要的是要理解螢幕z座標的特性。z值指定了從片斷到眼睛的距離。在正交投影中距離和z值的關係是線性的,但在透視投影中卻不是的。在透視投影中這種關係是非線性的,而且非線性的程度與frustum函式中的far/near(或gluperspective函式中的zfar/znear)成比例。這種非線性在靠近近截面時增加了z值的精度,而且增加了深度快取的效率;但是在視見体的其它部分則降低了精度,也就減少了深度快取的精確性。根據經驗,far/near比值大於1000會有這種不好的效果。所以一般far/near比值應小於1000。要想解決這個問題,最簡單的方法是通過將近截面遠離眼睛來降低far/near比值,其唯一的***是離眼睛很近的物體可能會被裁減掉,但在特定的應用程式中這很少是個問題,近截面的位置對x、y座標的投影沒有影響,因此這對影象的影響很小。

還有opengl光柵化和深度快取的一些其他方面值得一提。乙個大問題是光柵化過程使用不精確的演算法,所以很難處理共面的圖元,除非它們共享相同的平面方程。這個問題在有限精度的深度快取實現中更加嚴重。這些問題包括:貼花(decaling)、隱藏線消除、輪廓多邊形和陰影等。不過現在已經提出許多方法來解決這些問題,如polygonoffset技術等。

深度快取的位數是衡量深度快取精度的引數。深度快取位數越高,則精確度越高,目前的顯示卡一般都可支援16位的z buffer,一些高階的顯示卡已經可以支援32位的z buffer,但一般用24位z buffer就已經足夠了。

3)深度測試

opengl中的深度測試是採用深度快取器演算法,消除場景中的不可見面。在預設情況下,深度快取中深度值的範圍在0.0到1.0之間,這個範圍值可以通過函式:

gldepthrange (nearnormdepth, farnormaldepth);

將深度值的範圍變為nearnormdepth到farnormaldepth之間。這裡nearnormdepth和farnormaldepth可以取0.0到1.0範圍內的任意值,甚至可以讓nearnormdepth > farnormaldepth。這樣,通過gldepthrange函式可以在透視投影有限觀察空間中的任意區域進行深度測試。

另乙個非常有用的函式是:

glcleardepth (maxdepth);

引數maxdepth可以是0.0到1.0範圍內的任意值。glcleardepth用maxdepth對深度快取進行初始化,而預設情況下,深度快取用1.0進行初始化。由於在進行深度測試中,大於深度快取初始值的多邊形都不會被繪製,因此glcleardepth函式可以用來加速深度測試處理。這裡需要注意的是指定了深度快取的初始化值之後,應呼叫:

glclear(gl_depth_buffer_bit);

完成深度快取的初始化。

在深度測試中,預設情況是將需要繪製的新畫素的z值與深度緩衝區中對應位置的z值進行比較,如果比深度快取中的值小,那麼用新畫素的顏色值更新幀快取中對應畫素的顏色值。這種比較測試的方式可以通過函式:

gldepthfunc(func);

進行修改。其中引數func的值可以為gl_never(沒有處理)、gl_always(處理所有)、gl_less(小於)、gl_lequal(小於等於)、gl_equal(等於)、gl_gequal(大於等於)、gl_greater(大於)或gl_notequal(不等於),其中預設值是gl_less。這些測試可以在各種應用中減少深度快取處理的的計算。

什麼是OpenGL中的深度 深度快取 深度測試?

1 直觀理解 深度其實就是該象素點在3d世界中距離攝象機的距離,深度快取中儲存著每個象素點 繪製在螢幕上的 的深度值!深度測試決定了是否繪製較遠的象素點 或較近的象素點 通常選用較近的,而較遠優先能實現透視的效果!2 z值 深度值 z buffer 深度快取 下面先講講z座標。z座標和x y座標一樣...

opengl 深度詳解 OpenGL之深度測試

深度緩衝是在三維圖形中處理影象深度座標 個人認為可以理解成距離我們觀察攝像機遠近的距離 的過程 from wiki 這聽起來不好理解啊啊啊啊。所以就舉個栗子嘍xd,就好比我可能要按由近到遠順序渲染兩個面 實際上是任意順序,我是說假如按這個順序 近處的麵先渲染,之後渲染遠處的面,但是如果沒有開啟深度測...

什麼是深度學習?

讓我們先從深度學習的定義入手,然後順便理一下深度學習 機器學習以及ai之間的一些聯絡 深度學習是指多層的人工神經網路 和訓練它的方法。一層神經網路 會把大量矩陣數字作為輸入,通過非線性啟用方法取權重,再產生另乙個資料 三者聯絡如下 機器學習 抵達ai目標的一條路徑 深度學習是機器學習 研究中的乙個新...