XNA BlendState与SpriteBatch

时间:2012-05-04 14:13:21

标签: c# .net xna texture2d spritebatch

我们需要BlendState作为以下内容:

  • 按预期绘制透明PNG,保留其后的任何内容
  • 我们使用Color.White按原样绘制PNG
  • 我们将更改颜色的Alpha通道以更改纹理的“不透明度”

要获得此效果,BlendState.AlphaBlend已关闭,但如果我们将alpha设置为100或任何255以外的数字,则将白色绘制为透明部分。

所以我们尝试了这个:

        _blendState = new BlendState();
        _blendState.AlphaSourceBlend = Blend.SourceAlpha;
        _blendState.AlphaDestinationBlend = Blend.InverseSourceAlpha;
        _blendState.ColorSourceBlend = Blend.SourceAlpha;
        _blendState.ColorDestinationBlend = Blend.InverseSourceAlpha;

这是有效的,但如果两个PNG在彼此之上,我们现在会得到不希望的效果。基本上我们得到一些奇怪的线条,看起来像是添加了像素数据(或其他东西)。

示例:

enter image description here

实际上,BlendState.AlphaBlend就是这样:

        _blendState = new BlendState();
        _blendState.AlphaSourceBlend = Blend.SourceAlpha;
        _blendState.AlphaDestinationBlend = Blend.InverseSourceAlpha;
        _blendState.ColorSourceBlend = Blend.One;
        _blendState.ColorDestinationBlend = Blend.InverseSourceAlpha;

图片看起来比上面好:

enter image description here

但是然后alpha不起作用,使用100作为alpha将用白色替换背景。

我们应该使用什么BlendState来从SpriteBatch获得我们想要的效果?我们可以使用不同的颜色,例如Color.Black,还有另一种方法可以让它发挥作用。

* PS - 另一个不错的功能是如果我们可以使用Color.Red来“修饰”纹理,但我们希望它首先工作。

1 个答案:

答案 0 :(得分:1)

尝试为内容项目中的.png设置premultipliedAlphafalse

很遗憾,我不知道在使用Texture2d.FromStream()时如何解决此问题。