深度緩衝

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
深度緩衝

計算機圖形學中,深度緩衝是在三維圖形中處理圖像深度坐標的過程,這個過程通常在硬件中完成,它也可以在軟件中完成,它是可見性問題的一個解決方法。可見性問題是確定渲染場景中哪部分可見、哪部分不可見的問題。畫家算法是另外一種常用的方法,儘管效率較低,但是也可以處理透明場景元素。深度緩衝也稱為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.