2010-04-17 104 views
8

我想要做的是在XNA中使用alpha混合,使繪製的紋理的一部分透明。舉例來說,我將屏幕清除爲某種顏色,可以說Blue。然後我畫一個紅色的紋理。最後,我繪製出的紋理只是從中心完全透明到邊緣完全黑色的徑向漸變。我想要的是先前繪製的紅色紋理在徑向漸變紋理的相同位置是透明的。所以你應該能夠通過紅色紋理看到藍色的背景。XNA Alpha混合使紋理的一部分透明

我認爲這會奏效。

GraphicsDevice.Clear(Color.CornflowerBlue); 

spriteBatch.Begin(SpriteBlendMode.None); 
spriteBatch.Draw(bg, new Vector2(0, 0), Color.White); 
spriteBatch.End(); 

spriteBatch.Begin(SpriteBlendMode.None); 

GraphicsDevice.RenderState.AlphaBlendEnable = true; 
GraphicsDevice.RenderState.AlphaSourceBlend = Blend.One; 
GraphicsDevice.RenderState.AlphaDestinationBlend = Blend.Zero; 
GraphicsDevice.RenderState.SourceBlend = Blend.Zero; 
GraphicsDevice.RenderState.DestinationBlend = Blend.One; 
GraphicsDevice.RenderState.BlendFunction = BlendFunction.Add; 

spriteBatch.Draw(circle, new Vector2(0, 0), Color.White); 
spriteBatch.End(); 

GraphicsDevice.RenderState.AlphaBlendEnable = false; 

但它似乎忽略了我所有的RenderState設置。我也嘗試將SpriteBlendMode設置爲AlphaBlend。它融合了紋理,但這不是我想要的效果。

任何幫助,將不勝感激。

回答

6

你想要的是alpha通道屏蔽。最簡單的方法是使用內容管道來烘烤alpha通道。但是,如果由於某種原因,你要在運行時做這裏是如何(大約)使用渲染目標(A更好,更快的解決辦法是寫一個着色器)

首先創建一個RenderTarget2D存儲和中間蒙面質感

RenderTarget2D maskRenderTarget = GfxComponent.CreateRenderTarget(GraphicsDevice, 
    1, SurfaceFormat.Single); 

設置渲染目標和設備狀態

GraphicsDevice.SetRenderTarget(0, maskRenderTarget); 
GraphicsDevice.RenderState.AlphaBlendEnable = true; 
GraphicsDevice.RenderState.DestinationBlend = Blend.Zero; 
GraphicsDevice.RenderState.SourceBlend = Blend.One; 

設置頻道寫入到R,G,B信道和使用子畫面批次

繪製第一紋理只有個
GraphicsDevice.RenderState.ColorWriteChannels = ColorWriteChannels.Red | ColorWriteChannels.Green | ColorWriteChannels.Blue; 
spriteBatch.Draw(bg, new Vector2(0, 0), Color.White); 

設置通道α,並繪製阿爾法遮掩

GraphicsDevice.RenderState.ColorWriteChannels = ColorWriteChannels.Alpha; 
spriteBatch.Draw(circle, new Vector2(0, 0), Color.White); 

你現在可以渲染目標恢復到後臺緩衝區,並使用alpha混合繪製你的紋理。

maskedTexture = shadowRenderTarget.GetTexture(); 
... 

而且不要忘了恢復狀態:

GraphicsDevice.RenderState.ColorWriteChannels = ColorWriteChannels.All; 
... 
+0

感謝您的回答,這是非常接近的,但他們是一個問題。圓形紋理比背景紋理小,以上代碼發生的情況是僅在圓形紋理存在的地方繪製背景。這個想法是在鼠標指針所在的地方繪製圓形紋理,並且用戶可以看到圓形紋理所在的背景。 – DangerMouse 2010-04-19 02:00:58

+0

@大衛,如果你需要反轉阿爾法面具使用白色清除阿爾法通道,並使用黑色繪製圓圈。 – 2010-04-19 10:24:01

+0

它的工作表示感謝。 我不得不添加 GraphicsDevice.RenderState.DestinationBlend = Blend.Zero; GraphicsDevice.RenderState.SourceBlend = Blend.One; 就在繪製圓之前讓它工作。我認爲這是默認值,但它沒有工作,直到我設置它們。 感謝您的幫助。 – DangerMouse 2010-04-19 23:45:34