如何在XNA 4.0中正确设置Alpha透明度?


14

好的,我已经阅读了几篇文章,教程以及与此有关的问题。大多数人都指向不能解决我的问题的相同技术。我需要能够创建半透明的精灵(确实是texture2D)并使其覆盖另一个精灵。

我可以通过找到的代码示例来实现这一点,但是我对结果不满意,而且我知道有办法做到这一点。在移动编程(BREW)中,我们采用老式方法,并在渲染之前实际检查了每个像素的透明度。

在这种情况下,似乎将其下方的精灵与其上方的alpha混合在一起。这可能是我如何渲染纹理的产物,但是,正如我之前说的,所有示例都指向这一技术。在继续之前,我将继续粘贴示例代码。

    public void Draw(SpriteBatch batch, Camera camera, float alpha)
    {
        int tileMapWidth = Width;
        int tileMapHeight = Height;

        batch.Begin(SpriteSortMode.Texture,
            BlendState.AlphaBlend,
            SamplerState.PointWrap,
            DepthStencilState.Default,
            RasterizerState.CullNone,
            null, camera.TransformMatrix);

        for (int x = 0; x < tileMapWidth; x++)
        {
            for (int y = 0; y < tileMapHeight; y++)
            {
                int tileIndex = _map[y, x];

                if (tileIndex != -1)
                {
                    Texture2D texture = _tileTextures[tileIndex];

                    batch.Draw(
                        texture,
                        new Rectangle(
                            (x * Engine.TileWidth),
                            (y * Engine.TileHeight),
                            Engine.TileWidth,
                            Engine.TileHeight),
                        new Color(new Vector4(1f, 1f, 1f, alpha )));
                }
            }
        }

        batch.End();

    }

如您所见,在这段代码中,我使用了重载的SpriteBatch.Begin方法,该方法除其他外还具有混合状态。我几乎肯定这是我的问题。我不想混合精灵,我希望它们在alpha为0时是透明的。在此示例中,我可以将alpha设置为0,但它仍会渲染两个图块,其中较低的z排序的精灵会显示通过,由于混合。这不是理想的效果,我希望更高的Z阶精灵逐渐淡出,而不以这种方式影响其下方的颜色。

我可能还不太熟悉,因为我对XNA开发还很陌生,因此如果我走错了兔子洞,可以随时引导我朝正确的方向发展。

TIA


为什么它是“适当的” alpha?有alpha支持,没有alpha支持,对吗?
共产主义鸭子

您应该可以通过按“编辑”来编辑标题,然后标题应位于顶部。除非有所改变。
共产党鸭子

Answers:


18

如果我正确解决了该问题,请尝试调用Begin with BlendState.NonPremultiplied。本文还可能有助于阐明Alpha混合在XNA中的工作方式:

https://web.archive.org/web/20130208130323/http://blogs.msdn.com/b/shawnhar/archive/2010/04/08/premultiplied-alpha-in-xna-game-studio-4- 0.aspx


是的,看起来NonPremultiplied可以解决问题(至少根据您发布的链接)。我要等一下,直到今晚回家后才能接受,但看来这就是答案。谢谢!
Soshimo 2011年

那是诀窍。我没意识到他们在4.0中更改了它。您链接的那篇文章很有说明性。谢谢。
Soshimo

1
+1谢谢!我只是在网上寻找原因,以找出为什么Alpha只能部分起作用。这解决了。我在Google上使用的术语是Spritebatch不透明度,希望这些术语现在可以帮助护目镜的人找到此答案。
AttackingHobo

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.