C# Monogame - premultiplied alpha

本文关键字:alpha premultiplied Monogame | 更新日期: 2023-09-27 18:05:49

我需要一个淡出效果在我的屏幕之间的过渡。我在网上看到,XNA 3的alpha混合旧方法已被弃用,应该使用XNA 4的预乘alpha。所以我用的是Monogame我假设代码是一样的但你能解释一下这个预乘法吗?另外一个代码示例兼容我自己的代码将是伟大的!以下是其中一些:

// Variables
private Texture2D image;
private Vector2 imagePosition;
private Color startColour;
private Color endColour;
private float alpha;
// Constructor
public myClass()
{
    startColour = new Color(0.0f, 0.0f, 0.0f, 0.0f);
    endColour = new Color(255.0f, 255.0f, 255.0f, 255.0f);
    alpha = 0.0f;
}
// Update method
public void Update(GameTime gameTime)
{
    // ??????
}
// Draw method
public void Draw(SpriteBatch spriteBatch)
{
    spriteBatch.Begin();
    spriteBatch.Draw(image, imagePos, startColour * alpha); // ???
    spriteBatch.End();
}

我相信大部分代码都在那里,但我仍然需要更新alpha,将其从0更改为1,或者这是如何从白色淡出?我想从白色变成不透明。那么你该怎么做呢?我的Update()方法中应该有什么代码,我应该如何更改当前的代码?

C# Monogame - premultiplied alpha

这应该是相当简单的,如果我理解正确的话,你试图从白色到无。

public myClass()
{
    ...
    alpha = 1.0f; // I'm almost sure that 1 means solid
}    
public void Update(GameTime gameTime)
{
    if (alpha > 0.0f) alpha -= 0.01f;
}

考虑到Update()每帧被调用,这意味着默认情况下每秒60次(在当前的单游戏版本中),所以你必须调整0.01f的小数点位置以使其尽可能快。

你也可以在spriteBatch.draw中使用Color.White * alpha。你需要把所有在(上面)之前出现的东西的绘图称为"窗帘"的绘图。