我们需要一个 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
用来“着色”纹理,但我们希望它首先能够正常工作。