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.
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