2011-03-14 41 views
0

我遇到了一個問題,試圖呈現多個alpha對象在彼此的頂部。此刻,如果我在另一個alpha對象頂部渲染一個alpha對象,則會顯示頂部alpha對象,但底部對象不會顯示,直到您經過/圍繞第一個對象。我試圖得到一個添加混合效果,所以頂層對象顯示在它後面還有另一個透明對象。你如何做到這一點在XNA? 我現在的渲染狀態設置爲:XNA呈現多個Alpha問題

RenderState rs = Globals.g_Device.RenderState; 
rs.AlphaBlendEnable = true; 
rs.BlendFunction = BlendFunction.Add; 
rs.DepthBufferFunction = CompareFunction.LessEqual; 
rs.DepthBufferEnable = true; 
rs.DepthBufferWriteEnable = true; 
Globals.g_Device.PresentationParameters.EnableAutoDepthStencil = true; 
Globals.g_Device.PresentationParameters.AutoDepthStencilFormat =  DepthFormat.Depth24Stencil8; 

回答

1

深度緩衝是這樣,它不會不管你呈現什麼樣的順序中的對象。如果你畫「下的」像素是什麼已經繪製,它只是跳過。如果您在屏幕上方繪製一個像素「上方」,它將被繪製並覆蓋屏幕上的內容(以及深度緩衝區,它提供了與下一個繪製的三角形進行比較的正確深度)。

不幸的是,這不適用於透明對象。如果您在場景的頂部繪製透明物體,則會將混合在可見場景中。但是沒有辦法混合深度,所以它只是覆蓋它。所以當你去繪製另一個「透明」下面的對象時,它會像平常一樣被跳過。

這裏是呈現包含透明物體的場景的一般過程:

  • 繪製不透明對象場景中的深度讀取和寫入打開。

  • Sort您的透明對象從後到前。

  • 繪製已排序的透明打開深度閱讀的對象。

當你這樣做,你的透明對象將被不透明的對象正確遮擋。但是,因爲它們被正確排序,所以透明對象將沒有機會遮蔽其他要繪製的透明對象。