Transparente Farben  
In DirectDraw können nur rechteckige Bilder geblittet (gezeichnet) werden. Was aber, wenn ein nicht rechteckiges Bild gezeichnet werden soll. Wenn z.B. ein Baum vor einem Hintergrund gezeichnet werden soll, ohne das der Hintergrund vom Baum-Bitmap zu sehen ist. Dazu wird die Technik der Farbmaskierung (color keying) verwendet, um alle Pixel einer bestimmten Farbe beim blitten zu ignorieren.
Es gibt zwei Arten der Farbmaskierung, Quellmaskierung (Source Keying) und Zielmaskierung (Destination Keying). Da für die Zielmaskierung keine Emulation seitens DirectX zur Verfügung steht, muss die Grafikkarte diese Technik beherrschen. Daher beschränkt sich dieses Tutorial auf die Quellmaskierung.
 
Die gewünschte transparente Farbe muss in einem Farbschlüssel (colorkey) gespeichert werden. Bei dem Farbschlüssel wird ein Low- und ein High-Wert angegeben. Damit kann auch ein Farbbereich definiert werden, allerdings nur wenn dies die Grafikkarte beim blitten auch unterstützt.
 
Welche Maskenfarbe sollte man nehmen ?
Die Auswahl der Maskenfarbe muss bereits bei der Erstellung der Bilder getroffen werden. Dabei ist folgendes zu beachten:

Die Maskenfarbe muss einmalig sein, d.h. sie darf im eigentlichen Bild nicht noch einmal vorhanden
  dabei sein, da sonst Lücken entstehen.
Auf das Farbformat achten, da ja eine 32Bit Farbe unter 16Bit anders aussieht.
 
Die Wahl der Maskenfarbe hängt auch von der jeweiligen Grafik ab.
Schwarz ist zwar in jeder Farbtiefe eindeutig (Null (0)), kommt aber in den Bildern selbst häufig vor.
Weiß ist auch recht einfach, aber auch diese Farbe kommt in den Bildern sehr häufig vor.
Bleiben nur noch die Primärfarben (Rot, Grün oder Blau) übrig, oder eine Mischung aus zwei von
  denen. Am Besten man verwendet jeweils eine gesättigte Farbe. Gesättigt heißt das von der
  Standardfarbe die volle Intensität genommen wird, also z.B. gesättigtes Rot.
 
Und wie kommt man nun zu einer gesättigten Standardfarbe wenn das Bild in einer anderen Farbtiefe erstellt wurde als die Farbtiefe in dem Programm? Einfach das PixelFormat der PrimarySurface auslesen nach dem diese erstellt wurde.

Dim ddPF As DDPIXELFORMAT
  'aktuelle Farbbitmasken aus der PrimarySurface auslesen
PrimarySurface.GetPixelFormat ddPF

Beim Laden des Bildes muss die transparente Farbe mit einem Farbschlüssel (ColorKey) gesetzt werden.

Dim BmpDesc As DDSURFACEDESC2
Dim ColorKey As DDCOLORKEY

BmpDesc.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH
BmpDesc.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
    
 'Im Bild ist die Farbe ROT RGB(255,0,0) die transparente Farbe
 'daher wird high und low auf ROT gesetzt
 'lRBitMask und ist Rot in voller Stärke
ColorKey.high = ddPF.lRBitMask
ColorKey.low = ddPF.lRBitMask
BmpDesc.lWidth = 126
BmpDesc.lHeight = 128
Set bmpBaum = DD7.CreateSurfaceFromFile(App.Path & _
  "\Tree.bmp", BmpDesc)
 'setzen der transparenten Farbe
bmpBaum.SetColorKey DDCKEY_SRCBLT, ColorKey

Wichtig ist noch, dass beim Blitten der Schalter für das Ignorieren der Maskenfarbe mitgeschickt wird.

 'Bitmap in den BackBuffer zeichnen
 'und dabei die MaskenFarbe z.B. ROT ignorieren
BackBuffer.BltFast 100, 100, bmpBaum, SrcRect, _
  DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY

Ein Beispiel für Quellmaskierung können Sie hier downloaden, und den ausführlichen Tipp finden Sie in unserer Tipp-Rubrik.

  Download BitmapBlt.zip Download
tip0145.zip
 (21 kB)
Downloadzeit: <1 Min. - 28.8k / <1 Min. - ISDN Downloads bisher: [ 2044 ]
 
  Die 3D-Darstellung [ Top ]

Sie werden sicher fragen, wie geht 3D in DirectDraw.

Nun, um eine Szene in 3D darzustellen braucht man noch etwas - Tiefe. In 3D wird zu der Koordinate X und Y noch die Koordinate Z verwendet, um festzulegen, wie weit das Objekt vom Betrachter entfernt ist. In DirectDraw gibt es natürlich keine Z-Koordinate, d.h. die Szene muss in der richtigen Reihenfolge zusammengestellt werden um die visuellen Hinweise zu simulieren, die das Gehirn zur Bestimmung verwendet. Tiefenbestimmung oder die Fähigkeit, Entfernungen zu schätzen, ist eine Funktion des Gehirns, die automatisch stattfindet. Es muss aber noch mehr im Spiel sein, da wir die Tiefe von Objekten auch in 2D-Bildern erkennen können. Das Gehirn muss nun so überlistet werden, dass es meint, unser Bild ist 3D.

Eine Möglichkeit ist die Art, wie sich die Objekte in der Szene überlappen. Hierfür muss lediglich die Reihenfolge kontrolliert werden, in der die Objekte gezeichnet werden. Die Objekte im Hintergrund werden zuerst gezeichnet, dann die nächste Ebene und am Schluss der Vordergrund.

Ein Beispiel für die 3D-Darstellung einer Szene können Sie hier downloaden, und den ausführlichen Tipp finden Sie in unserer Tipp-Rubrik.

  Download BitmapBlt.zip Download
tip0144.zip
 (351 kB)
Downloadzeit: <1 Min. - 28.8k / <1 Min. - ISDN Downloads bisher: [ 1013 ]

Startseite | VB-/VBA-Tipps | Projekte | Tutorials | API-Referenz | Komponenten | Bücherecke | Gewinnspiele | VB-/VBA-Forum | DirectX-Forum | VB.Net | .Net-Forum | Foren-Archiv | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report

Letzte Aktualisierung, Mittwoch, 24. Oktober 2001