我想要做的是在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;
Run Code Online (Sandbox Code Playgroud)
但它似乎忽略了我所有的RenderState设置.我也尝试将SpriteBlendMode设置为AlphaBlend.它融合了纹理,但这不是我想要的效果.
任何帮助,将不胜感激.
你想要的是alpha通道屏蔽.最简单的方法是使用内容管道烘焙alpha通道.但是如果出于某种原因你想在运行时这样做(大致)如何使用渲染目标(更好更快的解决方案是编写着色器)
首先创建一个RenderTarget2D来存储和中间屏蔽纹理
RenderTarget2D maskRenderTarget = GfxComponent.CreateRenderTarget(GraphicsDevice,
1, SurfaceFormat.Single);
Run Code Online (Sandbox Code Playgroud)
设置renderTarget和设备状态
GraphicsDevice.SetRenderTarget(0, maskRenderTarget);
GraphicsDevice.RenderState.AlphaBlendEnable = true;
GraphicsDevice.RenderState.DestinationBlend = Blend.Zero;
GraphicsDevice.RenderState.SourceBlend = Blend.One;
Run Code Online (Sandbox Code Playgroud)
设置通道以写入R,G,B通道,并使用精灵批处理绘制第一个纹理
GraphicsDevice.RenderState.ColorWriteChannels = ColorWriteChannels.Red | ColorWriteChannels.Green | ColorWriteChannels.Blue;
spriteBatch.Draw(bg, new Vector2(0, 0), Color.White);
Run Code Online (Sandbox Code Playgroud)
将通道设置为仅alpha,并绘制alpha蒙版
GraphicsDevice.RenderState.ColorWriteChannels = ColorWriteChannels.Alpha;
spriteBatch.Draw(circle, new Vector2(0, 0), Color.White);
Run Code Online (Sandbox Code Playgroud)
您现在可以将渲染目标还原到后缓冲区并使用Alpha混合绘制纹理.
maskedTexture = shadowRenderTarget.GetTexture();
...
Run Code Online (Sandbox Code Playgroud)
另外别忘了恢复状态:
GraphicsDevice.RenderState.ColorWriteChannels = ColorWriteChannels.All;
...
Run Code Online (Sandbox Code Playgroud)