深度緩衝

電腦圖學中,深度緩衝是在三維圖形中處理圖像深度坐標的過程,這個過程通常在硬件中完成,它也可以在軟件中完成,它是可見性問題的一個解決方法。可見性問題是確定彩現場景中哪部分可見、哪部分不可見的問題。畫家演算法是另外一種常用的方法,儘管效率較低,但是也可以處理透明場景元素。深度緩衝也稱為Z緩衝。

深度緩衝

三維圖形卡彩現物體的時候,每一個所生成的像素的深度(即z坐標)就儲存在一個緩衝區中。這個緩衝區叫作z緩衝區或者深度緩衝區,這個緩衝區通常組織成一個儲存每個螢幕像素深度的x-y二維陣列。如果場景中的另外一個物體也在同一個像素生成彩現結果,那麼圖形處理卡就會比較二者的深度,並且保留距離觀察者較近的物體。然後這個所保留的物體點深度儲存到深度緩衝區中。最後,圖形卡就可以根據深度緩衝區正確地生成通常的深度感知效果:較近的物體遮擋較遠的物體。這個過程叫作z消隱

深度緩衝的解像度對於場景質素有很大的影響:當兩個物體非常接近的時候,16位元的深度緩衝區可能會導致「z緩衝區fighting」的人為噪聲;使用24位元或者32位元的深度緩衝區就會表現得較好;由於精度太低,所以很少使用8位元的深度緩衝區。

發展

即使深度緩衝區有足夠大的解像度,但是如果z緩衝區中距離精度不隨距離均勻分佈的話圖像質素也可能會出現問題。距離較近的部分通常精度較高,這樣近距離的物體顯示質素也較高。通常這是所期望得到的結果,但是當物體距離變得較遠時可能會出現人為誤差。一種能夠得到更加均勻分佈精度的深度緩衝變體是w緩衝

在場景開始的時候,必須將深度緩衝區初始化為一個特定的值,通常初始化為1.0,這是因為1.0是深度範圍0到1的上限,它意味着在整個視體(viewing frustum)之內沒有任何物體。

通常認為深度緩衝概念的發明主要歸功於艾德文·卡特姆,雖然Wolfgang Straßer也在1974年所寫的博士論文1中提到了同樣的思想。

在最近幾年的PC圖形卡上,深度緩衝管理需要使用大量的主記憶體頻寬。人們採用了各種各樣的方法減少深度緩衝的影響,其中的方法有無失真數據壓縮(因為壓縮/解壓所消耗的電腦資源要比頻寬的佔用更加合算)。另外還使用了極快的硬件工具清除深度資訊,這種方法完全取代了「一幀正、一幀負」這種利用有符號數巧妙地繞過幀間深度資訊清除的技巧。

z消隱

彩現過程中,z消隱是根據深度資訊對像素的早期剔除。當彩現隱藏表面所需要的計算量很大的時候,這種方法可以提升處理效能。z消隱是深度緩衝的一個直接結果,在這種方法中每個待定像素的深度都要與相同位置的現存像素的深度進行比較。

使用深度緩衝區,一旦像素的深度已經確定,那麼就可以對這個像素進行裁剪,這樣如果該像素不可見的話就可以完全跳過照明與紋理處理的過程,並且需要消耗許多時間的像素濃淡工具通常也會跳過對於裁剪掉的像素的處理。這樣z消隱就成為了在填充速度、光照、紋理或者像素濃淡處理是主要瓶頸的場合的一種很好的最佳化工具。

儘管深度緩衝可以處理未經排序的幾何體,但是按照深度不斷增加的方式(與畫家演算法排序方式相反)對多邊形進行排序,每個像素就可以只彩現一次。對於填充速度有限但是有大量重複繪製場合,這種方法就可以提高處理效能。

數學基礎

待彩現的照相機空間中的深度經常定義為近距near到遠距far之間的z值,在透視變換之後,得到新的z'值:

 

其中 是照相機空間的值,它有時候也表示為w或者w'。

結果z'是在 -1到1之間歸一化之後的值,其中近距near 平面位於 -1處,遠距far平面位於1處。在這個範圍之外的相應點在視圖體之外,不需要進行彩現。

為了實現深度緩衝,在整個螢幕空間上的對當前多邊形頂點之間進行插值來計算z'的值,通常這些中間數值在深度緩衝區中用定點數格式儲存。距離近距near平面越近,z'值越密;距離越遠,z'值越稀。這樣距離照相機越近精度越高。near平面距離照相機越近,則遠距離位置的精度越低。near平面距離照相機太近是在遠距離物體產生人為誤差的一個常見因素。

w緩衝

為了實現w緩衝,通常照相機空間中的z值或者w值都儲存成浮點數格式,但是這些數值無法根據頂點在整個螢幕上進行線性插值——通常對它的倒數進行插值,然後再取倒數。這樣得到的結果w值與z'不同,它們在near平面與far平面之間均勻分佈。

根據應用的不同z緩衝與w緩衝生成的圖像質素也有所不同。

參見

外部連結

註釋

Note 1: see W.K. Giloi, J.L. Encarnação, W. Straßer. "The Giloi’s School of Computer Graphics". Computer Graphics 35 4:12–16.