2013-03-06 89 views
2

谷歌搜索很多,閱讀this very useful article,但仍然想知道我的項目的解決方案。此屏幕快照示出了我的問題完全:XNA/MonoGame:深度排序alpha混合UserPrimitives

Alpha Blend Problem

有2個對象:紅色物體它由2個四邊形,一個具有-1 z索引,而另一個爲1的z索引。兩個四邊形都有Color.Red * 0.5f。首先繪製。另一個對象是z-index爲0的玩家。獲取第二個

因爲我想讓玩家在四邊形之間移動,所以我將DepthStencilState設置爲DepthStencilState.Default;,但是它提供了以下圖像。玩家的像素被忽略,因爲它前面有一個對象。

我把我所有的原語按照this class分成一個大的DrawUserPrimitive。這個問題的最佳解決方案是什麼?我是否需要根據z-index對三角形進行排序(以及我將如何實現;是否昂貴?)還是有其他解決方案?

回答

3

你只需要做什麼that article說。這裏被列爲「最常見的方法」,更新的XNA 4章:

  1. 設置GraphicsDevice.DepthStencilState = DepthStencilState.Default
  2. 繪製所有不透明幾何
  3. 從相機設置的距離GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead
  4. 排序alpha混合對象,然後從後到前依次繪製它們

如果您的透明對象或多或少凸起,那麼您不需要對三角形進行排序 - 只需將對象自己 - 只要你使用RasterizerState.CullCounterClockwise(即:背面剔除,默認)。

您必須這樣做的原因是深度緩衝區只能存儲單個值 - 即最頂端像素的值。沒有在這個深度下繪製「概念」的概念。要做到這一點所需的數據(在該像素處Z-index上方和下方繪製的對象的顏色)已經被混合到最終圖像中,並且不能被提取。

+0

謝謝!所以我想我必須對物體進行排序。雖然我認爲使用剔除不會有幫助,因爲我的形狀太基本,並且包含的​​三角形太少,99%的時間這些三角形只是部分可見。我會去分揀,但我仍然必須找出如何(例如分解紅色對象2),但我會管理。任何提示或文章非常歡迎! – kapser 2013-03-06 15:58:56

+0

即使對於單個半透明模型(因此:與排序或Z緩衝區無關),您需要執行背面剔除以獲得正確的渲染結果。如果你不這樣做,那麼背面可以繪製在正面的頂部(取決於三角形順序和相機方向)。當然,這隻會畫出模型的正面,所以如果你希望正面和背面都可見(這會使它看起來更像一個空心物體而不是堅實的物體),那麼你必須以兩遍(正面撲殺,然後背面撲殺)。 – 2013-03-06 18:02:58

+0

(需要說明的是 - 背面剔除要求適用於3D凸形 - 就像一個立方體或一個球體,而不是四邊形(有點難以分辨您在屏幕截圖中渲染的內容),基本上它是一種廉價的方式以每個模型爲基礎對三角形進行排序,而不實際對它們進行排序。) – 2013-03-06 18:06:50