[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:
0xaarrggbbaa - 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 blittenDas 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