• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

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

  • Ersteller theonehimself
  • 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?
 

theonehimself

Gast
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?
 

Cortex85

Gast
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 ;)