OpenGL: glGenTextures schlägt wahrscheinlich fehl



  • Ich habe mal versucht meine engine etwas umzuschreiben.
    Ich wollte einen schön gegliederten Ansatz schaffen um mal ein paar Effekte zu implementieren und OpenGL zu lernen.
    Leider mit ein paar Problemen.
    Ich hatte eine Funktion geschrieben um Texturen zu Laden und den Identifier zurück zu geben.

    Das ist diese Funktion:

    inline bool LoadTexture (const char *filename, GLuint &textureID, int wrap = 0)
    {
    	fipImage fimage;
    	if(fimage.load(filename) ) {
    		float fWidth = fimage.getWidth(); float fLength = fimage.getHeight();
    
    		glGenTextures (1, &textureID);
    		std::cout<<"Textur ID: "<<textureID<<std::endl;
    		glBindTexture (GL_TEXTURE_2D, textureID);
    		std::cout<<"Texture binded"<<std::endl;
    
    		if(fimage.getImageType() == FIT_BITMAP) {
    			std::cout<<"Texture is BITMAP"<<std::endl;
    			if(fimage.getBitsPerPixel() == 24)
    				glTexImage2D(GL_TEXTURE_2D,0,3,fWidth,fLength,0,GL_RGB,GL_UNSIGNED_BYTE,fimage.accessPixels() );
    			else if(fimage.getBitsPerPixel() == 32)
    				glTexImage2D(GL_TEXTURE_2D,0,4,fWidth,fLength,0,GL_RGBA,GL_UNSIGNED_BYTE,fimage.accessPixels() );
    			else return -1;
    		}
    		// when texture area is small, bilinear filter the closest mipmap
    		//glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
    		//			GL_LINEAR_MIPMAP_NEAREST );
    		// when texture area is large, bilinear filter the first mipmap
    		//glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    
    		// if wrap is true, the texture wraps over at the edges (repeat)
    		//       ... false, the texture ends at the edges (clamp)
    		//glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap ? GL_REPEAT : GL_CLAMP );
    		//glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap ? GL_REPEAT : GL_CLAMP );
    
    		// build our texture mipmaps
    		//gluBuild2DMipmaps(GL_TEXTURE_2D, 3, fWidth, fLength, GL_BGR, GL_UNSIGNED_BYTE, fimage.accessPixels() ); 
    	}
    	else {
    		printf ("could not load image %s\n", filename );
    		textureID = 0;
    		return false;
    	}
    
    	fimage.clear();
    	return true;
    }
    

    Damit habe ich dann z.B. meine Skybox geladen:

    GLuint up; LoadTexture("/home/Xerces/devel/engine_0.4/bin/sky/up.bmp", up);
    	GLuint left; LoadTexture("/home/Xerces/devel/engine_0.4/bin/sky/left.bmp", left);
    	GLuint mid; LoadTexture("/home/Xerces/devel/engine_0.4/bin/sky/mid.bmp", mid);
    	GLuint right; LoadTexture("/home/Xerces/devel/engine_0.4/bin/sky/right.bmp", right);
    	GLuint beh; LoadTexture("/home/Xerces/devel/engine_0.4/bin/sky/beh.bmp", beh);
    	GLuint down; LoadTexture("/home/Xerces/devel/engine_0.4/bin/sky/down.bmp", down);
    

    Das hatte auch alles funktioniert, allerdings stürzt der Kram nun bei scheinbar identischen Code ab.
    Deshalb habe ich etwas gesucht. Es scheint wirklich an dieser Funktion zu liegen ): Und das ist meine Ausgabe:

    Textur ID: 134582720                                                                                                                                                             
    Texture binded                                                                                                                                                                   
    Texture is BITMAP                                                                                                                                                                
    Textur ID: 134583032                                                                                                                                                             
    Texture binded                                                                                                                                                                   
    Texture is BITMAP                                                                                                                                                                
    Textur ID: 134520564                                                                                                                                                             
    Texture binded                                                                                                                                                                   
    Texture is BITMAP                                                                                                                                                                
    Textur ID: 134522842                                                                                                                                                             
    Texture binded                                                                                                                                                                   
    Texture is BITMAP                                                                                                                                                                
    Textur ID: 3217292072                                                                                                                                                            
    Texture binded                                                                                                                                                                   
    Texture is BITMAP                                                                                                                                                                
    Textur ID: 134570288                                                                                                                                                             
    Texture binded                                                                                                                                                                   
    Texture is BITMAP
    

    Der zurückgegebene ID ist im Vergleich zu meiner andren engine viel größer.
    Eigentlich sollte es ja bei 1 anfangen zu zählen. Das heißt bei mir (da 6 Texturen geladen werden) sollte 1 - 6 zurück geliefert werden.
    Kann mir jemand weiter helfen. Warum werden keine Texturen geladen?


  • Mod

    1. was glGenTextures zurueckliefert sollte vom treiber abhaengen.
    2. wieso fragst du nicht einfach errors ab statt uns? 😉

    :xmas2:



  • Hallo gentoo,

    ich habe ein ähnliches Problem wie Du;
    wenn ich die Textur-ID via Referenz an die Methode übergebe, dann erhalte ich
    ebenso hohe ID-Werte wie Du.

    Versuch mal, vor dem glGenTextures eine GLuint-Variable zu deklarieren,
    "GLuint texID = 0;"
    und diese zu verwenden.

    Dann damit glGenTextures aufrufen ...
    "glGenTextures(1, &texID);"
    ... und abschliessend den Wert von texID
    der Referenz textureID zuweisen.

    Kleiner Tipp noch bzgl. Speicher:
    Du kannst nachdem alle Einstellungen vorgenommen wurden für die Textur
    mit "glBindTexture( GL_TEXTURE_2D, 0)" die Bindung wieder lösen und sogar
    den Speicher von fimage wieder freigeben. Über die generierte Textur-ID findet OpenGL den zugewiesenen Inhalt wieder.


Anmelden zum Antworten