[SDL + OGL] surfaces -> texturen



  • hi,
    gibt es ne möglichkeit SDL_Surface's in opengl texturen zu konvertieren? oder muss ich manuell die dateien in ne glubyte variable laden usw.?
    also das soll so aussehen, dass ich ne variable vom typ SDL_Surface habe und ich in die ne bilddatei lade. dann will ich ne textur für opengl generieren und zwar auf basis der SDL_Surface variable damit ich das nicht komplett neu laden muss...
    danke im voraus
    mfg
    Black Sting



  • Bin ja mal net so:

    // /////////////////////////////////////////////////
    // PUBLIC 
    //
    // Läd eine Bitmap in den Texturmanager.
    //
    // [in] FileName: Name der zu ladenen Bitmap
    // /////////////////////////////////////////////////
    void CTextureManager::loadTexture (std::string FileName)
    {
    		// Teste ob Textur schon geladen
    	if (!(getTexture (FileName) == -1))
    		return;
    
    		// Teste ob datei überhaupt existiert.
    	std::ifstream FileStream(FileName.c_str()); 
    
        if (!FileStream.good()) 
    	{
    			// Datei existiert nicht, Warnung ins Protokoll schreiben.
    		PROTOKOLL.write (MESSAGE_FILENOTFOUND(FileName, LOG_PARAMS));
    
    			// Und Funktion abbrechen.
    		return;
    	}
    
    		// Temporäres Objekt anlegen und namen geben.
    	TextureItem temp;
    	temp.FileName = FileName;
    
    		// Bitmap in SDL-Surface laden.
    	SDL_Surface *Texture(SDL_LoadBMP(FileName.c_str())); 
    
    		// Textur für OpenGL generieren.
    	glGenTextures(1, &temp.texID); 
    	glBindTexture(GL_TEXTURE_2D, temp.texID); 
    	glTexImage2D(GL_TEXTURE_2D, 0, 3, Texture->w, Texture->h, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, Texture->pixels); 
    
    		// SDL-Surface wieder freigeben und auf NULL setzen.
    	if (Texture != NULL)
    	{
    		SDL_FreeSurface(Texture); 
    		Texture = NULL;
    	}
    
    		// Noch einen Linearen Filter reinhauen
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    
    	PROTOKOLL.write (MESSAGE_FILENOTFOUND("Textur Geladen", LOG_PARAMS));
    
    		// und ab damit in den Vector pushen.
    	this->m_vec_Textures.push_back (temp);
    }
    

    Den Rest kannste Dir ja denken 😃



  • hey, super, vielen dank 🙂
    is ja einfacher als erwartet 🙂
    mfg
    Black Sting



  • googel mal ein bischen nach "testgl.c".
    Irgendwo im CVS von SDL ist genau eine solche Funktion.


Anmelden zum Antworten