【问题标题】:XNA Alpha Blending to make part of a texture transparentXNA Alpha Blending 使纹理的一部分透明
【发布时间】:2010-04-17 01:09:04
【问题描述】:

我想做的是在 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。它融合了纹理,但这不是我想要的效果。

任何帮助将不胜感激。

【问题讨论】:

    标签: xna


    【解决方案1】:

    您要尝试的是 Alpha 通道遮罩。最简单的方法是使用内容管道烘焙 Alpha 通道。但是如果出于某种原因您想在运行时执行此操作,这里是(大致)使用渲染目标的方法(更好更快的解决方案是编写着色器)

    首先创建一个 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);
    

    将通道设置为仅 alpha,并绘制 alpha 蒙版

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

    您现在可以将渲染目标恢复到后台缓冲区并使用 Alpha 混合绘制纹理。

    maskedTexture = shadowRenderTarget.GetTexture();
    ...
    

    也别忘了恢复状态:

    GraphicsDevice.RenderState.ColorWriteChannels = ColorWriteChannels.All;
    ...
    

    【讨论】:

    • 感谢您的回答,这非常接近,但他们是一个问题。圆形纹理比背景纹理小,上面的代码发生的事情是背景只在圆形纹理存在的地方绘制。想法是在鼠标指针所在的地方绘制圆形纹理,用户可以通过圆形纹理所在的背景看到。
    • @David,如果您需要反转 Alpha 蒙版,请使用白色清除 Alpha 通道并使用黑色绘制圆圈。
    • 成功了,谢谢。我必须添加 GraphicsDevice.RenderState.DestinationBlend = Blend.Zero; GraphicsDevice.RenderState.SourceBlend = Blend.One;就在绘制圆圈以使其正常工作之前。我认为这是默认值,但在我设置它们之前它不起作用。感谢所有的帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2014-02-06
    • 2016-01-05
    相关资源
    最近更新 更多