Textur geht nicht [OpenGL + SDL]
-
Irgendetwas beim Laden bzw. Anzeigen einer Textur in meinem SLD-Programm mit OpenGL funktioniert nicht.
Mein Hauptprogramm beinhaltet:
GLuint meine_textur = LadeTextur("gfx/mauer.bmp"); if(meine_textur == 0) return 0; //... glEnable(GL_TEXTURE_2D); //... glBindTexture(GL_TEXTURE_2D, meine_textur); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 1.0f, -1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(0.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, -1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, -1.0f, -1.0f); glEnd();Die Funktion LadeTextur:
GLuint LadeTextur(char *dateiname) { // Bild laden SDL_Surface *Bild = SDL_LoadBMP(dateiname); if(!Bild) return 0; SDL_Surface *Konv = SDL_CreateRGBSurface(SDL_SWSURFACE, Bild->w, Bild->h, 32, #if SDL_BYTEORDER == SDL_BIG_ENDIAN 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff); #else 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); #endif SDL_BlitSurface(Bild, 0, Konv, 0); // Textur erstellen GLuint textur; glGenTextures(1, &textur); glBindTexture(GL_TEXTURE_2D, textur); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // zum Strecken und Stauchen den Filter GL_LINEAR ... glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // ... benutzen (sparsamer: GL_NEAREST) glTexImage2D(GL_TEXTURE_2D, 0, 3, Konv->w, Konv->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, Konv->pixels); // Bereinigen und Zurückgeben SDL_FreeSurface(Bild); SDL_FreeSurface(Konv); return textur; }Warum wird die Textur nicht angezeigt? Der Code ist eigentlich so wie in 'nem SDL-Tutorial.
-
1. Was wird angezeigt?
2. Welche Größe hat die Textur?
3. Du überprüfst nirgendwo, ob OpenGL-Befehle fehlschlagen (glGetError!)
-
1. Angezeigt wird wird ein entsprechendes Rechteck in der zuletzt aufgewählten Farbe.
2. 128*128
3. glGetError() liefert immerzu den Wert 1282. Was bedeutet das? Dast ist aber schon beim Programmstart so.
-
Ah, ich glaube ich habe den Fehler gefunden. Ich rufe LadeTextur() schon vor der Initialisierung von OpenGL auf. Rufe ich es später auf, so funktioniert es.