[D3D] Mehrfach-Alphablending



  • Nabend,

    ich würde meine Rauch-Billboards gerne am Ende ihres Lebens langsam ausblenden lassen dass sie nicht einfach so verschwinden.
    Ich habe versucht, den vier Vertices von jedem Billboard einen Diffuse-Wert zu verpassen, inkl. Alpha Kanal. Die Farbe ändert sich zwar, aber der Alpha-Wert der Farbe wird nicht berücksichtigt.
    Ich habe versucht mittels SetTextureStageState 'D3DTSS_ALPHAARG2' auf 'D3DTA_DIFFUSE' zu setzen, ohne Auswirkung.

    Hier mal die Rendereinstellungen:

    // Je dunkler der Rauch, desto transparenter:
            g_lpD3DDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCCOLOR);
            g_lpD3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCCOLOR);
    
                // bringt nix:
            g_lpD3DDevice->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_DIFFUSE);
    
                // hab ich deaktiviert damit der Diffuse-Wert arbeitet:
            g_lpD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    

    Was muss ich einstellen dass ich die Transparentz unabhängig von der Textur verstellen kann?



  • Hi,

    // erstes argument ist die textur
    SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
    
    // zweites argument die vertex farbe
    SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
    
    // operation ist zusammenmodulieren
    SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
    
    // blend werte aus den alpha anteilen nehmen
    SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    

    Jetzt wird der Alphawert aus der Farbe der Vertices verwendet. Nach dem Rendern nicht vergessen auf Defaults zurück zu stellen. Alphaarg2 ist dabei D3DTA_CURRENT und die operation ist D3DTOP_SELECTARG1.

    Ciao,
    Stefan



  • Vielen Dank, so wie Du geschrieben hast funktioniert das (was auch sonst 😃 )

    Wenn ich aber anstatt

    SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

    das hier nehme

    SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCCOLOR);
    SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCCOLOR);

    geht es leider nicht.

    Gibt es da eine Lösung für? Ich wollte nämlich nur 24Bit Bilder nehmen um Platz zu sparen, wenn es aber nicht geht ist es ok, mach ich den Alpha Kanal halt noch dazu.

    Danke nochmals 🙂



  • Hi,

    das hat mit dem Bild nichts zu tun, schliesslich kommt der Alpha-Channel aus der Vertex-Farbe und nicht aus der Textur. 🙂

    Ciao,
    Stefan



  • Doch, ich wollte dass die Transparentz von der Farbe des Bildes UND dem Alpha-Kanal der Vertice-Farbe abhängig ist.

    Kann auch sein ich verpeil grade alles, aber auf jeden Fall hab ich jetzt das gewünschte Ergebnis: Schön qualmender und sich sanft auflösender Rauch 🙂



  • Hi,

    und was hast Du nun geändert damit es funktioniert?

    Ciao,
    Stefan



  • Ich hab die Textur-Stages exakt so eingestllt wie Du oben geschrieben hast und hab der Textur (also der Datei) einen Alphakanal verpasst. Sind ja nur ein paar kb mehr und im Arbeitsspeicher belegt es eh immer 32Bit/Pixel, also kann ich damit leben.



  • 🙂


Anmelden zum Antworten