XNA 4.0でアルファ透明度を適切に行う方法


14

さて、これに関するいくつかの記事、チュートリアル、質問を読みました。ほとんどは、私の問題を解決しない同じテクニックを指します。半透明のスプライト(texture2Dの本当に)を作成し、それらを別のスプライトにオーバーレイする機能が必要です。

私が見つけたコードサンプルでそれをいくらか達成することはできますが、結果に満足しておらず、これを行う方法があることを知っています。モバイルプログラミング(BREW)では、私たちは古いやり方で、レンダリングの前に各ピクセルの透明度を実際にチェックしました。

この場合、その下のスプライトをその上のアルファとブレンドしてレンダリングするようです。これは、テクスチャをどのようにレンダリングするかによるアーティファクトかもしれませんが、前述したように、すべての例はこの1つのテクニックを指し示しています。先に進む前に、サンプルコードを貼り付けます。

    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メソッドを使用しています。これは、とりわけブレンド状態を取得します。私はそれが私の問題だとほぼ肯定的です。スプライトをブレンドしたくない、アルファが0のときに透明にしたい。この例では、アルファを0に設定できますが、下のz順序のスプライトが透けて見えるため、両方のタイルをレンダリングします。ブレンド。これは望ましい効果ではありません。より高いzオーダーのスプライトをフェードアウトさせ、そのような方法でその下の色に影響を与えないようにします。

私はXNA開発にかなり慣れていないので、ここから離れるかもしれません。間違ったウサギの穴を下る場合は、遠慮なく正しい方向に進んでください。

TIA


なぜ「適切な」アルファですか?アルファサポートはありますが、アルファサポートはありませんか?
共産主義のダック

「編集」を押してタイトルを編集できれば、タイトルが一番上になります。何かが変更されない限り。
共産主義のダック

回答:


18

問題を正しく追跡する場合、BlendState.NonPremultipliedでBeginを呼び出してみてください。この記事は、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

それがトリックでした。4.0で変更されたことに気付きませんでした。あなたがリンクしたその記事は非常に説明的でした。ありがとうございました。
-Soshimo

1
+1ありがとう!私は、アルファが部分的にしか機能していない理由を解明しようとしてオンラインで探していました。これで解決しました。私がグーグルで使っていた用語はSpritebatch Opacityでしたが、ゴーグルがこの答えを見つけるのに役立つことを願っています。
攻撃

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.