深度緩衝區

深度緩衝區 (又稱為 Z 緩衝區) 會儲存深度資訊,以控制哪個多邊形區域會進行轉譯 (而非隱藏)。

概觀

深度緩衝區 (通常也稱為 Z 緩衝區或 W 緩衝區) 是一個裝置屬性,會負責儲存 Direct3D 所欲使用的深度資訊。 Direct3D 將場景轉譯至目標表面時,可以使用相關深度緩衝區表面中的記憶體來做為工作區,以判斷已轉譯多邊形的像素如何相互遮蔽。 Direct3D 會使用畫面外的 Direct3D 表面做為最終色彩值的寫入目標。 與轉譯目標表面相關的深度轉譯區表面,則會用來儲存深度資訊,以告知 Direct3D 每個可見像素在場景中的深度。

當場景在深度緩衝啟用的情況下點陣化時,轉譯表面的每個點都會進行測試。 深度轉譯區的值可以是點的 Z 座標,或是投影空間中點 (x,y,z,w) 所在位置的同質 W 座標。 使用 Z 值的深度緩衝區通常也稱為 Z 緩衝區,而使用 W 值的緩衝區則稱為 W 緩衝區。 每個類型的深度緩衝區都有各自的優缺點,稍後我們會探討這個部分。

在測試開始時,深度緩衝區的深度值會設為場景所允許的最大值。 轉譯表面上的色彩值則會設為背景色彩值,或是位於該點之背景紋理的色彩值。 場景中的每個多邊形都會進行測試,以了解它是否會與轉譯表面上的目前座標 (x,y) 相交。

如果會相交,則目前點的深度值 (在 Z 緩衝區中為 Z 座標,在 W 緩衝區中則為 W 座標) 會進行測試,以了解該值是否小於儲存在深度緩衝區中的深度值。 如果多邊形值的深度較小,就會儲存在深度緩衝區中,而多邊形的色彩值則會寫入至轉譯表面上的目前點。 如果位於該點的多邊形有較大的深度值,清單中的下一個多邊形就會進行測試。 下圖顯示會顯示此一程序。

diagram of testing depth values

緩衝技術

雖然多數應用程式不會使用這項功能,您可以變更 Direct3D 用來判斷哪些值需配置在深度緩衝區和後續轉譯目標表面中的比較。 在部分硬體上,變更比較函式可能會停用階層式 Z 測試。

市面上絕大多數的加速器都支援 Z 緩衝,而這也讓 Z 緩衝區成為現行最常見的深度緩衝區類型。 雖然 Z 緩衝區無所不在,當中仍舊存在著多項缺點。 由於當中涉及數學,在 Z 緩衝區內產生的 Z 值通常不會在 Z 緩衝區範圍內平均分佈 (一般會介於 0.0 至 1.0 (含) 之間)。

具體而言,遠近裁剪平面之間的比例,會顯著影響 Z 值分佈狀態的不平均程度。 如果遠平面距離和近平面距離的比例為 100,則 90% 的深度緩衝區範圍會耗用在前 10% 的場景深度範圍上。 使用外部場景的典型娛樂或視覺模擬應用程式,往往需要介於 1,000 至 10,000 的遠平面/近平面比例。 若以 1,000 為比例,98% 的範圍會花費在前 2% 的深度範圍上,而比例越高,分佈就會更不平均。 這可能會導致距離較遠的物件中發生隱藏表面變形,特別在使用 16 位元深度緩衝區 (也就是最常受到支援的位元深度) 時更是如此。

相較之下,W 架構的深度緩衝區在遠近裁剪平面之間的分佈通常會比 Z 緩衝區更為平均。 此一情況的主要優點,在於遠近裁剪平面的距離比例將不再成為問題。 這樣一來,應用程式就能支援更大的範圍上限,同時獲得與目光接近且相對準確的深度緩衝。 W 架構的深度緩衝區並非完美無缺,有時可能會導致近處的物件發生隱藏表面變形。 W 緩衝方法的另一個缺點則與硬體支援相關:硬體對 W 緩衝的支援度並沒有 Z 緩衝那麼廣泛。

使用 Z 緩衝區會在轉譯期間造成額外的負荷。 在使用 Z 緩衝區時,許多技巧都可用來將轉譯最佳化。 在使用 Z 緩衝區和紋理期間,應用程式可確保場景會依循「從前方到後方」的轉譯順序,藉此提高效能。 經過紋理處理的 Z 緩衝原始物件會以掃描線條為基礎,對 Z 緩衝區進行預先測試。 如果掃描線條在先前轉譯的多邊形中遭到隱藏,系統就會快速且效率十足地加以拒絕。 Z 緩衝可改善效能,不過,當場景會多次繪製相同的像素時,這項技巧最能發揮效用。 上述作業很難精確計算,但您通常可以得到近似值。 如果相同像素的繪製次數少於兩次,您可以關閉 Z 緩衝,並使用「從後方到前方」的順序來轉譯場景,以獲得最理想的效能。

深度值的實際解譯為轉譯器所獨有。

深度和樣板緩衝區