1

我们需要一个 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 相互重叠,我们现在会得到不希望的效果。基本上我们会得到一些奇怪的线条,看起来像是在添加像素数据(或其他东西)。

例子:

在此处输入图像描述

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

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

图像看起来比上面更好:

在此处输入图像描述

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

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

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

4

1 回答 1

1

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

不幸的是,我不知道在使用Texture2d.FromStream().

于 2012-05-05T21:04:31.830 回答