[DDraw] Farben vermischen



  • Hallöchen,
    ich möchte schönen Rauch darstellen, dazu hab ich ein Bitmap mit ner Rauchwolke und ich würde es gern so blitten, dass sich die Farbe mit dem Untergrund vermischt, so dass man durch die Rauchwolke halbwegs durchsehen kann.
    Ich weiß, dass is ne Wunschvorstellung von mir, und das wird sicher nicht so einfach gehen, aber ich brauch mal nen Ansatz dafür.
    Im Moment behelf ich mir damit, dass nur jeder zweite Pixel gezeichnet wird, so dass das Ganze dem schon ungefähr nahe kommt, aber glücklich bin ich damit nicht:

    void DUST::Draw()
    {
        // Zeichenposition berechnen:
        int drawX = Pos.x - scrollX - dustPictureSize[type]/2;
        int drawY = Pos.y - scrollY - dustPictureSize[type]/2;
        drawX /= 2; drawX *= 2;
        drawY /= 2; drawY *= 2;
        SetRect(&SrcRect, 0, 0, dustPictureSize[type], dustPictureSize[type]);
    
        // Clipping:
    [...]
    
        // Jetzt wird geblittet:
        try
        {
            BackBuffer->BltFast(drawX, drawY, DustSurface[type][aniStep], &SrcRect, DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
        }
        catch (...)
        {
            MessageBox(NULL, "Dust[i].Draw()", "Aua!", 0);
            return;
        }
    }
    

    Anmerkung: Das Bild hat jeden zweiten Pixel auf die ColorKey-Farbe gesetzt.

    Danke schon mal im Voraus.



  • Alphablending?! 😕



  • Setze bei deinen Colorkey einfach das letzte Byte auf die gewünschte Tranzparenz

    also:
    0xaarrggbb

    aa - tranzparenz
    rr - rot anteil
    gg - grün anteil
    bb - blau anteil



  • Sorry bin da noch n00b...
    Ich dachte, alles was ColorKey ist, wird beim Blitten komplett weggelassen. Ich erstelle meinen ColorKey so:

    void AddColorKey (LPDIRECTDRAWSURFACE7 Surface, DWORD Key)
    {
       DDCOLORKEY key;
       ZeroMemory(&key, sizeof(key));
       key.dwColorSpaceLowValue = Key;
       key.dwColorSpaceHighValue = Key;
       Surface->SetColorKey (DDCKEY_SRCBLT, &key);
    }
    

    Wie krieg ich jetzt das letzte Byte?



  • Bin mir nicht sicher ob ichs richtig verstanden hab:

    DWORD alpha = 128; //halbtransparent
    
    Key &= 0x00ffffff; // alphawert des Keys auf 0 setzen
    Key |= (alpha<<24); // neuen alphawert einfügen
    

    Wobei ich bisher immer der meinung war dass der colorkey komplett ausgeblendet wird und halbtransparentz gar nicht geht...naja die ddraw-zeiten hab ich eh hinter mir.



  • Wobei ich bisher immer der meinung war dass der colorkey komplett ausgeblendet wird und halbtransparentz gar nicht geht

    Jo der Meinung war ich eigentlich auch, aber ich probiers ma 🙂



  • Original erstellt von 0x00000001:
    ...halbtransparenz gar nicht geht...

    Genauso ist es.



  • Ne is immer noch total durchsichtig. Ich versteh auch net so ganz was des mit dem ColorKey zu tun haben soll, ich will ja das ganze Bild so halbdurchlässig blitten und nicht nur die ColorKey-Farbe.

    void AddColorKey (LPDIRECTDRAWSURFACE7 Surface, DWORD color)
    {
        DWORD alpha = 128; //halbtransparent
    
        color &= 0x00ffffff; // alphawert des Keys auf 0 setzen
        color |= (alpha<<24); // neuen alphawert einfügen}
    
        DDCOLORKEY key;
        ZeroMemory(&key, sizeof(key));
        key.dwColorSpaceLowValue = color;
        key.dwColorSpaceHighValue = color;
        Surface->SetColorKey (DDCKEY_SRCBLT, &key);
    }
    


  • Original erstellt von Optimizer:
    ich will ja das ganze Bild so halbdurchlässig blitten

    Das geht unter DirectDraw aber nicht - jedenfalls nicht mit Hardwarebeschleunigung. Entweder schreibst Du Dir eine Software-Routine dafür oder Du verwendest Direct3D...



  • Hmmmm dann kann ich ja gleich DirectGraphics lernen 😢


Anmelden zum Antworten