|
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
tip0145.zip
(21 kB) |
|
Downloads
bisher: [ 2130
] |
|
|