Image dateien laden und darstellen ?
-
Hi,
ich möchte mit OpenGl Imagedateien (Bmp, Tga, Png) in beliebiger größe darstellen und laden. Ich möchte keine vorgefertigten libs wie die libPng oder so verwenden sondern den Lader selbst coden.
Mit Bmp's hat das ja schon gut funktioniert aber nur für Bitmaps die nicht größer sind als 256 auf 256 Pixel
!Hier mal mein Code:
#include <SDL/SDL.h> #include <SDL/SDL_opengl.h> #include <gl/glaux.h> #ifdef _WIN32 #undef main #endif AUX_RGBImageRec *LoadBMP(char *Filename); // Lädt ein BMP int LoadGLTextures(); int init(); void animate(); GLuint MyTexture[1]; // Texturspeicher AUX_RGBImageRec *LoadBMP(char *Filename) // Lädt ein BMP { FILE *File = NULL; // Das File Handle if (!Filename) // Ist ein Dateiname übergeben worden? { return NULL; // offenbar nicht... Abbruch } File = fopen(Filename,"r"); // Versuch die Datei zu öffnen if (File) // Existiert die Datei? { fclose(File); // Datei schließen return auxDIBImageLoad(Filename); // BMP laden und Zeiger (Pointer) zurückgeben, // der auf die Bilddaten verweist } return NULL; // Laden hat nicht geklappt } int LoadGLTextures() // Bitmaps laden und konvertieren { int Status = FALSE; // Status ersteinmal auf FALSE setzen AUX_RGBImageRec *texture[1]; // Speicherplatz für die Textur schaffen memset (texture,0,sizeof(void *)*1);//Vorher sichergehen das dieser auch leer ist //*************************** Hier wird die Textur eingelesen ************************************* if (texture[0] = LoadBMP("Name_der_Bitmap.bmp")) // Bitmap laden { Status=TRUE; // hat geklappt. glGenTextures(1, &MyTexture[0]); // Textur wird erstellt glBindTexture(GL_TEXTURE_2D, MyTexture[0]); glTexImage2D(GL_TEXTURE_2D, 0, 3, texture[0]->sizeX, //Es handelt sich um eine 2D Textur texture[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture[0]->data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // GL_LINEAR wird für GL_TEXTURE_MIN_FILTER genutzt glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // GL_LINEAR wird für GL_TEXTURE_MAG_FILTER genutzt } if (texture[0]) // Existiert TextureImage[0]? { if (texture[0]->data) // enthält sie Bilddaten? { free(texture[0]->data); // wenn ja, dann diese Bilddaten löschen } free(texture[0]); // Und auch die Struktur an sich löschen. } return Status; } int init() { if (SDL_Init (SDL_INIT_VIDEO)!=0) { printf ("Error: %s\n", SDL_GetError ()); return 1; } // atexit(SDL_Quit); SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); if (SDL_SetVideoMode (640, 480, 32, SDL_OPENGL)==NULL) { printf ("Error: %s\n", SDL_GetError ()); return 1; } SDL_WM_SetCaption ("OpenGL with SDL!", "OpenGL"); glViewport (80, 0, 480, 480); glMatrixMode (GL_PROJECTION); glLoadIdentity (); glFrustum (-1.0, 1.0, -1.0, 1.0, 1.0, 100.0); // glClearColor (0, 0, 0, 0); glMatrixMode (GL_MODELVIEW); return 0; } void animate() { glLoadIdentity (); glTranslatef (0, 0, -2); glClear (GL_COLOR_BUFFER_BIT); // glRotatef (1, 0, 1, 0); glBegin (GL_QUADS); glTexCoord2f (0, 0); glVertex3f (-1, -1, 0); glTexCoord2f (1, 0); glVertex3f ( 1, -1, 0); glTexCoord2f (1, 1); glVertex3f ( 1, 1, 0); glTexCoord2f (0, 1); glVertex3f (-1, 1, 0); glEnd (); SDL_GL_SwapBuffers (); glFlush (); SDL_Delay (5000); } int main() { init(); LoadGLTextures (); glEnable (GL_TEXTURE_2D); glShadeModel (GL_SMOOTH); animate(); return 0; }Könnt Ihr mir da weiterhelfen, gibts da Tuts oder Snippets zu dem Thema ?
Vielen Dank vorab

ShadowEater
-
Wo hast du dir denn den Loader selbst geschrieben, für Bitmaps? du verwendest dafür doch grad OpenGL!
-
Ja eben,
sry, wenn Du mich nicht verstanden hast, dann hab ich mich zweideutig ausgedrückt.
Ich möchte den Loader von Hand Coden, kennst Du da ein tut ???Gruß
ShadowEater
-
Schau mal unter wikipedia, da ist beschrieben wie die Dateien aufgebaut sind. Mit dieser Information kannst du dann mit fstream die Dateien laden und daraus Byteweise die einzelnen Informationen rausnehmen(Bei BMP ist dies kein Problem da die Infos eins zu eins übernomen werden können, bei PNG und Tga musst du zudem die Kompremierung mitbedenken und die Gewonnen Bilddaten umrechnen da musst du dir jeweils ansehen wie die einzelnen Umrechnungsmethoden funktionieren).
-
Ich würde in bereits bestehende open-source Engines schauen.
-
Danke für eure Antworten, werd gleich mal bei Wiki schauen, bei Fragen meld ich mich ! ;))
Gruß
ShadowEater
-
http://openil.sourceforge.net/
damit kannst du das meiste sehr einfach in opengl einladen und auch relativ einfach dann mit ogl darstellen.
-
Danke rapso

Gruß
Shadoweater