Come posso eseguire correttamente la trasparenza Alpha in XNA 4.0?


14

Ok, ho letto diversi articoli, tutorial e domande a riguardo. Molti indicano la stessa tecnica che non risolve il mio problema. Ho bisogno della capacità di creare sprite semitrasparenti (in realtà le texture2D) e farle sovrapporre a un altro sprite.

Posso ottenerlo in qualche modo con gli esempi di codice che ho trovato, ma non sono soddisfatto dei risultati e so che esiste un modo per farlo. Nella programmazione mobile (BREW) l'abbiamo fatto alla vecchia scuola e abbiamo effettivamente controllato la trasparenza di ogni pixel prima del rendering.

In questo caso sembra rendere lo sprite sotto di esso mescolato con l'alfa sopra di esso. Questo potrebbe essere un artefatto di come sto renderizzando la trama ma, come ho già detto, tutti gli esempi indicano questa tecnica. Prima di andare oltre, vado avanti e incolerò il mio codice di esempio.

    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();

    }

Come puoi vedere, in questo codice sto usando il metodo SpriteBatch.Begin sovraccarico che prende, tra le altre cose, uno stato di fusione. Sono quasi sicuro che sia un mio problema. Non voglio BLENDARE gli sprite, voglio che siano trasparenti quando l'alfa è 0. In questo esempio posso impostare l'alfa su 0 ma rende comunque entrambi i riquadri, con lo sprite ordinato z inferiore che appare attraverso, scolorito a causa del miscelazione. Questo non è l'effetto desiderato, voglio che lo sprite più alto in ordine z sbiadisca e non abbia l'effetto del colore sottostante in tale maniera.

Potrei essere molto lontano da qui dato che sono abbastanza nuovo nello sviluppo di XNA, quindi sentiti libero di guidarmi nella direzione corretta nel caso in cui vado nella tana del coniglio sbagliata.

TIA


Perché è l'alfa "corretta"? C'è il supporto alfa e nessun supporto alfa, giusto?
Il comunista Duck il

Dovresti essere in grado di modificare il titolo premendo 'modifica' e il titolo dovrebbe essere in alto. A meno che qualcosa non sia cambiato.
Il comunista Duck il

Risposte:


18

Se seguo correttamente il problema, prova a chiamare Inizia con BlendState.NonPremultiplied. Questo articolo può anche aiutare a far luce su come funziona la fusione alfa in 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


Sì, sembra che il NonPremultiplied farà il trucco (almeno in base al link che hai pubblicato). Aspetterò e vedrò se funziona quando torno a casa stasera prima di accettare, ma sembra che questa sia la risposta. Grazie!
Soshimo,

quello era il trucco. Non mi ero reso conto che l'hanno cambiato in 4.0. L'articolo che hai collegato è stato molto illustrativo. Grazie.
Soshimo

1
+1 Grazie! Stavo solo guardando online cercando di capire perché l'alfa funzionasse solo parzialmente. Questo ha risolto. I termini che stavo usando su Google erano Spritebatch Opacity, spero che quei termini ora possano aiutare i goggler a trovare questa risposta.
Attaccando

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.