【问题标题】:Sprite Batch doesn't change AlphaSprite Batch 不会改变 Alpha
【发布时间】:2011-07-25 08:16:58
【问题描述】:

我遇到了一个问题,即 SpriteBatch 无法使用指定“Trail”的修改后的 Alpha 进行绘制。 我正在尝试做的是“淡化效果”,其中“项目”的 alpha 减小,因此它变得更加透明,直到最终被破坏。但是它不会改变它的alpha吗? alpha 确实降低了,但颜色的 alpha 值没有被修改,它保持相同的颜色,然后消失

会发生以下情况: http://dl.dropbox.com/u/14970061/Untitled.jpg

这就是我想要做的http://dl.dropbox.com/u/14970061/Untitled2.jpg

这是我目前正在使用的相关代码的截图。

spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
for (int i = 0; i < Trails.Count; i++)
{
    Trail Item = Trails[i];
    if (Item.alpha < 1)
    {
        Trails.RemoveAt(i);
        i--;
        continue;
    }

    Item.alpha -= 255 * (float)gameTime.ElapsedGameTime.TotalSeconds;
    Color color = new Color(255, 0, 0, Item.alpha);
    spriteBatch.Draw(simpleBullet, Item.position, color);
}
spriteBatch.End();

【问题讨论】:

    标签: c# xna draw alpha


    【解决方案1】:

    不要使用NonPremultiplied,如果没有必要! 保留为AlphaBlend。阅读Premultiplied Alpha 以及added in XNA 4.0 的情况。

    解决问题的正确方法是在颜色上使用乘法运算符:

    Color color = Color.Red * Item.alpha/255f;
    

    或使用等效的Lerp 函数将其插入透明度:

    Color color = Color.Lerp(Color.Red, Color.Transparent, Item.alpha/255f);
    

    (另外,如果您确实将混合状态更改为非预乘,要正确,您必须将内容导入更改为不预乘您的纹理,并确保您的内容在其透明边缘周围具有可混合数据。)

    【讨论】:

      【解决方案2】:

      确保您对spriteBatch.Begin() 的调用包含必要的参数:

      spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
      

      【讨论】:

      • 我只是忘了将它们包含在代码中。我对其进行了编辑以包含它。
      【解决方案3】:

      Alpha 范围在 1(完全不透明)和 0(完全透明)之间,我相信它也是一个浮点数。所以你超出了它的范围。

      编辑:尝试将其减少 0.1,如果小于或等于零,则将其删除

      【讨论】:

        【解决方案4】:

        事实证明它确实有效,我只是使用了错误的 BlendState,我切换到 BlendState.NonPremultiplied 现在它可以工作了。

        【讨论】:

        • 很高兴你找到了它。我查看了这段代码大概 20 分钟,并没有看到你的错误。我唯一能想到的可能是您没有清除屏幕,但最终一切都不会像您所说的那样消失。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-20
        相关资源
        最近更新 更多