SDL_Surface auf openGL textur abbilden klappt nicht.
-
Moin,
ich versuche gerade eine kleine schnelle 2D API (für mich selbst) zu schreiben. Dazu möchte ich SDL und OpenGL verwenden (vll später auch noch cairo).
Naja, im moment hänge ich ziemlich daran eine SDL_Surface in eine OpenGL textur umzuwandeln. Bei meinem ersten versuch kam nur müll raus. ALso habe ich mich mal im internet ungesehen. Aber auch die funktionen die ich dort fand funktionieren irgendwie nicht richtig...
Könnt ihr mir helfen? Hier findet ihr mein projekt und alle Quelltexte. Mein ziel ist es die datei test.png über open gl auszugeben...
Hier noch ein screenshot was stattdessen dabei herauskommt. Das rote kreuz ist gewollt aber die grafik ist müll...Im archiv befindet sich eine kleine readme. Ihr solltet die auflösung unterumständen herunterstellen. Ich verwende 1280x1024.
Vielen dank im voraus,
ProphetEDIT: Mir ist klar das das ganze ziemlich unstrukturiert wirkt aber im moment geht es mir ja auch noch daraum die funktionalität zu erzeugen nicht meinen programmierkomfort zu erhöhen. ;P
-
Folgender Code funktioniert bei mir:
http://www.libsdl.org/cgi/docwiki.cgi/OpenGL_20Texture_20Example(wenn du BMPs laedst, solltest du mode GL_BGA verwenden, bei mir funktioniert das allerdings nicht)
-
Ich habe die von dir verlinkte methode bei mir eingebunden. Einfach die alte dagegen ausgetauscht. Ich habe das bild auch auf 64x64 skaliert damit dort keine fehler entstehen (in einer Bildverarbeitung).
Das bild ist also wieder hin...
-
Prophet05 schrieb:
Ich habe die von dir verlinkte methode bei mir eingebunden. Einfach die alte dagegen ausgetauscht. Ich habe das bild auch auf 64x64 skaliert damit dort keine fehler entstehen (in einer Bildverarbeitung).
Das bild ist also wieder hin...
Dann vermute ich, dein Problem liegt anderswo. Aber tut mir leid, ich (und wahrscheinlich auch sonst niemand) werd mich nicht durch deinen ganzen Code wuehlen, grenz das Problem ein und poste hier einen kurzen Testfall, dann kann dir sicher jemand weiterhelfen

-
Also ich habe folgendes anweisungen ausgeführt um zu meinem ergebnis zu kommen:
// Initialisierung Uint32 Width = 1024; Uint32 Height = 768; SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 ); SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 ); SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 ); SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 ); SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); glShadeModel(GL_SMOOTH); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glViewport(0, 0, Width, Height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, Width, Height, 0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // ======================================================== // // DrawGl Funktions aufruf. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glBegin(GL_LINES); glColor3ub(255, 0, 0); glVertex3i(0, Height/2, 0); glVertex3i(Width, Height/2, 0); glVertex3i(Width/2, 0, 0); glVertex3i(Width/2, Height, 0); glEnd(); // ======================================================== // // Version 1 // Alte version das bild anzuzeigen mit dieser Funktion: // http://www.devolution.com/pipermail/sdl/2002-September/049078.html // SDL_GL_LoadTexture() entspricht der verlinkten funktion. /*SDL_Surface* image = IMG_Load("test.png"); GLfloat coords[4]; GLuint text_png = SDL_GL_LoadTexture(image, coords); SDL_FreeSurface(image); glBindTexture(GL_TEXTURE_2D, text_png); glBegin(GL_QUADS); //Top-left vertex (corner) glTexCoord2f(0.0f, 0.0f); glVertex2i(100, 100); //Bottom-left vertex (corner) glTexCoord2f(coords[2], 0.0f); glVertex2i(150, 100); //Bottom-right vertex (corner) glTexCoord2f(coords[2], coords[3]); glVertex2i(150, 150); //Top-right vertex (corner) glTexCoord2f(0.0f, coords[3]); glVertex2i(100, 150); glEnd(); glDeleteTextures(1, &text_png);*/ // ======================================================== // // Version 2 // mit der von dir verlinkten funktion. // LoadTexture = http://www.libsdl.org/cgi/docwiki.cgi/OpenGL_20Texture_20Example // Bild mit power of 2 maßen. 64x64 GLuint text_png = LoadTexture("test-p2.png"); glBindTexture(GL_TEXTURE_2D, text_png); glBegin(GL_QUADS); //Top-left vertex (corner) glTexCoord2f(0.0f, 0.0f); glVertex2i(100, 100); //Bottom-left vertex (corner) glTexCoord2f(1.0f, 0.0f); glVertex2i(150, 100); //Bottom-right vertex (corner) glTexCoord2f(1.0f, 1.0f); glVertex2i(150, 150); //Top-right vertex (corner) glTexCoord2f(0.0f, 1.0f); glVertex2i(100, 150); glEnd(); glDeleteTextures(1, &text_png); // ======================================================== // SDL_GL_SwapBuffers();Das entspricht meinem gesammten programmablauf. Das was ich weggelassen habe sind dinge die 100% funktionieren und die ich verstehe. Das raus gesuchte sollte auch alle einstellungen beinhalten die ich an opengl weiterreiche.
Hier nochmal das ergebnis von version 1:
http://prophet.underground-irc.net/2d.png
Dieses bild sollte als textur geladen werden:
http://prophet.underground-irc.net/test.pngUnd das ergebnis von version 2:
http://prophet.underground-irc.net/2d-alt.png
Dieses bild sollte als textur geladen werden:
http://prophet.underground-irc.net/test-p2.png
-
Tut mir leid, ich kann obigen Code nicht kompilieren, und mich wuerde wundern wenn du es koenntest, da fehlt naemlich noch einiges.

