 |
JLI Spieleprogrammierung
|
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
|
Verfasst am: 30.03.2005, 09:03 Titel: Colorkey in Surfaces ohne D3DX? |
|
|
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 . _________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 30.03.2005, 10:30 Titel: |
|
|
Hi,
leider ist meine Site defekt sonst würde ich darauf verweisen, deshalb poste ich einfach mal den Schnippsel daraus
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 |
|
 |
HomeLess_PunkDrummer JLI Master Trainee

Alter: 36 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 30.03.2005, 17:53 Titel: |
|
|
Aber besagte Surfaces sind wie auch Patrick bereits mehrfach verkündete arschlahm
Deshalb zeigt er auch in seinen Tuts wie man mithilfe einer orthogonalen Projektionsmatrix einfach eine Kamera nimmt und das Blatt Papier direkt davorhält  _________________ "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 |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
 |
HomeLess_PunkDrummer JLI Master Trainee

Alter: 36 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 30.03.2005, 18:01 Titel: |
|
|
Jaja, ich habe eine halbe Stunde darüber gebrütet  _________________ "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 |
|
 |
|
|
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
|