2011-06-10 66 views
0

我在圖形設備上的BlendState正常工作並正確顯示Alpha混合時遇到問題。XNA 4.0中的設備AlphaBlend狀態

Render Output

在某些情況下,你可以通過其他的葉子看到葉子,你不能等情況。而後備箱也總是被遮擋。我試過很多不同的BlendState設置組合。目前,它看起來像這樣:

 GraphicsDevice.DepthStencilState = DepthStencilState.Default; 
     GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise; 
     //GraphicsDevice.BlendState = BlendState.AlphaBlend; 
     GraphicsDevice.BlendState = new BlendState() 
     { 
      AlphaBlendFunction = BlendFunction.Add, 
      AlphaDestinationBlend = Blend.InverseSourceAlpha, 
      AlphaSourceBlend = Blend.One, 
      BlendFactor = new Color(1.0F, 1.0F, 1.0F, 1.0F), 
      ColorBlendFunction = BlendFunction.Add, 
      ColorDestinationBlend = Blend.InverseSourceAlpha, 
      ColorSourceBlend = Blend.One, 
      ColorWriteChannels = ColorWriteChannels.All, 
      ColorWriteChannels1 = ColorWriteChannels.All, 
      ColorWriteChannels2 = ColorWriteChannels.All, 
      ColorWriteChannels3 = ColorWriteChannels.All, 
      MultiSampleMask = -1 
     }; 

的着色器代碼如下:

浮子阿爾法= 1.0F; if(HasAlphaTexture) alpha = tex2D(AlphaSampler,IN.UV).xyz;

// ... // 確定顏色值等。 /// ...

返回個float4(result.xyz,阿爾法);

我使用的是這種情況的地圖如下所示: Opacity Map Diffuse/Color Map

回答

4

首先,你想要麼排序幾何體或使用alpha測試,因爲你不能結合Z緩存的(又名:深度緩衝)基於透明度的渲染。沒有辦法「混合」一個Z-buffer值 - 所以它總是使用最高值,即使當你渲染的顏色是透明的時候也會阻擋背後的東西。

看一看this articleand this one for a word on quality)。這將解決你的幾何問題,有時不會出現在某個透明幾何體的背後。

混合狀態的問題在於,您正在使用未預乘的數據進行預乘混合。

See this article for an explanation of premultiplied alpha。這是made the default in XNA 4.0

當你預乘,你通過你的alpha值擴展您的顏色值(RGB)(即:你他們),然後混合它們(即:)。

所以有兩種可能的解決方案:您可以使用BlendState.NonPremultiplied。但左乘具有益處(如在該aritcle解釋),因此更好的解決方案是在着色器像這樣執行乘法運算:

return float4(result.xyz * alpha, alpha); 

當然,優選的是,簡單地使用單個紋理的α信道如果這是可能的話。如果您無法使用您的繪畫工具合併Alpha通道,則可以使用XNA內容管道將兩個紋理合並,並在構建期間執行預乘。默認情況下,默認的內容管道紋理導入器執行預乘。

+0

謝謝安德魯。非常感激。 – helloserve 2011-06-11 11:44:19