2009-05-04 5 views
1

Hey, ich dieses Skript habe eine SDL_Surface zu laden und als OpenGL Textur speichern:SDL_Surface zu OpenGL Textur

typedef GLuint texture; 

texture load_texture(std::string fname){ 
    SDL_Surface *tex_surf = IMG_Load(fname.c_str()); 
    if(!tex_surf){ 
     return 0; 
    } 
    texture ret; 
    glGenTextures(1, &ret); 
    glBindTexture(GL_TEXTURE_2D, ret); 
    glTexImage2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_surf->pixels); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    SDL_FreeSurface(tex_surf); 
    return ret; 
} 

Das Problem ist, dass es nicht funktioniert. Wenn ich die Funktion von der Hauptfunktion aus anrufe, lädt sie einfach kein Bild (wenn sie nur die Zeichnungsfarbe ändert), und wenn von einer Funktion außerhalb der Hauptfunktion aufgerufen wird, stürzt das Programm ab. Es ist diese Linie, die das Programm abstürzen läßt:

2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_surf->pixels); 

jemand einen Fehler in diesem sehen kann?

+0

Veröffentlichen Sie eine minimale, kompilierbare Quelle, die Ihr Problem veranschaulicht. Du wirst bessere Antworten bekommen. Es ist sehr schwierig zu theoretisieren, was das Problem anders ist. – dirkgently

Antwort

2

Meine Wette ist, dass Sie die SDL_Surface konvertieren müssen, bevor Sie versuchen, es in eine OpenGL-Textur zu stopfen. Hier ist etwas, das Ihnen die allgemeine Idee geben sollte:

SDL_Surface* originalSurface; // Load like an other SDL_Surface 

int w = pow(2, ceil(log(originalSurface->w)/log(2))); // Round up to the nearest power of two 

SDL_Surface* newSurface = 
    SDL_CreateRGBSurface(0, w, w, 24, 0xff000000, 0x00ff0000, 0x0000ff00, 0); 
SDL_BlitSurface(originalSurface, 0, newSurface, 0); // Blit onto a purely RGB Surface 

texture ret; 

glGenTextures(1, &ret); 
glBindTexture(GL_TEXTURE_2D, ret); 
glTexImage2D(GL_TEXTURE_2D, 0, 3, w, w, 0, GL_RGB, 
      GL_UNSIGNED_BYTE, newSurface->pixels); 

I found the original code here. Es kann auch einige other useful posts on GameDev geben.

+0

Danke, es hat den Absturz behoben, die Textur wird gerade noch nicht angezeigt ... –

+0

Ohne mehr Quelle wäre es sehr schwer zu bestimmen, warum dein Blitting nicht funktioniert. Können Sie den Code posten, den Sie zum Rendern verwenden? –

0

Ich bin mir nicht sicher, ob Sie das irgendwo außerhalb Ihres Code-Schnipsel tun, aber haben Sie angerufen

glEnable(GL_TEXTURE_2D);

irgendwann?

+0

Das hilft nicht nur überhaupt, es kann sogar zu einem Fehler in Ihrem OpenGL-Kontext führen, da das Fixed-Pipeline-Texturing in neueren OpenGL-Versionen veraltet ist. – Kenji

0

Außerdem multipliziert der standardmäßige GL_REPLACE-Textur-Füllmodus den aktuellen glColor mit den eingehenden Texel-RGB-Werten. Folge: glColor3f (0,0,0) gibt dir Schwarz, wo deine Textur sein soll :)

Stelle sicher, dass du glColor3f (1,1,1) hast, bevor du deine texturierte Geometrie zeichnest.