JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

[OpenGL] Textur erstellen funzt nicht: Fehler mit Bitmap?

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 20.02.2005, 13:50    Titel: [OpenGL] Textur erstellen funzt nicht: Fehler mit Bitmap? Antworten mit Zitat

hi!

Ich bin gerade dabei meine Engine auch OpenGL kompatibel zu machen und hab da ein Problem bei dem Erstellen von Texturen (wie im Titel schon erwähnt). Es kommt nähmlich immer zu einer unbehandelten Ausnahme wenn ich folgende Zeile ausführe:
Code:
   glTexImage2D( GL_TEXTURE_2D, 0, 3, lWidth, lHeight, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, &lFile.Data[2] );


Zum Kontext:
Ich verwende ein eigenes Texturenformat, das (bis jetzt) ganz einfach aufgebaut ist: Es werden die Breite und die Höhe der Bitmap gespeichert und danach die gesamten Pixeldaten. Der Pixeldatenblock ist dabei äquivalent zum Pixeldatenblock aus der Quellbitmap, oder sollte es zumindest sein. Ich vermute nämlich dass ich hier einen Fehler hab, und zu wenig pixeldaten in meine "*.tex" Datei schreibe. Der Kompiliercode sieht folgendermaßen aus:
Code:

void Texture::Compile( std::string Source, std::string Dest )
{   
   HBITMAP lBMPHandle;
   BITMAP   lBMP;
   FILE*   lFile;

   [...]

   lBMPHandle = (HBITMAP)LoadImage( GetModuleHandle(NULL), Source.c_str(), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE );
   
   [...]

   GetObject( lBMPHandle, sizeof(lBMP), &lBMP );
   
   if( (lFile = fopen( Dest.c_str(), "wb" )) == 0 )
   {
      [...]
   }

   fwrite( &lBMP.bmWidth, sizeof(unsigned char), 1, lFile );
   fwrite( &lBMP.bmHeight, sizeof(unsigned char),1, lFile );
   fwrite( &lBMP.bmBits, sizeof(unsigned char), lBMP.bmWidth*lBMP.bmHeight, lFile ); // ***

   fclose( lFile );
   DeleteObject( lBMPHandle );
}


Das Problem liegt denke ich an der mit Sternchen versehenen Zeile. Ich denke das "bmBits" Array ist größer als nur Höhe mal Breite. Ich frag mich jetzt, wie ich die Größe dieses Arrays rausbekomme? Weis jemand von euch, wie man die berechnet? Ich hab in der MSDN nichts gefunden...

Oder glaubt ihr der Fehler liegt wo ganz anders?


Danke fürs Durchlesen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 20.02.2005, 13:53    Titel: Antworten mit Zitat

CPP:
void textureManager::loadTexture (const std::string &FileName)
{
      // Durchlaufe den Vector
   for ( m_vec_Textures_it=this->m_vec_Textures.begin(); m_vec_Textures_it<this->m_vec_Textures.end(); ++m_vec_Textures_it)
   {
         // Hat eine Textur im Vector den selben Namen wie angefordert?
      if (m_vec_Textures_it->FileName == FileName)
      {
         POP_FUNCTION
         return;
      }
   }

      // Teste ob datei überhaupt existiert.
   std::ifstream FileStream(FileName.c_str());

    if (!FileStream.good())
      EXCEPTION (TextBuffer ("File not found: ", FileName));

      // Temporäres Objekt anlegen und namen geben.
   TextureItem temp;
   temp.FileName = FileName;

   BITMAP   BMP;

   glGenTextures(1, &temp.Texture);

   HBITMAP__ *hBMP = static_cast<HBITMAP__*>(::LoadImage(::GetModuleHandle(NULL), FileName.c_str(), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE));

   ::GetObject(hBMP, sizeof(BMP), &BMP);

   glPixelStorei(GL_UNPACK_ALIGNMENT, 4);

   glBindTexture(GL_TEXTURE_2D, temp.Texture);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

   glTexImage2D(GL_TEXTURE_2D, 0, 3, BMP.bmWidth, BMP.bmHeight, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits);
   
   temp.Width = BMP.bmWidth;
   temp.Height = BMP.bmHeight;

   DeleteObject(hBMP);                                    // Delete The Object


      // und ab damm_vec_Textures_it in den Vector pushen.
   this->m_vec_Textures.push_back (temp);
}


