2016-04-27 98 views
1

当我尝试使用SDL_image将图像加载到OpenGL纹理时,我收到了意外的输出。SDL 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); 

    } 

} 

本机图像I负荷是:

input.jpg

但输出是:

output.jpg

从我在anot上读过的东西她的堆栈溢出post,我相信这可能是一个倒转的渠道问题,但提出的解决方案不能解决我的问题。我的方法/代码有什么问题?

回答

2

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

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

这个颜色值将与纹理意义的颜色样本相乘最终输出的红色和蓝色分量将始终为0,这这就是为什么图像看起来有绿色色调。如果你想使用原始的纹理颜色,你应该始终设置:

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

应用你的建议,哪个工作,然后我注意到,颜色被颠倒。我通过使用GL_BGRA作为glTexImage2D()函数的格式参数来解决此问题。 –