2016-04-27 6 views
1

Ich erhalte eine unerwartete Ausgabe, wenn ich SDL_image verwenden möchte, um ein Bild in eine OpenGL-Textur zu laden.SDL OpenGL-Texturen mit grünem Teint

Die entsprechenden Teile meines Codes sind:

/** 
* Load texture 
* @param {char*} [filename] File name to load 
* @param {int*} [textw] Texture width pointer (value returned) 
* @param {int*} [texth] Texture height pointer (value returned) 
* @return {GLuint} 
* @link http://sdl.beuc.net/sdl.wiki/OpenGL_Texture_Example 
**/ 
GLuint LoadTexture(char *filename, int *textw, int *texth) { 

    GLuint textureid; 
    int mode; 

    SDL_Surface *surface = IMG_Load(filename); 

    // could not load filename 
    if (!surface) { 
     return 0; 
    } 

    // work out what format to tell glTexImage2D to use... 
    if (surface->format->BytesPerPixel == 3) { // RGB 24bit 
     mode = GL_RGB; 
     printf("GL_RGB\n"); 
    } else if (surface->format->BytesPerPixel == 4) { // RGBA 32bit 
     mode = GL_RGBA; 
     printf("GL_RGBA\n"); 
    } else { 
     SDL_FreeSurface(surface); 
     return 0; 
    } 

    // Record texture dimensions 
    *textw = surface->w; 
    *texth = surface->h; 

    // create one texture name 
    glGenTextures(1, &textureid); 

    // tell opengl to use the generated texture name 
    glBindTexture(GL_TEXTURE_2D, textureid); 

    // this reads from the sdl surface and puts it into an opengl texture 
    glTexImage2D(GL_TEXTURE_2D, 0, mode, surface->w, surface->h, 0, mode, GL_UNSIGNED_BYTE, surface->pixels); 

    // these affect how this texture is drawn later on... 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    // clean up 
    SDL_FreeSurface(surface); 

    return textureid; 

} 

/** 
* Render 
* @param {GLuint} [textureid] OpenGL texture to apply 
**/ 
void render(textureid) { 

    //Clear color buffer 
    glClear(GL_COLOR_BUFFER_BIT); 

    //Render quad 
    if (gRenderQuad) { 

     // Set color 
     glColor3f(0.0f,1.0f,0.0f); 

     // tell opengl to use the generated texture name 
     glBindTexture(GL_TEXTURE_2D, textureid); 
     glEnable(GL_TEXTURE_2D); 

     // Draw rectangle 
     glBegin(GL_QUADS); 

     // Top left 
     glTexCoord2i(0, 1); 
     glVertex2f(-1.0f, -1.0f); 

     // Top right 
     glTexCoord2i(1, 1); 
     glVertex2f(1.0f, -1.0f); 

     // Bottom left 
     glTexCoord2i(1, 0); 
     glVertex2f(1.0f, 1.0f); 

     // Bottom right 
     glTexCoord2i(0, 0); 
     glVertex2f(-1.0f, 1.0f); 

     glEnd(); 

     glDisable(GL_TEXTURE_2D); 

    } 

} 

Die native Bild I Last ist:

input.jpg

Aber der Ausgang ist:

output.jpg

Aus was ich auf anot gelesen habe Ihr Stack Overflow post, ich glaube, es kann ein invertiertes Kanalproblem sein, aber die vorgeschlagene Lösung behebt mein Problem nicht. Was ist falsch an meinem Ansatz/Code?

Antwort

2

Es ist nichts falsch mit dem Laden der Textur, soweit ich das beurteilen kann. Der Grund für die Ausgabe einen grünen Farbton hat, weil Sie ein:

glColor3f(0.0f, 1.0f, 0.0f); 

Dieser Farbwert wird mit der Farbprobe aus der Textur Bedeutung multipliziert wird, dass die roten und blaue Komponenten der endgültigen Ausgabe immer 0 sein werden, die Deshalb scheint das Bild einen grünen Farbton zu haben. Wenn Sie die ursprüngliche Texturfarbe verwenden möchten, sollten Sie immer setzen:

glColor3f(1.0f, 1.0f, 1.0f); 
+0

Nach der Anwendung Ihres Vorschlags, der funktionierte, bemerkte ich dann, dass die Farben invertiert wurden. Ich habe dies gelöst, indem ich GL_BGRA als das Argument der glTexImage2D() -Funktion verwendet habe. –