JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Colorkey in Surfaces ohne D3DX?

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 30.03.2005, 09:03    Titel: Colorkey in Surfaces ohne D3DX? Antworten mit Zitat

Hi,

da ich auch von D3DX "frei" sein will, wollte ich jetzt mal ein Surface aus einer Bitmap manuell laden. So das klappt auch, aber wo kann ich jetzt nen Colorkey angeben, der bei StretchRect berücksichtigt wird. Der Alphakanal wird ja ignoriert, mit D3DXCreateSurface.... gehts ja auch und die Funktion kann ja auch nicht zaubern Smile.
_________________
http://www.sieder25.org/ (Siedler 2 - Remake)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 30.03.2005, 10:30    Titel: Antworten mit Zitat

Hi,

leider ist meine Site defekt sonst würde ich darauf verweisen, deshalb poste ich einfach mal den Schnippsel daraus Smile

Falls man unter Direct3D Surfaces benutzt und möchte die nun Kopieren (z.B. in eine andere hinein), wird man feststellen, das überall dort wo ColorKey sein soll, nur noch eine schwarze Fläche ist. Das sind die Mankos der Funktion UpdateRects und CopyRects.

Eine schnelle Abhilfe schafft diese Funktion:
CPP:
long CopySurface (::RECT* rect_, ::IDirect3DSurface9* source, ::POINT* coords,
                  ::IDirect3DSurface9* dest, D3DCOLOR color = 0x00FF00FF, bool transparent = false)
{   
        // Beide Surfaces gültig?
    if (!source || !dest)
        return E_FAIL;

        // Informationen holen über die Quellsurface
    ::D3DSURFACE_DESC desc_source;

    if (source->GetDesc(&desc_source) != D3D_OK)
        return E_FAIL;

        // Abmessungen des Ausschnitts vom Quellsurface
    ::RECT rect_source;
        // Die Koordianten auf der Zielsurface
    ::POINT destPoint;

        // Haben wir übergebene Abmessungen? Wenn ja nehmen wir diese.
        // Ansonsten nehmen wir die kompletten Surfaceabmessungen
    if (rect_)
        rect_source = *rect_;
    else
        ::SetRect(&rect_source, 0, 0, desc_source.Width, desc_source.Height);

        // Haben wir Zielkoordianten erhalten? Wenn ja diese nehmen
        // Ansonsten sind die Koordianten: 0,0
    if (coords)
        destPoint = *coords;
    else
        destPoint.x = destPoint.y = 0;

        // Strukturen für die Speicherung der Informationen von der gelockten Surface
    ::D3DLOCKED_RECT locked_source;
    ::D3DLOCKED_RECT locked_dest;

        // Quellsurface locken
    if (source->LockRect (&locked_source, 0, D3DLOCK_READONLY) != D3D_OK)
        return E_FAIL;

        // Zielsurface locken
    if (dest->LockRect(&locked_dest, 0, 0) != D3D_OK)
    {
            // Es gab einen Fehler! Quellsurface freigeben
        if (source->UnlockRect() != D3D_OK)
            return E_FAIL;

        return E_FAIL;
    }

        // Pitch muss DWORD (unsigned long) Kompatibel sein
    locked_source.Pitch /= 4;
    locked_dest.Pitch   /= 4;

        // Pointer auf die Farbdaten holen
    unsigned long* data_source = static_cast<unsigned long*>(locked_source.pBits);
    unsigned long* data_dest   = static_cast<unsigned long*>(locked_dest.pBits);

        // Offset für Ziel und Quellsurface errechnen
    int offset_source = rect_source.top * locked_source.Pitch + rect_source.left;
    int offset_dest   =     destPoint.y * locked_dest.Pitch   + destPoint.x;

        // Jede Zeile und Spalte durchlaufen
    for (unsigned long y=0; y<static_cast<unsigned long>(rect_source.bottom); ++y)
    {
        for (unsigned long x=0; x<static_cast<unsigned long>(rect_source.right); ++x)
        {
                // Bei Transparenz Pixel testen, ansonsten blind kopieren
            if (((data_source[offset_source] != color) && transparent) || !transparent)
                    data_dest[offset_dest] = data_source[offset_source];

                // Nächsten Pixel auf der Zielsurface auswählen
                // und auf der Quellsurface
            ++offset_dest;
            ++offset_source;
        }

       
            // Offsets erweitern
        offset_source += locked_source.Pitch - rect_source.right;
        offset_dest   += locked_dest.Pitch - rect_source.right;
    }

        // Nach der Party aufräumen
    if (source->UnlockRect() != D3D_OK)
        return E_FAIL;

    if (dest->UnlockRect() != D3D_OK)
        return E_FAIL;

        // Und auf wiedersehen!
    return S_OK;
}
Wichtig: Wenn man den Colorkey definiert umbedingt den Alphawert auf 0 setzen und nicht auf 255! D3DCOLOR_XRGB setzt Alpha auf 255, deshalb D3DCOLOR_ARGB benutzen und Alpha auf 0 setzen, sonst wird der Colorkey nicht richtig ausgeführt!

edit: diese Funktion ist sogar viel schneller als die Standardfunktionen, denn die Basieren auf GDI
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 30.03.2005, 17:53    Titel: Antworten mit Zitat

Aber besagte Surfaces sind wie auch Patrick bereits mehrfach verkündete arschlahm Very Happy
Deshalb zeigt er auch in seinen Tuts wie man mithilfe einer orthogonalen Projektionsmatrix einfach eine Kamera nimmt und das Blatt Papier direkt davorhält Very Happy
_________________
"Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 30.03.2005, 17:55    Titel: Antworten mit Zitat

HomeLess_PunkDrummer
Richtig Smile

p.s.: Deine Metapha ist primitiv, aber äußerst zutreffend Very Happy
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 30.03.2005, 18:01    Titel: Antworten mit Zitat

Jaja, ich habe eine halbe Stunde darüber gebrütet Very Happy
_________________
"Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum