JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=5d5b5c4b92b18b52a757e86f9705c348Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Alpha Sample für DirectDraw
Gehe zu Seite 1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> News
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Christian Rousselle
Site Admin


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 03.08.2003, 12:30    Titel: Alpha Sample für DirectDraw Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 03.08.2003, 12:39    Titel: Antworten mit Zitat

Mille Grazie Very Happy (schreibt man doch so, oder)
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 03.08.2003, 12:41    Titel: Antworten mit Zitat

Hast du es schon angeschaut?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 03.08.2003, 12:52    Titel: Antworten mit Zitat

Nö, ich habs mir gerade runtergeladen. Aber wenn ich hier im I-Net fertig bin, schau ichs mir an Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 03.08.2003, 13:31    Titel: Antworten mit Zitat

Ja ist super! Very Happy

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
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 03.08.2003, 13:56    Titel: Antworten mit Zitat

Es wird einfach der Mittelwert ausgerechnet. Ist 50/50 Blending.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 03.08.2003, 15:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 03.08.2003, 15:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 03.08.2003, 15:40    Titel: Antworten mit Zitat

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 Smile
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 03.08.2003, 17:04    Titel: Antworten mit Zitat

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! Sad
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 03.08.2003, 17:24    Titel: Antworten mit Zitat

Hmm sollte es aber... du musst die Farbkomponenten obendrein einzeln behandeln und hinterher wieder zusammenbappen.

Ich hab hier noch ein Tutorial gefunden, das ich interessant fand:
http://www.gamedev.net/reference/articles/article1594.asp

Und noch:
http://www.gamedev.net/reference/articles/article320.asp
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 04.08.2003, 09:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 04.08.2003, 10:00    Titel: Re: Alpha Sample für DirectDraw Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 04.08.2003, 10:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 04.08.2003, 12:00    Titel: Antworten mit Zitat

thx, für die Erklärung Very Happy
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 Sad
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 Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> News Alle Zeiten sind GMT
Gehe zu Seite 1, 2, 3  Weiter
Seite 1 von 3

 
Gehe zu:  
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

Impressum