我们需要一个 BlendState 来充当以下角色:
- 透明 PNG 按预期绘制,保留其后面的任何内容
- We use
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 相互叠置,我们现在会得到不想要的效果。基本上我们得到了一些奇怪的线条,看起来像是正在添加像素数据(或其他东西)。
Example:
有效地,BlendState.AlphaBlend
这是:
_blendState = new BlendState();
_blendState.AlphaSourceBlend = Blend.SourceAlpha;
_blendState.AlphaDestinationBlend = Blend.InverseSourceAlpha;
_blendState.ColorSourceBlend = Blend.One;
_blendState.ColorDestinationBlend = Blend.InverseSourceAlpha;
图像看起来比上面更好:
但是 Alpha 不起作用,使用 100 作为 Alpha 会将背景替换为白色。
What BlendState
我们应该使用 SpriteBatch 来获得我们想要的效果吗?我们可以使用不同的颜色,例如Color.Black
还有另一种方法可以让它发挥作用。
*PS - 另一个不错的功能是如果我们可以使用Color.Red
对纹理进行“着色”,但我们希望它首先能够正常工作。
尝试设置premultipliedAlpha
to false
对于您的内容项目中的那些 .png。
不幸的是,我不知道在使用时如何解决这个问题Texture2d.FromStream()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)