【问题标题】:XNA BlendState with SpriteBatchXNA BlendState 与 SpriteBatch
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 无论如何,谢谢,希望我针对 MonoGame 的新问题可能有答案。我怀疑同样的事情会解决它,因为 MonoGame 只是从文件中加载 PNG。 (虽然我可能会尝试使用从内容项目编译的 XNB)
  • 嘿乔纳森,我刚碰到这个,它解决了从带有 alpha 通道信息的文件加载纹理的问题(类似于Texture2D.FromStream(),只有 alpha):gamedev.stackexchange.com/questions/25786/…
  • 谢谢,这是一个很棒的帖子。看起来有点慢,但在 Windows 上没问题,因为它只会出现在我的“关卡查看器”中,而不是实际的游戏中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多