• Es ist bereits Apfeltalk-Tradition und wir möchten sie auch in diesem Jahr fortsetzen: Unser Apfeltalk-Weihnachtslogo-Wettbewerb hat begonnen! Gestaltet für uns das Weihnachtsbanner, das im Monat Dezember bis zum Weihnachtsfest unsere Webseite schmücken soll. Lasst Eurer Kreativität freien Lauf! Hier geht es zum Wettbewerb --> Klick
  • November - das bedeutet oftmals Herbstblues, grauer Himmel, Tristesse und Wetter, bei dem man gern im Warmen bleibt. Aber nur oftmals! Wir fordern Euch gern auf, gegen den Herbstblues anzukämpfen und hoffen, dabei hilft Euch unser aktuelles Monatsthema. Neugierig geworden? --> Zum Mitmachen bitte hier klicken

Wie lade ich Images für den Gebrauch als Textur in OpenGL?

  • Ersteller Ersteller theonehimself
  • Erstellt am Erstellt am

theonehimself

Gast
Tach zusammen...
Wie kann ich mit Carbon Images (wie z.B. jpg, bmp, tiff...) laden, die ich anschließend in Texturen für meine OpenGL Anwendungen umwandeln kann? Ich hab es mit Referenzen-Wälzen probiert, aber zu diesem doch eher simplen Problem nichts brauchbares gefunden. Kann mir jemand ein paar Tips geben? Welches API kommt in Frage? Tutorials?
 
Der gute alte NeHe... Die Seite war ne Zeit lang mein zweites Zuhause. Hab da meinen Loader für BMPs her. Hat mich ne halbe Nacht gekostet das Ding. Problem war die Endianness. Bis ich da alle Bytes richtig gedreht hatte... gruselig sowas.
Ich glaube mit QuickTime komme ich inzwischen etwas voran. Ich denk mal das deckt die meisten Formate ab. Hab nur schon Angst vor der Dokumentation... Da gibt es nicht zufällig ein paar einfache Tutorials, die sich nur mit dem Laden von Images befassen?
 
Hier hätte ich noch eine - in C++ übersetzte Fassung - von NeHe's Targa-Loader (der ursprünglich in C geschrieben war, und den ich dann nach C++ übersetzt hab (mit einiger Hilfe der Targa-Dateiformatspezifikation von wotsit.org. Kann allerdings nur unkomprimierte Targas. Für das Laden komprimierter Targas schau lieber in die Spezifikation.

Code:
char * LadeTGA(const char * filename)
{
	char TGAheaderSample[12] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // Header fuer unkomprimierte TGA mit Truecolor
	char TGAcompare[12]; // Vergleichsarray
	char header[6]; // enthaelt die wichtigsten Bytes 
	GLuint bytesPerPixel; 
	GLuint imageSize;
	GLuint temp;
//	GLuint type = GL_RGBA;
	
	GLuint width;
	GLuint height;
	GLuint bitsPerPixel;
	char * imageData = NULL;
	
	ifstream file(filename, ios_base::binary);
	
	
	file.read(TGAcompare, 12);
	
	using std::cout;
	
	int i=0;	
	int counter = 0;
	do
	{
		i++;
		if (TGAcompare[i] == TGAheaderSample[i])
			counter++;
			
		cout<<TGAheaderSample[i]<<std::endl;
	}
	while (i < 12);
	
/*
	if (i != counter)
	{
		file.close();
		return NULL;
	} */
	
	file.read(header, 6);
	
	width = header[1]*256 + header[0];
	height = header[3]*256 + header[2];
	
	if (width <= 0 || height <= 0 || (header[4] != 24 && header[4] != 32))
	{
		file.close();
		return NULL;
	}
	
	bitsPerPixel = header[4];
	bytesPerPixel = bitsPerPixel / 8;
	imageSize = width*height*bytesPerPixel;
	
	imageData = new char[imageSize];
	file.read(imageData, imageSize);
	
	tgaBreite = width;
	tgaHoehe = height;
	
	for (int i=0; i<imageSize; i+= bytesPerPixel)
	{
		temp = imageData[i]; // 3eckstausch
		imageData[i] = imageData[i+2];
		imageData[i+2] = temp;
	}
	
	file.close();
	return imageData;
	
}

edit: nicht vergessen fstream.h zu inkludieren ;)