Direct3D 9 (深度緩衝區)

深度緩衝區 (通常稱為 z 緩衝區或 w 緩衝區),是裝置屬性,用來儲存深度資訊供 Direct3D 使用。 當 Direct3D 將場景轉譯至目標表面時,它可以使用相關深度緩衝區表面中的記憶體做為工作區,來決定點陣化多邊形的像素如何彼此遮蓋。 Direct3D 使用螢幕外的 Direct3D 表面做為目標,將最終色彩值寫入其中。 與轉譯目標表面相關的深度緩衝區表面用來儲存深度資訊,告知 Direct3D 每一個可見像素在場景中的深度。

當場景點陣化並啟用深度緩衝處理時,轉譯表面上的每一個點都會經過測試。 深度緩衝區中的值可以是點的 z 座標,或其同質 w 座標,來自投射空間中點的 (x,y,z,w) 位置。 使用 z 值的深度緩衝區通常稱為 z 緩衝區,使用 w 值的則稱為 w 緩衝區。 每一種深度緩衝區都有優點和缺點,將於稍後討論。

在測試一開始,深度緩衝區中的深度值會設為場景的可能最大值。 轉譯表面上的色彩值會設為該點的背景色彩值或背景紋理的色彩值。 場景中的每個多邊形都會經過測試,查看是否與轉譯表面上目前的座標 (x,y) 交集。 如果這樣做,深度值 -這將會是 z 緩衝區中的 z 座標,而 w 座標則是在目前點測試,以查看其是否小於儲存在深度緩衝區中的深度值。 如果多邊形值的深度較小,它會儲存在深度緩衝區中,來自多邊形的色彩值會寫入轉譯表面上目前的點。 如果該點上多邊形的深度值較大,則會測試清單中下一個多邊形。 此程序顯示在下圖。

測試深度值的圖

注意

雖然大部分應用程式不會使用此功能,但是您可以變更 Direct3D 用來判斷哪些值位於深度緩衝區中的比較,以及後續的轉譯目標表面。 若要這樣做,請變更D3DRS_ZFUNC轉譯狀態的值。 在某些硬體上,變更比較功能可能會停用階層 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 緩衝區效能

注意

實際的深度值解譯為轉譯器特定。

 

本節提供使用深度緩衝區來移除隱藏線和隱藏表面的相關資訊。

Direct3D 轉譯