works Wink
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 20.02.2005, 13:57    Titel: Antworten mit Zitat

Jap, mein Problem ist, dass ich das nicht direkt aus einer Bitmap auslese. Ich will das zuerst in meine "*.tex" Datei schreiben und dann auslesen und die Textur darüber erstellen. Das Problem ist, dass ich zum Schreiben des "bmBits" Arrays in meine "*.tex" Datei die Größe des Arrays kennen muss?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 20.02.2005, 13:58    Titel: Antworten mit Zitat

Jap die musst du kennen Smile und die kannst du berechnen! guck dir mal die ganzen Argumente der Bitmap-Objekte an Wink
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 20.02.2005, 14:12    Titel: Antworten mit Zitat

Joooo... jetzt wo dus sagst, da hats ja noch ein "bmBitsPixel" drin stehen... theoretisch müsste die Gesamtgröße dann ja eigentlich die Anzahl der Pixel (bmWidth*bmHeight) mal die Größe eines Pixels sein... "bmBitsPixel" gibt die Größe eines Pixels in Bit an. Das heist, dass die Gesamtgröße des Arrays in Bit so groß ist: (bmWidth*bmHeight*bmBitsPixel). In Byte wäre das: (bmWidth*bmHeight*(bmBitsPixel/Cool) sein müsste?
Naja, wenn ich das Array in der Größe (in Byte) abspeichere, dann kommt der Fehler trotzdem, auch in Bit... Da gibts auch noch das "bmWidthBytes" was genau bedeutet das? Was ist eine "scan line"?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 20.02.2005, 14:13    Titel: Antworten mit Zitat

bist auf der richtigen spur Wink probier einfach mal was rum Wink
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 20.02.2005, 14:35    Titel: Antworten mit Zitat

"There's something rotten in the state of Denmark" (oder so)

Meine Bitmap hat die Ausmaße 128*128 Pixel. Das "bmWidthBytes" hat die Größe 384 (Bytes). Wenn ich jetzt das "bmBits" Array so abspeichere:
Code:

fwrite( &lBMP.bmBits, sizeof(unsigned char), lBMP.bmHeight*lBMP.bmWidthBytes, lFile );


Hab ich am Ende eine Datei von 4 kB, 4096 Bytes. Aber allein das Array müsste ja eine Größe von 128 * 384 = 49152 Bytes. Die Datei ist aber kleiner? strange...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 20.02.2005, 15:10    Titel: Antworten mit Zitat

wow... wenn das nicht mal seltsam ist: Der Inhalt der "*.tex" Datei sieht folgendermaßen aus:

Code:
 ist jetzt nimma wichtig


Man beachte die netten Zeichenliterale...
Ich hab lediglich über den oben genannten Code die Größe und Breite der Bitmap plus dem "bmBits" Array mit der Größe (bmHeight*bmWidthBytes) in die Datei geschrieben...

Jetzt bin ich mit meinem Latein am Ende (und ich habs sogar mit ner 1.0 abgewählt!) ... Hat jemand von euch schonmal was vergleichbares gesehen?

[edit]
irgendwie fühl ich mich jetzt nach Strich und Faden verarscht, falls man das so sagen darf... ich hab den Funktionsaufruf "fwrite()" durch eine for-Schleife ersetzt, die jedes Element von "bmBits" per "fputc" in die Datei reinschreibt.
Das Ergebniss:
- die Dateigröße stimmt,
- keine dummen Windowsnachrichten in meiner Datei, der Inhalt stimmt und
- die Textur wird erstellt Very Happy (zumindest kommt keine unbehandelte Ausnahme, mal gucken, ob meine Models richtig angezeigt werden... Smile

@Patrick: Vielen Dank für den Stubser in die richtige Richtung, Asche auf mein Haupt... Smile
[/edit]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
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