OGL: Texturen
-
Hallo,
ich habe 2 Fragen:
- Ich habe eine Funktion, die mir die verschiedenen Texturen lädt:
bool load_texture (vector<GLuint> *texture, vector<SDL_Surface*> *surface, vector<GLenum> *texture_format, char file []) { glDeleteTextures (1, &m_textures [i]); (*surface).push_back (SDL_LoadBMP (file)); int pos = (*surface).size () - 1; int colors = ((*surface) [pos])->format->BytesPerPixel; if (colors == 4) { if (((*surface) [pos])->format->Rmask == 0x000000ff) (*texture_format).push_back (GL_RGBA); else (*texture_format).push_back (GL_BGRA); } else if (colors == 3) { if (((*surface) [pos])->format->Rmask == 0x000000ff) (*texture_format).push_back (GL_RGB); else (*texture_format).push_back (GL_BGR); } else { cout << "ERROR unbekannter Farbkanal" << endl; return false; } (*texture).push_back (0); glGenTextures (1, &((*texture) [pos])); glBindTexture (GL_TEXTURE_2D, (*texture) [pos]); 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, colors, ((*surface) [pos])->w, ((*surface) [pos])->h, 0, (*texture_format) [pos], GL_UNSIGNED_BYTE, ((*surface) [pos])->pixels); if ((*surface) [pos]) SDL_FreeSurface ((*surface) [pos]); return true; }
nun habe ich verschiedene Klassen, die jeweils Texturen darstellen können. Diese werden mit obiger Funktion geladen. (jede Klasse besitzt Vektoren, in denen die Daten für die Texturen gespeichert sind)
In der ersten Klasse klappt das wunderbar, da habe ich mehrere Texturen die wunderbar angezeigt werden. Nun habe ich eine zweite Klasse, dort wird allerdings immer die Textur angezeigt, die als letztes von der ersten Klasse geladen wurde.
Dann bin ich auf Fehlersuche gegangen. Ich dachte, vielleicht liegt es am " glBindTexture (GL_TEXTURE_2D, (*texture) [pos]);" in der obigen Funktion. Eigentlich brauche ich das ja nicht, die Textur soll ja nur geladen werden. Wenn diese benutzt werden, dann werden die sowieso gebunden, wie gerade benötigt wird.
Wenn ich allerdings das hier schon entferne, dann werden gar keine Texturen angezeigt, das ist das erste, was ich nicht verstehe...#-------------------
EDIT
hab den Fehler gefunden. Ich hatte die Textur nach dem glBegin () gebunden, daher hatte er dann die andere genommen.
-------------------
die zweite frage bezieht sich auf das Löschen der Texturen. Im Destruktor der Klassen sieht wie folgt aus:
for (int i = 0; i < m_textures.size (); i++) { glDeleteTextures (1, &m_textures [i]); SDL_FreeSurface (m_surface [i]); }
ich will also die Texturen löschen und den Speicher wieder freimachen. Wenn ich das aber mache, so hängt das Programm öfter, wenn der Destruktor aufgerufen wurde. Das liegt am SDL_FreeSurface, ohne dem passiert das nicht. Liegt es daran, dass die beiden Funktionen sich irgendwie überschneide? Dass glDeleteTextures schon Daten löscht, die SDL_FreeSurface noch benötigt?
-
hat niemand eine idee zu zweiten frage?
-
Aus Deinem Code ist nicht ersichtlich, was (bzw ob ueberhaupt) in m_surface drin ist.
-
erstmal ist da gar nichts drin. ich übergebe der funktion einen vektor, der dann die ganzen surfaces enthält. in der Funktion wird ein neues erstellt und dem vektor hinzugefügt:
(*surface).push_back (SDL_LoadBMP (file));
-
Und am Ende der Funktion loescht Du das Surface wieder.
-
hallo,
das ist ja peinlich,.. kein wunder, dass da nur mist rauskommt, wenn ich den speicher schon längst freigegeben habe.
da muss ich mich für die frage entschuldigen!