Ganon
2004-01-24, 15:28:31
Hi.
Ich habe mir eine Klasse erstellt, mit der ich Texturen für OpenGL laden kann. Dies sollte Plattformunabhängig geschehen.
Jetzt wollte ich euch mal fragen ob man das so stehen lassen kann, oder ob man das so nicht machen sollte? Bisher kann man nur Bitmaps laden. Und man kann pro Objekt 3 Texturen laden.
Bisher funktioniert es. Aber ich hätte gerne Gewissheit. ;)
Würdet ihr euch das mal angucken?
Danke.
// Klasse für die Texturen
class KTexturen
{
private:
GLuint Textur[3];
public:
KTexturen(); // Konstruktor
~KTexturen(); // Destruktor
bool LadeTextur(char *Dateiname, int Tex);
GLuint HoleTextur(int Tex);
};
KTexturen::KTexturen()
{}
KTexturen::~KTexturen()
{}
bool KTexturen::LadeTextur(char *Dateiname, int Tex)
{
FILE *datei;
unsigned long groesse; // Dateigröße in Byte
unsigned long i; // Zählervariable
unsigned short int flaeche; // Anzahl der Flächen (muss 1 sein)
unsigned short int bpp; // Anzahl der Bit pro Pixel (muss 24 sein)
char temp; // temporärer Farbspeicher bgr->rgb Wandlung
unsigned long groesseX; // Bild-Auflösung X
unsigned long groesseY; // Bild-Auflösung Y
char *daten; // das Bild
// prüfen ob die Datei vorhanden ist
if ((datei = fopen(Dateiname, "rb")) == NULL)
{
cout << "Datei nicht gefunden: " << Dateiname << endl;
return false;
};
// Bitmap-Header nach der Bildauflösung durchsuchen
fseek(datei, 18, SEEK_CUR);
// Wenn Prozessor kein x86 ist, dann Bild-Header umstellen auf Big-Endian
#ifdef _M_IX86
#else
char *umkehr, swap;
#endif
// Lesen der Breite
if ((i = fread(&groesseX, 4, 1, datei)) != 1)
{
cout << "Fehler beim Lesen der Breite von " << Dateiname << endl;
return false;
};
#ifdef _M_IX86
#else
umkehr = (char *) &(groesseX);
swap = umkehr[0]; umkehr[0] = umkehr[3]; umkehr[3] = swap;
swap = umkehr[1]; umkehr[1] = umkehr[2]; umkehr[2] = swap;
#endif
cout << "Breite von " << Dateiname << ": " << groesseX << endl;
// Lesen der Höhe
if ((i = fread(&groesseY, 4, 1, datei)) != 1)
{
cout << "Fehler beim Lesen der Höhe von : " << Dateiname << endl;
return false;
};
#ifdef _M_IX86
#else
umkehr = (char *) &(groesseY);
swap = umkehr[0]; umkehr[0] = umkehr[3]; umkehr[3] = swap;
swap = umkehr[1]; umkehr[1] = umkehr[2]; umkehr[2] = swap;
#endif
cout << "Hoehe von " << Dateiname << ": " << groesseY << endl;
// Berrechnen der Dateigröße (24bit mal 3 byte pro Pixel)
groesse = groesseX * groesseY * 3;
// Lesen der Flächen
if ((fread(&flaeche, 2, 1, datei)) != 1)
{
cout << "Fehler beim Lesen der Fläche von " << Dateiname << endl;
return false;
};
#ifdef _M_IX86
#else
umkehr = (char *) &(flaeche);
swap = umkehr[0]; umkehr[0] = umkehr[1]; umkehr[1] = swap;
#endif
if (flaeche != 1)
{
cout << "Flächen von " << Dateiname << " ist nicht 1, sondern " << flaeche << endl;
return false;
};
// Lesen der Farbtiefe
if ((i = fread(&bpp, 2, 1, datei)) != 1)
{
cout << "Fehler beim Lesen der Farbtiefe von " << Dateiname << endl;
return false;
};
#ifdef _M_IX86
#else
umkehr = (char *) &(bpp);
swap = umkehr[0]; umkehr[0] = umkehr[1]; umkehr[1] = swap;
#endif
if (bpp != 24)
{
cout << "Farbtiefe von " << Dateiname << " ist nicht 24bit, sondern " << bpp << endl;
return false;
};
// Lesen des restlichen Bitmap-Headers
fseek(datei, 24, SEEK_CUR);
// Lesen der Daten
daten = (char *) malloc(groesse);
if (daten == NULL)
{
cout << "Fehler beim Ansteuern von Speicher fuer das Bild" << endl;
return false;
};
if ((i = fread(daten, groesse, 1, datei)) != 1)
{
cout << "Fehler beim Lesen der Daten von " << Dateiname << endl;
return false;
};
// Alle Farben umkehren (bgr -> rgb)
for (i=0;i<groesse;i+=3)
{
temp = daten[i];
daten[i] = daten[i+2];
daten[i+2] = temp;
};
// Dateizeiger schliessen
fclose(datei);
// Erzeugen von Texturspeicher
glGenTextures(1,&KTexturen::Textur[Tex]);
// Mip-Mappen der Textur
glBindTexture(GL_TEXTURE_2D,KTexturen::Textur[Tex]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, groesseX, groesseY, GL_RGB, GL_UNSIGNED_BYTE, daten);
// Fertig :-)))) *jippi*
return true;
}
GLuint KTexturen::HoleTextur(int Tex)
{
return KTexturen::Textur[Tex];
}
Ich habe mir eine Klasse erstellt, mit der ich Texturen für OpenGL laden kann. Dies sollte Plattformunabhängig geschehen.
Jetzt wollte ich euch mal fragen ob man das so stehen lassen kann, oder ob man das so nicht machen sollte? Bisher kann man nur Bitmaps laden. Und man kann pro Objekt 3 Texturen laden.
Bisher funktioniert es. Aber ich hätte gerne Gewissheit. ;)
Würdet ihr euch das mal angucken?
Danke.
// Klasse für die Texturen
class KTexturen
{
private:
GLuint Textur[3];
public:
KTexturen(); // Konstruktor
~KTexturen(); // Destruktor
bool LadeTextur(char *Dateiname, int Tex);
GLuint HoleTextur(int Tex);
};
KTexturen::KTexturen()
{}
KTexturen::~KTexturen()
{}
bool KTexturen::LadeTextur(char *Dateiname, int Tex)
{
FILE *datei;
unsigned long groesse; // Dateigröße in Byte
unsigned long i; // Zählervariable
unsigned short int flaeche; // Anzahl der Flächen (muss 1 sein)
unsigned short int bpp; // Anzahl der Bit pro Pixel (muss 24 sein)
char temp; // temporärer Farbspeicher bgr->rgb Wandlung
unsigned long groesseX; // Bild-Auflösung X
unsigned long groesseY; // Bild-Auflösung Y
char *daten; // das Bild
// prüfen ob die Datei vorhanden ist
if ((datei = fopen(Dateiname, "rb")) == NULL)
{
cout << "Datei nicht gefunden: " << Dateiname << endl;
return false;
};
// Bitmap-Header nach der Bildauflösung durchsuchen
fseek(datei, 18, SEEK_CUR);
// Wenn Prozessor kein x86 ist, dann Bild-Header umstellen auf Big-Endian
#ifdef _M_IX86
#else
char *umkehr, swap;
#endif
// Lesen der Breite
if ((i = fread(&groesseX, 4, 1, datei)) != 1)
{
cout << "Fehler beim Lesen der Breite von " << Dateiname << endl;
return false;
};
#ifdef _M_IX86
#else
umkehr = (char *) &(groesseX);
swap = umkehr[0]; umkehr[0] = umkehr[3]; umkehr[3] = swap;
swap = umkehr[1]; umkehr[1] = umkehr[2]; umkehr[2] = swap;
#endif
cout << "Breite von " << Dateiname << ": " << groesseX << endl;
// Lesen der Höhe
if ((i = fread(&groesseY, 4, 1, datei)) != 1)
{
cout << "Fehler beim Lesen der Höhe von : " << Dateiname << endl;
return false;
};
#ifdef _M_IX86
#else
umkehr = (char *) &(groesseY);
swap = umkehr[0]; umkehr[0] = umkehr[3]; umkehr[3] = swap;
swap = umkehr[1]; umkehr[1] = umkehr[2]; umkehr[2] = swap;
#endif
cout << "Hoehe von " << Dateiname << ": " << groesseY << endl;
// Berrechnen der Dateigröße (24bit mal 3 byte pro Pixel)
groesse = groesseX * groesseY * 3;
// Lesen der Flächen
if ((fread(&flaeche, 2, 1, datei)) != 1)
{
cout << "Fehler beim Lesen der Fläche von " << Dateiname << endl;
return false;
};
#ifdef _M_IX86
#else
umkehr = (char *) &(flaeche);
swap = umkehr[0]; umkehr[0] = umkehr[1]; umkehr[1] = swap;
#endif
if (flaeche != 1)
{
cout << "Flächen von " << Dateiname << " ist nicht 1, sondern " << flaeche << endl;
return false;
};
// Lesen der Farbtiefe
if ((i = fread(&bpp, 2, 1, datei)) != 1)
{
cout << "Fehler beim Lesen der Farbtiefe von " << Dateiname << endl;
return false;
};
#ifdef _M_IX86
#else
umkehr = (char *) &(bpp);
swap = umkehr[0]; umkehr[0] = umkehr[1]; umkehr[1] = swap;
#endif
if (bpp != 24)
{
cout << "Farbtiefe von " << Dateiname << " ist nicht 24bit, sondern " << bpp << endl;
return false;
};
// Lesen des restlichen Bitmap-Headers
fseek(datei, 24, SEEK_CUR);
// Lesen der Daten
daten = (char *) malloc(groesse);
if (daten == NULL)
{
cout << "Fehler beim Ansteuern von Speicher fuer das Bild" << endl;
return false;
};
if ((i = fread(daten, groesse, 1, datei)) != 1)
{
cout << "Fehler beim Lesen der Daten von " << Dateiname << endl;
return false;
};
// Alle Farben umkehren (bgr -> rgb)
for (i=0;i<groesse;i+=3)
{
temp = daten[i];
daten[i] = daten[i+2];
daten[i+2] = temp;
};
// Dateizeiger schliessen
fclose(datei);
// Erzeugen von Texturspeicher
glGenTextures(1,&KTexturen::Textur[Tex]);
// Mip-Mappen der Textur
glBindTexture(GL_TEXTURE_2D,KTexturen::Textur[Tex]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, groesseX, groesseY, GL_RGB, GL_UNSIGNED_BYTE, daten);
// Fertig :-)))) *jippi*
return true;
}
GLuint KTexturen::HoleTextur(int Tex)
{
return KTexturen::Textur[Tex];
}