【发布时间】:2012-05-04 14:13:20
【问题描述】:
我们需要一个 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 来“着色”纹理,那将是另一个不错的功能,但我们希望它首先能够正常工作。
【问题讨论】:
-
如果您使用
.AlphaSourceBlend = Blend.One和.AlphaDestinationBlend = Blend.Zero,您的第一个混合状态是否有效? -
似乎没有效果,看起来和我最上面的例子一样。如果我在
ColorSourceBlend上尝试Blend.One,它会在我的PNG 上为透明边缘呈现白色。 -
嗯.. 我尝试了混合状态,它对我有用。你有一个显示错误的小项目吗?
-
我会设置一个,我可以看到很难设置的地方。 (您必须有 2 个透明边缘相互重叠的 png)
-
您是否尝试将内容项目中的那些 .png 的 premultipliedAlpha 设置为 false?
标签: c# .net xna texture2d spritebatch