SDL + OpenGL Darstellungsproblem
-
Hi,
ich arbeite am anzeigen von Texturen mit OpenGL
und habe mir aus einem Tutorial eine Ladefunktion geholt.
Die selbsgeschriebene Darstellungsfunktion funktioniert auch bei dem in dem Tutorial mitgeliefertem bild ohne Fehler, jedoch nicht bei normalen mit Paint erstellten bmps, jpgs und gifs. Das einzige was ich in der Ladefunktion ersetzt habe ist IMG_Load anstelle SDL_LoadBMP. Bei den mit paint erstellten bmps oder andern formaten die mit IMG_Load aus SDL_image eigentlich gehen sollten wird blos ein weißes quadrat in der richtigen Größe gezeichnet, jedoch nicht texturiert.Hier die Daten der Klasse:
public: void DrawTexture(string filename,int x,int y); unsigned LoadTexture(string filename); private: SDL_Surface *bitmap,*conv;
Die Ladefunktion:
unsigned Engine::LoadTexture(string filename) { /* Eine Bitmap laden */ unsigned texture; bitmap = IMG_Load(filename.c_str()); if (!bitmap) { cout << "Error: %s\n" << SDL_GetError(); exit(1); } conv = SDL_CreateRGBSurface(SDL_SWSURFACE, bitmap->w, bitmap->h, 32, #if SDL_BYTEORDER == SDL_BIG_ENDIAN 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff); #else 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); #endif SDL_BlitSurface(bitmap, 0, conv, 0); glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glPixelStorei(GL_UNPACK_ROW_LENGTH, conv->pitch / conv->format->BytesPerPixel); glTexImage2D(GL_TEXTURE_2D, 0, 3, conv->w, conv->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, conv->pixels); glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); SDL_FreeSurface(bitmap); SDL_FreeSurface(conv); return texture; }
Die Darstellungsfunktion:
void Engine::DrawTexture(string filename,int x,int y) { unsigned g_texPicture = LoadTexture(filename); glColor3ub(255, 255, 255); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, g_texPicture); glBegin(GL_QUADS); // Display the top left vertice glTexCoord2f(0,0); glVertex2i(x,y); // Display the bottom left vertice glTexCoord2f(1,0); glVertex2i(x+bitmap->w,y); // Display the bottom right vertice glTexCoord2f(1,1); glVertex2i(x+bitmap->w,y+bitmap->h); // Display the top right vertice glTexCoord2f(0,1); glVertex2i(x,y+bitmap->h); glEnd(); glDeleteTextures(1, &g_texPicture); }
Ich bitte um hilfe,
vielen dank im voraus.[EDIT]Es funktioniert auch nicht wenn ich IMG_Load mit SDL_LoadBMP ersetze und mit paint erstellte bmps lade, der selbe fehler tritt auf.
PS: Das bild das funktioniert ist schwarz weiß. Ich denke aber es liegt an der farbtiefe...[/EDIT]MfG Max
-
Sind die Bilder quadratisch und ggf. PowerOf2?
Z.B. 128x128 oder 256x256?Sonst vergleich doch die beiden BMPs mal in einem GrafikProg? Farbtiefe? Besonderheiten bzgl. RGB/CMYK Codierung?
-
Edit: Ich habe nun herausgefunden das quadratische Texturen funktionieren (getestet : 128x128 und 256x256, egal ob bmp oder jpg)
Weiß jemand was ich ändern muss damit auch unquadratische Texturen funktionieren oder kennt eine andere Laderoutine. (Am besten SDL, kein Glaux oder andere Libs...)
Ich weis leider nicht was PowerOf2 bedeutet.
www.google.de schrieb:
Power of 2. The one-to-one coaching system for maths success. With Power of 2,
anyone can support students who are struggling to learn maths. ...Vielen dank.
-
Ich vermute einfach einmal das es nur an der Laderoutine, bzw. nur am konvertieren der Textur liegt? Kennt jemand eine andere Laderoutine in SDL oder kann mir bei dieser helfen? Ich finde nur Laderoutinen mit Glaux oder mit einzelnen Libs wie der jpg lib. Ich möchte SDL_image weiter nutzen können und wäre euch desshalb sehr dankbar wenn ihr mir helft.
Vielen dank.
MfG Max
-
Ohne Powerof2 kommst du nicht weit mit standard GL. Dafuer gibts jetzt eine ARB Extension. Bisher variierte es von Treiber zu Treiber. Manche Funktionierten mit Non PO2 manche nicht.
-
Um es nochmal klarzustellen: Eine Zahl k nennt man "Powerof2", wenn sie die n element N existiert, für das k = 2 hoch n gilt.
Bye, TGGC Deine Unterstützung wird gebraucht!
-
SnorreDev schrieb:
Ohne Powerof2 kommst du nicht weit mit standard GL. Dafuer gibts jetzt eine ARB Extension. Bisher variierte es von Treiber zu Treiber. Manche Funktionierten mit Non PO2 manche nicht.
Also im klartext mit Standard GL oder SDL kann ich keine nicht quadratischen Bilder laden. (Also mit SDL geht es ja, aber das konvertieren oder texturieren des quad
funktioniert dann nicht?)Ich weiß, das sind saublöde fragen:
Wo finde ich informationen zu PowerOf2?Bitte gebt mir ein paar links etc. ich komme nicht weiter und weiß auch nicht genau nach was ich suchen soll. Ich finde auch keine klassen die das können etc. .
Vielen dank.
-
Wie TGGC schon sagte:
Mit PowerOf2meine ich einfach, daß die Bildbreite bzw. -höhe eine 2er-Potenz sein soll / muß:
Also z.B. 128 x 256
Bei 3D-Grafiken auf Consumer-Karten ist das so gebräuchlich.
2^0=1, 2^1=2, 2^2=4, 2^3=8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, ... (spätestens ab hier werden Texturgrößen normalerweise nicht mehr unterstützt...
)
Capiesche jetz'?
P.S.: Üblicherweise nimmt man NUR PowerOf2-Texturen, und regelt über die Texturkoordinaten dann die "echte" Ansicht (d.h. auch 56x713 oder so...).
-
Mensch, war ich dämlich.
Naja, also wenn ich das richtig sehe ist dann eine 1024x768 Textur nicht möglich.
Deshalb muss ich eine größere nehmen z.B. 1024x1024.
Speicherverschwendung!Vielen dank an alle.
MfG Max
-
Master_Max schrieb:
Mensch, war ich dämlich.
Allerdings.
Master_Max schrieb:
Deshalb muss ich eine größere nehmen z.B. 1024x1024.
Speicherverschwendung!Ansonsten wär's Performanzverschwendung... - wenn Dir das lieber ist...
-
Master_Max schrieb:
Speicherverschwendung!
der kluge mann denkt mit, macht aus der not eine tugend und benutzt den ganzen freien platz eben für was anderes... nen stapel buttons oder icons braucht man z.b. fast immer irgendwo.