SDL OpenGL纹理受到绿色色调的困扰

时间:2016-04-27 01:36:42

标签: c opengl sdl sdl-image

尝试使用SDL_image将图像加载到OpenGL纹理时,我收到意外的输出。

我的代码的相关部分是:

/**
 * 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 );

    }

}

我加载的原生图像是:

input.jpg

但输出是:

output.jpg

从我在另一个Stack Overflow post上看到的内容,我认为它可能是一个反向通道问题,但建议的解决方案并不能解决我的问题。我的方法/代码出了什么问题?

1 个答案:

答案 0 :(得分:2)

据我所知,加载纹理没有任何问题。输出具有绿色色调的原因是因为您设置了:

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

此颜色值将与纹理中的颜色样本相乘,这意味着最终输出的红色和蓝色分量始终为0,这就是图像看起来具有绿色色调的原因。如果要使用原始纹理颜色,则应始终设置:

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