2013-02-05 31 views
1

我正在顯示BasicEffect的許多實例,每個實例都是一個「板」,隨機選擇四個紋理之一,部分透明或完全不透明。XNA中的深度緩衝區和alpha問題

我遇到的問題是,當透明板被渲染時,只有已經渲染的板顯示透過它。

很難解釋如何顯示所有東西,所以here is the image

有沒有一種解決方案比以正確的順序渲染更簡單?

+0

許多'BasicEffect'實例?您可能可以重新使用單個實例。 –

+0

@Andrew我打算動態生成地形,所以如果我的想法正確,我將不得不更新整個VertexBuffer,如果一個垂直會發生變化。對於在屏幕截圖中顯示的幾何圖形來說可以,但對於我的情況可能不會。請告訴我,如果我錯過了什麼,我是新來的XNA。 – Sebi

+0

效果和頂點緩衝區是獨立的。您可以有多個緩衝區並使用該效果的單個實例。如果您經常修改頂點緩衝區,請考慮使用'DynamicVertexBuffer' –

回答

2

深度緩衝區存儲在該位置繪製的最頂部像素的「深度」。當您嘗試在該位置繪製另一個像素時,如果其深度值高於當前在緩衝區中的值,它將被繪製到顏色緩衝區,其深度值將替換深度緩衝區中的值。但是,如果另一個像素伴隨深度值低於緩衝區中的內容 - 它未繪製並且深度緩衝區中的值保持不變。

這樣做的結果是深度緩衝區不能像預期的那樣使用透明像素。透明像素可能只會導致顏色緩衝區的部分更改 - 但它會完全替換深度緩衝區中的值。沒有辦法在它下面畫「下」。

有兩種方法來解決這個問題:

你可以使用alpha測試,這將導致透明像素完全不被渲染(而不是改變深度緩衝)。這允許幾何圖形通過透明區域顯示,與繪製順序無關。缺點是,這不適用於抗鋸齒(有關抗鋸齒選項here的良好討論)。

或者你可以按照先後順序排序幾何圖形。如果先繪製不透明幾何體,則只需對透明幾何體進行排序。

+0

謝謝您的全面解釋,現在一切都清楚了。非常感謝 :) – Sebi