 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 03.08.2003, 12:30 Titel: Alpha Sample für DirectDraw |
|
|
Hallo,
aufgrund großen Interesses habe ich ein Programm zusammengebaut, das Blending mit DirectDraw zeigt. Es kann ein rotes Quadrat über ein Hintergrundbild bewegt werden (Pfeiltasten). Dieses Quadrat ist rot + durchsichtig, so dass der Hintergrund durchscheint.
Beispiel
Christian
Zuletzt bearbeitet von Christian Rousselle am 09.09.2003, 12:32, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 03.08.2003, 12:41 Titel: |
|
|
Hast du es schon angeschaut? |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 03.08.2003, 12:52 Titel: |
|
|
Nö, ich habs mir gerade runtergeladen. Aber wenn ich hier im I-Net fertig bin, schau ichs mir an  _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 03.08.2003, 13:31 Titel: |
|
|
Ja ist super!
Könntest du aber das bitte etwas genauer erklären?
Code: |
for(int i=0;i<SourceDesc.dwHeight;i++)
{
for(int j=0;j<SourceDesc.dwWidth;j++)
{
DestRed = (*pDestPixels & 0xFF0000) >> 16;
DestGreen = (*pDestPixels & 0x00FF00) >> 8;
DestBlue = (*pDestPixels & 0x0000FF);
SourceRed = (*pSourcePixels & 0xFF0000) >> 16;
SourceGreen = (*pSourcePixels & 0x00FF00) >> 8;
SourceBlue = (*pSourcePixels & 0x0000FF);
BlendRed = DestRed * SourceRed / 256;
BlendGreen = DestGreen * SourceGreen / 256;
BlendBlue = DestBlue * SourceBlue / 256;
BlendRed = BlendRed << 16;
BlendGreen = BlendGreen << 8;
*pDestPixels = BlendRed + BlendGreen + BlendBlue;
pDestPixels++;
pSourcePixels++;
}
pDestPixels += DestDesc.lPitch - SourceDesc.dwWidth;
pSourcePixels += SourceDesc.lPitch - SourceDesc.dwWidth;
}
|
also multiplizieren ist klar, hab ich auch verstanden, dass binäre Zeug nehm ich einfach so hin, hatten wir ja auch mit myRGB(r,g,b) in JLI1. Aber warum durch 256 teilen?
EDIT: Never mind.
32Bit = R*G*B = 256*256*256 _________________ The source of all power is in its destiny... |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 03.08.2003, 13:56 Titel: |
|
|
Es wird einfach der Mittelwert ausgerechnet. Ist 50/50 Blending. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 03.08.2003, 15:06 Titel: |
|
|
Eine Frage hätte ich da aber noch:
Wie kann man jetzt eine 75/100 Alpha Blende erstellen?
Ich kenne mich da nicht so gut aus... _________________ The source of all power is in its destiny... |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 03.08.2003, 15:39 Titel: |
|
|
Meinst du 75/100 oder 75/25?
Im Prinzip geht es so:
Anteil1 = Farbe1 * Prozent
Anteil2 = Farbe2 * (100 - Prozent)
NeueFarbe = Anteil1 + Anteil2 _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 03.08.2003, 15:40 Titel: |
|
|
So, jetzt funzt es fast, wenn auch mit einem kleinen Framerateverlust.
Was ich anders hatte, war, dass ich die einzelnen Tiles nicht gleich in das AGPSurface und von dort aus geblendet hatte, sondern erst in ein Hilfssurface im Systemspeicher und von dort aus dann ins AGPSurface. Was ich noch anders hatte(und das war wahrscheinlich auch die größte Geschwindigkeitsbremse)war, dass ich bei jedem Pixel einzeln gelockt, Pitch etc... errechnet und dann wieder geunlockt habe. Und genau da habe ich noch eine Frage. Könntest du das bitte doch noch erläutern, was in der BlendBlt-Funktion passiert(besonders das in der Schleife)?
Ich würde nämlich auch gerne verstehen, was ich da falsch/anders gemacht habe
Code: | DDSURFACEDESC2 DestDesc;
DDSURFACEDESC2 SourceDesc;
ZeroMemory(&DestDesc,sizeof(DestDesc));
ZeroMemory(&SourceDesc,sizeof(SourceDesc));
DestDesc.dwSize = sizeof(DestDesc);
SourceDesc.dwSize = sizeof(SourceDesc);
DestSurface->Lock(0,&DestDesc,DDLOCK_WAIT,0);
SourceSurface->Lock(0,&SourceDesc,DDLOCK_WAIT,0);
DWORD* pDestPixels = (DWORD*)DestDesc.lpSurface;
DWORD* pSourcePixels = (DWORD*)SourceDesc.lpSurface;
SourceDesc.lPitch /= 4;
DestDesc.lPitch /= 4;
pDestPixels += DestRect->top * DestDesc.lPitch + DestRect->left;
DWORD DestRed;
DWORD DestGreen;
DWORD DestBlue;
DWORD SourceRed;
DWORD SourceGreen;
DWORD SourceBlue;
DWORD BlendRed;
DWORD BlendGreen;
DWORD BlendBlue;
for(int i=0;i<SourceDesc.dwHeight;i++)
{
for(int j=0;j<SourceDesc.dwWidth;j++)
{
DestRed = (*pDestPixels & 0xFF0000) >> 16;
DestGreen = (*pDestPixels & 0x00FF00) >> 8;
DestBlue = (*pDestPixels & 0x0000FF);
SourceRed = (*pSourcePixels & 0xFF0000) >> 16;
SourceGreen = (*pSourcePixels & 0x00FF00) >> 8;
SourceBlue = (*pSourcePixels & 0x0000FF);
BlendRed = DestRed * SourceRed / 256;
BlendGreen = DestGreen * SourceGreen / 256;
BlendBlue = DestBlue * SourceBlue / 256;
BlendRed = BlendRed << 16;
BlendGreen = BlendGreen << 8;
*pDestPixels = BlendRed + BlendGreen + BlendBlue;
pDestPixels++;
pSourcePixels++;
}
pDestPixels += DestDesc.lPitch - SourceDesc.dwWidth;
pSourcePixels += SourceDesc.lPitch - SourceDesc.dwWidth;
}
SourceSurface->Unlock(0);
DestSurface->Unlock(0); |
_________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 03.08.2003, 17:04 Titel: |
|
|
Hazel hat Folgendes geschrieben: | Meinst du 75/100 oder 75/25?
Im Prinzip geht es so:
Anteil1 = Farbe1 * Prozent
Anteil2 = Farbe2 * (100 - Prozent)
NeueFarbe = Anteil1 + Anteil2 |
so hab ich das auch versucht, das dumme ist nur, dass es bei mir nicht so funktioniert!  _________________ The source of all power is in its destiny... |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 04.08.2003, 09:32 Titel: |
|
|
Zitat: | So, jetzt funzt es fast, wenn auch mit einem kleinen Framerateverlust.
|
Der Code ist auch alles andere als optimiert. Man könnte die Routine (alles was in der Render-Funktion aufgerufen wird schneller machen, BltFast, keine lokalen Variablen, inlining usw.). Wie hoch ist der Verlust? Im Debug-Output werden die Frameraten ausgegeben.
Zitat: | das war wahrscheinlich auch die größte Geschwindigkeitsbremse)war, dass ich bei jedem Pixel einzeln gelockt, Pitch etc... errechnet und dann wieder geunlockt habe |
Das ist nicht nötig. Es reicht sogar, sich den Pitch einmal zu holen, z.B. zu Beginn des Programms. Dadurch spart man weitere Berechnungen in der Render-Funktion.
Zitat: | Könntest du das bitte doch noch erläutern, was in der BlendBlt-Funktion passiert(besonders das in der Schleife)?
|
Naja, Hazel hat es ja schon mehr oder weniger gesagt:
Code: |
DestRed = (*pDestPixels & 0xFF0000) >> 16;
DestGreen = (*pDestPixels & 0x00FF00) >> 8;
DestBlue = (*pDestPixels & 0x0000FF);
SourceRed = (*pSourcePixels & 0xFF0000) >> 16;
SourceGreen = (*pSourcePixels & 0x00FF00) >> 8;
SourceBlue = (*pSourcePixels & 0x0000FF);
|
Damit hole ich mir die einzelnen Farbkomponenten. Der Rotanteil steht in den Bits 16-24, deshalb muss ich den Wert um 16 Bits nach unten verschieben, um einen Wert zwischen 0-255 zu bekommen. Der Grünanteil muss entsprechend um 8 Bits verschoben werden, Blauanteil befindet sich im niederwertigsten Bit und muss deshalb nicht verschoben werden. Das Bitweise und (&) sorgt dafür, dass nur die Komponenten der gewünschten Farbe "übrig" bleiben (nennt sich Maskierung). Das gilt für 32 Bit Farbtiefe, bei anderen Farbtiefen müssen die Werte entsprechend angepasst werden. Danach werden die Komponenten miteinander multipliziert und durch 256 geteilt, damit sich wieder ein Wert zwischen 0-255 ergibt:
Code: |
BlendRed = DestRed * SourceRed / 256;
BlendGreen = DestGreen * SourceGreen / 256;
BlendBlue = DestBlue * SourceBlue / 256;
BlendRed = BlendRed << 16;
BlendGreen = BlendGreen << 8;
*pDestPixels = BlendRed + BlendGreen + BlendBlue;
|
Rot muss in Bit 16-24 stehen, grün in 8-16 (siehe oben). Die letzte Zeile baut die einzelnen Farbkomponenten wieder zusammen.
Wenn ihr, wie in dem Beispiel 32 Bit verwendet, dann könnte ihr die Alphainformationen für jeden Pixel mit in dem Surface speichern, da nur 24 Bit für die Farben benötigt werden.
Christian |
|
Nach oben |
|
 |
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 04.08.2003, 10:00 Titel: Re: Alpha Sample für DirectDraw |
|
|
Christian Rousselle hat Folgendes geschrieben: | Hallo,
aufgrund großen Interesses habe ich ein Programm zusammengebaut, das Blending mit DirectDraw zeigt. Es kann ein rotes Quadrat über ein Hintergrundbild bewegt werden (Pfeiltasten). Dieses Quadrat ist rot + durchsichtig, so dass der Hintergrund durchscheint.
Beispiel
Christian |
Ja, DirectDraw!?
Gibt es wohl eine optimierte DirectX-eigene Funktion, wenn man in DX9 DirectGraphics benutzt? Oder was ist ALphablending,etc...? _________________ The source of all power is in its destiny... |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 04.08.2003, 10:27 Titel: |
|
|
Es gibt natürlich Funktionen, die Alphablending unter Direct3D9 unterstützen. Aber soweit ich weiss unterstützt dies keine Funktion, die mit Surfaces arbeitet (z.B. Stretchrect).
Christian |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 04.08.2003, 12:00 Titel: |
|
|
thx, für die Erklärung
Wie sieht das ganze aus, wenn man es mit 16 Bit Farbtiefe macht? Kann man das nicht, wie im Buch(JLI1) machen?
Christian Rousselle hat Folgendes geschrieben: | Zitat: | So, jetzt funzt es fast, wenn auch mit einem kleinen Framerateverlust.
|
Der Code ist auch alles andere als optimiert. Man könnte die Routine (alles was in der Render-Funktion aufgerufen wird schneller machen, BltFast, keine lokalen Variablen, inlining usw.). Wie hoch ist der Verlust? Im Debug-Output werden die Frameraten ausgegeben. |
Bei meinem eigenen Spiel ist der Framerateverlust zwar nur 1-2 Frames, aber die sind sowieso so kostbar. Leider habe ich, wenns schlecht kommt z.Z. nur 12 FPS
BltFast verwende ich auch.
Als ich mal probeweise zwei Drawaufrufe(für die Terrainquadrate) auskommentiert habe, hatte ich wieder meistens über 30 FPS. Kann das sein, dass die Framerate nur wegen diesen zwei anweisungen so klein wird?
Insgesamt sind es pro Frame 17*12 Quadrate mit je 50*50 Pixeln.
Christian Rousselle hat Folgendes geschrieben: |
Zitat: | das war wahrscheinlich auch die größte Geschwindigkeitsbremse)war, dass ich bei jedem Pixel einzeln gelockt, Pitch etc... errechnet und dann wieder geunlockt habe |
Das ist nicht nötig. Es reicht sogar, sich den Pitch einmal zu holen, z.B. zu Beginn des Programms. Dadurch spart man weitere Berechnungen in der Render-Funktion.
|
Gut, das Locken und Unlocken habe ich jetzt Surfaceweise(nicht mehr Pixelweise) gemacht. Dann mache ich mal das Pitch etc... errechnen an den Anfang  _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
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
|