Was ich damit sagen will: Schreib ein kleines Programm, das alle relevanten Teile enthaelt, und poste es. Wenn man deinen Code nicht selber kompilieren kann, wird sich in der Regel niemand die Arbeit machen dran rumzuspielen. Dadurch, dass du so ein Programm schreibst kannst du auch selber den Fehler eingrenzen. Das einzige, was mir an obigem Quellcode sofort auffaellt ist dass du die Textur loescht noch bevor du auch nur ein einziges Mal die Buffer austauscht...
-
Hmmm... ich hab mir mal die Muehe gemacht was kompilierbares draus zu machen... Und muss zugeben ich hab leider keine Ahnung was den Fehler verursacht, sorry.
BTW, wenns wem anderen beim Fehlersuchen hilft:
#include <SDL.h> #include <SDL_image.h> #include <GL/gl.h> #include <GL/glu.h> GLuint LoadTexture(char *filename) { SDL_Surface *surface; GLuint textureid; int mode; surface = IMG_Load(filename); if (!surface) return 0; if (surface->format->BytesPerPixel == 3) { mode = GL_RGB; } else if (surface->format->BytesPerPixel == 4) { mode = GL_RGBA; } else { SDL_FreeSurface(surface); return 0; } glGenTextures(1, &textureid); glBindTexture(GL_TEXTURE_2D, textureid); glTexImage2D(GL_TEXTURE_2D, 0, mode, surface->w, surface->h, 0, mode, GL_UNSIGNED_BYTE, surface->pixels); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); SDL_FreeSurface(surface); return textureid; } int main() { Uint32 Width = 640; Uint32 Height = 480; SDL_Init(SDL_INIT_VIDEO); SDL_SetVideoMode(Width, Height, 0, SDL_OPENGL); SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 ); SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 ); SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 ); SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 ); SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); glShadeModel(GL_SMOOTH); glClearColor(1, 1, 1, 0); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glViewport(0, 0, Width, Height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, Width, Height, 0); GLuint text_png = LoadTexture("test-p2.png"); while (true) { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glBegin(GL_LINES); glColor3ub(255, 0, 0); glVertex3i(0, Height/2, 0); glVertex3i(Width, Height/2, 0); glVertex3i(Width/2, 0, 0); glVertex3i(Width/2, Height, 0); glEnd(); glBindTexture(GL_TEXTURE_2D, text_png); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex2i(100, 100); glTexCoord2f(1.0f, 0.0f); glVertex2i(150, 100); glTexCoord2f(1.0f, 1.0f); glVertex2i(150, 150); glTexCoord2f(0.0f, 1.0f); glVertex2i(100, 150); glEnd(); SDL_GL_SwapBuffers(); } glDeleteTextures(1, &text_png); }
-
Ok, ich werde dann das nächste mal ein lauffähiges programm posten. Ich dachte du willst nur wissen was ich alles für schritte durchgeführt habe.
Danke schonmal! Hoffentlich kann mir jemand helfen....
-
Kann mir den keiner weiterhelfen?
-
Ich habe endlich herausgefunde warum die bilder falsch dargestellt werden! Es lag daran das ich die Frabe über die linien auf Rot eingestellt habe. Dadurch wurde nur der rote kanal des bildes dargestellt. Jetzt geht es, aber komischerweise werden meine linien nicht mehr gezeichnet.
Die aktuelle version meines programms sieht nun so aus:
#include <cstdlib> #include <iostream> using namespace std; #include <SDL.h> #include <SDL_image.h> #include <GL/gl.h> #include <GL/glu.h> GLuint LoadTexture(const char *filename) { GLuint textureid; SDL_Surface *surface; SDL_Surface *image; int mode; surface = IMG_Load(filename); //if (image == NULL) // return 0; //surface = SDL_CreateRGBSurface(SDL_SWSURFACE, image->w, image->h, 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff); //surface = SDL_ConvertSurface(image, surface->format, surface->flags); if(surface == NULL) return 0; if (surface->format->BytesPerPixel == 3) { mode = GL_RGB; } else if (surface->format->BytesPerPixel == 4) { mode = GL_RGBA; } else { SDL_FreeSurface(surface); return 0; } glGenTextures(1, &textureid); glBindTexture(GL_TEXTURE_2D, textureid); glTexImage2D(GL_TEXTURE_2D, 0, mode, surface->w, surface->h, 0, mode, GL_UNSIGNED_BYTE, surface->pixels); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); //SDL_FreeSurface(image); SDL_FreeSurface(surface); return textureid; } int main() { Uint32 Width = 640; Uint32 Height = 480; SDL_Init(SDL_INIT_VIDEO); SDL_SetVideoMode(Width, Height, 0, SDL_OPENGL); SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 ); SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 ); SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 ); SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 ); SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); glShadeModel(GL_SMOOTH); glClearColor(1, 1, 1, 0); glClearDepth(1.0f); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glViewport(0, 0, Width, Height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, Width, Height, 0); GLuint text_png = LoadTexture("test-p2.png"); if(text_png == 0) { cout << "Could not load texture!" << endl; exit(0); } bool quit = false; while (!quit) { SDL_Event event; while(SDL_PollEvent(&event)) { if(event.type == SDL_QUIT) quit = true; if(event.type == SDL_KEYDOWN) if(event.key.keysym.sym == SDLK_ESCAPE) quit = true; } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glBindTexture(GL_TEXTURE_2D, text_png); glBegin(GL_QUADS); glColor3f(1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex2i(100, 100); glTexCoord2f(1.0f, 0.0f); glVertex2i(150, 100); glTexCoord2f(1.0f, 1.0f); glVertex2i(150, 150); glTexCoord2f(0.0f, 1.0f); glVertex2i(100, 150); glEnd(); glBegin(GL_LINES); glColor3f(1.0f, 0.0f, 0.0f); glVertex3i(0, Height/2, 0); glVertex3i(Width, Height/2, 0); glVertex3i(Width/2, 0, 0); glVertex3i(Width/2, Height, 0); glEnd(); SDL_GL_SwapBuffers(); SDL_Delay(20); } glDeleteTextures(1, &text_png); SDL_Quit(); exit(0); }Warum fehlen nun die linien?
EDIT: Ich habe noch andere Bilder getestet. Komischerweise werden die linien manchmal gezeichnet und manchmal nicht. Aber sie haben immer die falsche farbe. (grau)
EDIT2: Wenn ich gar keien Textur laden lasse wird die linie ganz normal dargestellt. Es muss also irgendetwas innerhalb der loadTexture funktion geschene das deren farbe und transparenz verändert.
-
Ich habe den fehler nun noch weiter eingekreist. Wenn ich die anweisung glTexImage2D auskommentiere wird die linie fehlerfrei gezeichnet. Sobald die anweisung drinne steht hat sie die falsche farbe oder wird gar nicht gezeichnet (je nach dem in welcher reihenfolge ich das zeichnen durchführe).
Bitte, helft mir!