mehrere bitmaps laden u als textur verwenden



  • hi!

    hab das NeHe - tut nr. 6 durchgearbeitet und n bisl verändert ... hier mal eine frühe version eines tutorials:

    www.sirnonamesplace.de/tut_texturen.htm

    der rest meines codes ist der vom tutorial nr.1 (unverändert).

    es funktioniert alles einwandfrei, das bitmap wird geladen, in eine textur umgewandelt und "aufgesetzt". super! aber wie mach ich das, wenn ich ein zweites bitmap auf eine zweite fläche kleben will? 😕

    hab ja die theorie, dass ich dann die

    if (TextureImage[0]=LoadBMP("Data/bitmap.bmp")) // Bitmap laden aus dem angegebenen Pfad
    

    immer wieder für jede textur wiederholen muss ... ist das richtig? oder muß ich irgendwas mit der

    glGenTextures(1, &texture[0]);
    

    machen? ... steht ja da, dass die erste zahl erhöht werden soll, wenn mehrere texturen geladen werden sollen. aber wie krieg ich dann den pfad der zweiten textur rein? .... hmmmm ..... ?

    thx für eure zeit u ihr könnt ja mal über meine seite herziehen 😉

    SirNoname



  • habs mal vor einiger Zeit auch gemacht, allerdings die Filter verändert :
    also 3 mal die selbe Textur mit nem anderen Filter

    ...
    GLuint texture[3]; // Texturspeicher
    ...
    
    	AUX_RGBImageRec *TextureImage[1];   // Speicherplatz für Textur im Array schaffen
    	memset(TextureImage,0,sizeof(void *)*1); //Test, ob Speicher leer ist
    
    	if (TextureImage[0]=LoadBMP("Data/Logo.bmp")) // Bitmap laden
    	{
    		Status=TRUE; // Laden erfolgreich
    		glGenTextures(3, &texture[0]); // Texturen werden erstellt
    // Nearest Filtered Texture
    		glBindTexture(GL_TEXTURE_2D, texture[0]);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    		glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX,
    			TextureImage[0]->sizeY, 0, GL_RGB,
    			GL_UNSIGNED_BYTE, TextureImage[0]->data);
    // Linear Filtered Texture
    		glBindTexture(GL_TEXTURE_2D, texture[1]);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    		glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX,
    			TextureImage[0]->sizeY, 0, GL_RGB,
    			GL_UNSIGNED_BYTE, TextureImage[0]->data);
    // Mipmapping Texture
    		glBindTexture(GL_TEXTURE_2D, texture[2]);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
    		gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, 
    		TextureImage[0]->sizeY, GL_RGB,
    		GL_UNSIGNED_BYTE, TextureImage[0]->data);
    	}
    	if (TextureImage[0]) // Existiert TextureImage[0]?
    	{
    		if (TextureImage[0]->data) // enthält Textur Bilddaten?
    		{
    			free(TextureImage[0]->data); // Bilddaten löschen
    		}
    		free(TextureImage[0]); // Struktur an sich löschen.
    	}
    	return Status; // Status zurückgeben
    

    bei einer weitern musst du lediglich den Speicher im Array erhöhen

    AUX_RGBImageRec *TextureImage[2]   // Speicherplatz für Textur im Array schaffen
    ; im folgenden dann
    
    	if (TextureImage[1]=loadBMP("Data/LogoXXX.bmp")) // Bitmap laden
    	{
    		Status=TRUE; // Laden erfolgreich
    		glGenTextures(3, &texture[1]); // Texturen werden erstellt
    

    (0 durch 1 ersetzt)....

    und dann auch im folgenden Code mit (TextureImage[1] arbeiten... ok ist ansicht denke ich alles in allem net ellegant..(ist halt die Struktur von dem Tuto übernommen) aber hatte mich danach leider erstmal net weiter mit OGL beschäftigt...



  • SirNoname schrieb:

    es funktioniert alles einwandfrei, das bitmap wird geladen, in eine textur umgewandelt und "aufgesetzt". super! aber wie mach ich das, wenn ich ein zweites bitmap auf eine zweite fläche kleben will?

    Manche denken beim Computer funktionert alles digital. Stimmt nicht. Das hier funktioniert analog. 😎

    Bye, TGGC \-/



  • TGGC schrieb:

    Manche denken beim Computer funktionert alles digital. Stimmt nicht. Das hier funktioniert analog. 😎

    Röhren rulen! 😋 👍



  • thx für die antwort ... aber das mit dem "analog" hab ich schon ausprobiert ... hier mal mein code:

    int LoadGLTextures() 
    {
    AUX_RGBImageRec *TextureImage[1]; // Platz für wichtige Daten des Bitmaps wie Breite und Höhe
    memset(TextureImage,0,sizeof(void *)*1); // diesen Platz löschen, damit er ganz sicher leer ist
    
    if (TextureImage[0]=LoadBMP("Data/bitmap.bmp")) // Bitmap laden aus dem angegebenen Pfad
    {
    glGenTextures(1, &texture[0]); 
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    }
    // Im Folgenden wird der RAM, der zum Speichern der Textur benötigt wurde, gelöscht. 
    if (TextureImage[0]) // wenn die Textur existiert
    {
    if (TextureImage[0]->data) // und das Bild auch (also Daten)
    {
    free(TextureImage[0]->data); // Free The Texture Image Memory 
    }
    free(TextureImage[0]); // Free The Image Structure
    }
    
    // 2222222222222222222222222222222
    if (TextureImage[1]=LoadBMP("Data/bitmap2.bmp")) // Bitmap laden aus dem angegebenen Pfad
    {
    glGenTextures(1, &texture[1]); 
    glBindTexture(GL_TEXTURE_2D, texture[1]);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[1]->sizeX, TextureImage[1]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[1]->data);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    }
    // Im Folgenden wird der RAM, der zum Speichern der Textur benötigt wurde, gelöscht. 
    if (TextureImage[1]) // wenn die Textur existiert
    {
    if (TextureImage[1]->data) // und das Bild auch (also Daten)
    {
    free(TextureImage[1]->data); // Free The Texture Image Memory 
    }
    free(TextureImage[1]); // Free The Image Structure
    }
    // 222222222222222222222222222222222222
    
    return TRUE;
    }
    

    wenn ich das so ausführe, verschwindet das ogl-fenster sofort wieder, ohne dass man sieht, was angezeigt wird. ... und wenn ich das mit dem

    AUX_RGBImageRec *TextureImage[2]; 
    memset(TextureImage,0,sizeof(void *)*1);
    

    reinbringe, kommt schon beim compilieren nen fehler.

    ... 😕 😕 😕 ...

    SirNoname



  • jut ... hat sich alles erledigt, habs hingekriegt ^^.

    wer damit noch probleme hat, soll auf meine page gehen ... da werd ich nen tut drüber veröffentlichen.

    www.sirnonamesplace.de

    SirNoname



  • ich denke die community hier wäre glücklicher darüber wenn du hier mal eben postest, wie du dein prog berichtigt hast, anstatt über deine hp zu gehn über irgendein tut -.-



  • naaa gut ... weil ihr`s seid 😉

    also hier mal die kurzfassung:

    #include <stdio.h>
    
    GLuint texture[2];
    
    AUX_RGBImageRec *LoadBMP(char *Filename)
    {
    FILE *File=NULL; //Zeiger auf die Bitmap-Datei
    return auxDIBImageLoad(Filename); // Bitmap laden und Pointer darauf zurückgeben
    }
    
    int LoadGLTextures()
    {
    AUX_RGBImageRec *TextureImage[2];
    memset(TextureImage,0,sizeof(void *)*2);
    
    // 1. TEXTUR
    if (TextureImage[0]=LoadBMP("Data/bitmap.bmp"))
    {
    glGenTextures(1, &texture[0]);
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    }
    // Löschen des Speichers, der für das Laden der 1. Textur gebraucht wurde
    if (TextureImage[0]) // wenn die Textur existiert
    {
    if (TextureImage[0]->data) // und das Bild auch (also Daten)
    {
    free(TextureImage[0]->data); // Free The Texture Image Memory
    }
    free(TextureImage[0]); // Free The Image Structure
    }
    
    // 2. TEXTUR
    if (TextureImage[1]=LoadBMP("Data/bitmap2.bmp")) // Bitmap laden aus dem angegebenen Pfad
    {
    glGenTextures(1, &texture[1]);
    glBindTexture(GL_TEXTURE_2D, texture[1]);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[1]->sizeX, TextureImage[1]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[1]->data);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    }
    // // Löschen des Speichers, der für das Laden der 2. Textur gebraucht wurde
    if (TextureImage[1]) // wenn die Textur existiert
    {
    if (TextureImage[1]->data) // und das Bild auch (also Daten)
    {
    free(TextureImage[1]->data); // Free The Texture Image Memory
    }
    free(TextureImage[1]); // Free The Image Structure
    }
    return TRUE;
    }
    
    int InitGL(GLvoid)
    {
    LoadGLTextures();
    glEnable(GL_TEXTURE_2D); // Texture Mapping
    glShadeModel(GL_SMOOTH); // Smooth Shading
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // schwarzer Hintergrund
    glClearDepth(1.0f); // Depth Buffer Setup
    glEnable(GL_DEPTH_TEST); // Depth Testing
    glDepthFunc(GL_LEQUAL); // Typ des Depth Testing
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Berechnungen für die Perspektive
    return TRUE;
    }
    
    int DrawGLScene(GLvoid)
    {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Bildschirm löschen
    glLoadIdentity(); // Sicht auf Standart zurücksetzen
    glTranslatef(0.0f,0.0f,-5.0f); //Kamera zurückfahren, damit man was sieht
    
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    // Die Textur texture[0] wird geladen. Wenn eine andere geladen werden soll, muss die Null in der eckigen Klammer durch 1, 2, ... ersetzt werden.
    
    glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
    glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
    glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
    glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
    glEnd();
    
    return TRUE;
    }
    
    glDeleteTextures(2,&texture); // Graka-Speicher freigeben
    

    ... bitte 🙂 und schön abend noch!

    fragen @ me

    SirNoname



  • btw:
    ich selber hab keine ahnung von OpenGL, ich wollte nur die form wahren ^^



  • Schonmal was von ner For-Schleife gehört? 😕 Würde den Code wohl etwas verbessern.

    Nehe selbst hat's nen paar Tutorials später übrigens dann so gemacht:

    int LoadGLTextures()								// Load Bitmaps And Convert To Textures
    {
    	int Status=FALSE;							// Status Indicator
    	AUX_RGBImageRec *TextureImage[5];					// Create Storage Space For The Texture Data
    	memset(TextureImage,0,sizeof(void *)*5);				// Set The Pointer To NULL
    
    	if ((TextureImage[0]=LoadBMP("Data/logo.bmp")) &&			// Logo Texture
    	    (TextureImage[1]=LoadBMP("Data/mask1.bmp")) &&			// First Mask
    	    (TextureImage[2]=LoadBMP("Data/image1.bmp")) &&			// First Image
    	    (TextureImage[3]=LoadBMP("Data/mask2.bmp")) &&			// Second Mask
    	    (TextureImage[4]=LoadBMP("Data/image2.bmp")))			// Second Image
    	{
    		Status=TRUE;							// Set The Status To TRUE
    		glGenTextures(5, &texture[0]);					// Create Five Textures
    
    		for (loop=0; loop<5; loop++)					// Loop Through All 5 Textures
    		{
    			glBindTexture(GL_TEXTURE_2D, texture[loop]);
    			glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    			glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    			glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[loop]->sizeX, TextureImage[loop]->sizeY,
    				0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[loop]->data);
    		}
    	}
    	for (loop=0; loop<5; loop++)						// Loop Through All 5 Textures
    	{
    		if (TextureImage[loop])						// If Texture Exists
    		{
    			if (TextureImage[loop]->data)				// If Texture Image Exists
    			{
    				free(TextureImage[loop]->data);			// Free The Texture Image Memory
    			}
    			free(TextureImage[loop]);				// Free The Image Structure
    		}
    	}
    	return Status;								// Return The Status
    }
    


  • hmm .... ja .... wär bald dazu gekommen, spätestens wenn ich mehr als 3 texturen zu laden hätte *g*

    werd ich auch in mein tut aufnehmen, thx für den code!

    SirNoname


Anmelden zum Antworten