【问题标题】:Monogame sprite alpha blendingMonogame sprite alpha 混合
【发布时间】:2015-03-01 12:58:02
【问题描述】:

目前,我正在使用标准的 XNA/Monogame spritebatch.Draw() 函数绘制 2D 地形纹理网格。为了在相邻但不同的地形纹理之间有更平滑的过渡,我想在中心纹理周围的某个区域(比如 3x3)内混合纹理。相邻纹理越远,它对最终图像的影响应该越小。

例如,围绕 (1,1) 处的中心纹理的 (3x3) 加权矩阵 weight 可能如下所示:

0.3 0.5 0.3
0.5 1.0 0.5
0.3 0.5 0.3

基本上,一个简单的问题。但是,我目前对所提供的不同混合模式及其功能感到震惊。我最初的想法是只使用BlendState.AlphaBlend

spriteBatch.Draw(Tex2D, TargetRec, new Color(Color.White, weight[x,y] / SumOfWeights));

白色应该给我原始的纹理颜色,alpha 值weight[x,y] / SumOfWeights 最终会加起来为 1。相反,我得到的是一个非常明亮的图像加上背景。

将着色颜色设置为与 Alpha 通道值相同的灰色时,可以获得更好的结果。但是,当使用超过 2 个纹理时,背景会再次发光。

我的概念中一定存在系统性错误,但我暂时找不到。请指出我的错误并提前感谢。

【问题讨论】:

  • 我不确定您的问题是否正确。您想实现与旧 RTS 游戏中的“战争迷雾”类似的功能吗?
  • 应用程序没那么重要。暂时,我根本不了解 alpha 混合的过程。如果前景的组合 alpha(和色调颜色)值为 1.0f,为什么我仍然看到背景?
  • 首先想到的是 spritebatch 的初始化和绘制对象的顺序。您是在使用深度级别还是“先调用,先绘制”方法?
  • 你的精灵是预乘的吗?如果您不熟悉预乘的工作原理,那么 Alpha 通道将无法按照您的预期工作。如果你不知道你的精灵是否被预乘,那么它们可能不是。我相信monogame在使用SpriteBatch时默认需要预乘精灵。

标签: c# monogame alphablending spritebatch


【解决方案1】:

试试这个:

spriteBatch.Draw(Tex2D, TargetRec, Color.White * weight[x,y]);

当 SpriteBatch 使用预乘时,这是透明地绘制事物的正确方法。使用预乘法绘制时,Alpha 通道的工作方式不同。您需要进行的基本更改是将颜色乘以透明度,而不是设置颜色的 Alpha 通道。

这里有更多信息。 http://blogs.msdn.com/b/shawnhar/archive/2009/11/06/premultiplied-alpha.aspx

【讨论】:

    猜你喜欢
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2010-11-20
    相关资源
    最近更新 更多