2010-08-08 116 views
6

使深度緩衝區只讀的用法是什麼?我讀過紅皮書,你需要首先繪製不透明物體,然後是透明物體。我已經測試過了,並且還測試了兩個不透明的對象,結果很難解釋,並且我沒有發現使它成爲只讀的有用的東西。有人能解釋一下嗎?使深度緩衝區只讀

回答

7

這在某些情況下絕對有意義。這裏有兩個:

  1. 您可能會使用非常昂貴的像素着色器爲您的圖形。如果你這樣做,你想最大限度地減少需要陰影的像素數量。爲此,您可以先將場景渲染到深度緩衝區(禁止寫入顏色緩衝區)。然後,將深度緩衝區設置爲只讀,並將所有幾何體的顏色寫入啓用並將深度比較模式設置爲相等。這可以確保屏幕上的每個像素都被精確繪製一次,並且您仍然可以使用昂貴的像素着色器,同時仍保持良好的幀速率。

  2. 透明度問題:如果渲染透明(alpha-blended)三角形,則繪製順序會對最終圖像產生重大影響。爲了獲得好看的結果,嘗試和可信的方式是首先渲染所有不透明的幾何圖形。然後禁用寫入深度緩衝區並渲染所有透明的東西從後到前排序。這將確保您的透明多邊形總是按順序繪製,並且不會干擾不透明的東西。

試想一下這種情況:

  • 相機是在街頭場景,你是在尋找一個窗口,裏面鋪了一些不錯的東西的商店。

  • 您首先繪製透明窗口 - 啓用深度寫入。

  • 然後你畫車間的內部..由於Z緩衝所有像素將被丟棄,因爲顯卡認爲像素不可見。

  • 最終會出現一個完全錯誤的圖像:在...開始前的一個窗口...以及在開始渲染之前在您的圖形內存中的任何內容。

如上所述:爲了解決這個問題,首先將所有不透明的東西(商店內部)渲染爲深度測試和深度。然後,渲染窗口並進行深度測試並深度寫入。這將解決這個問題。

下面是一個這樣的事情是多麼醜陋的例子。它顯示了另一種處理透明度錯誤的方式(仔細觀察地毯)。

alt text

+0

感謝您的回答,對於關閉深度緩衝區的兩種場景都是健全的。 – pooya 2010-08-08 10:54:52

+0

在第二種情況下,關閉深度緩衝區不會改變任何東西,因爲您仍然對多邊形進行排序。 – Calvin1602 2010-08-08 17:57:13

+0

@calvin我知道。我試圖找到一張照片,顯示我正在談論的這個alpha-bugs,這張圖片是我發現的最好的(雖然不是正確的)..我甚至在我認爲的文字中這樣說過 – 2010-08-08 18:37:41