2012-07-01 125 views
1

如何使用SDL將.png圖像轉換爲OpenGL表面?我現在有:sdl表面到opengl紋理

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; 
} 

和我的代碼繪製的事情:

glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,tex);

 //Use blurry texture mapping (replace GL_LINEAR with GL_NEAREST for blocky) 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

     glColor4f(1.0, 1.0, 1.0, 1.0); //Don't use special coloring 

     glBegin(GL_QUADS); 

     glTexCoord2f(0.0f, 0.0f); 
     glVertex3f(0.0f, 0.0f, 0.0f); 
     glTexCoord2f(1.0f, 0.0f); 
     glVertex3f(128.0f, 0.0f, 0.0f); 
     glTexCoord2f(1.0f, 1.0f); 
     glVertex3f(128.0f, 128.0f, 0.0f); 
     glTexCoord2f(0.0f, 1.0f); 
     glVertex3f(0.0f, 128.0f, 0.0f); 

     glEnd(); 

     glDisable(GL_TEXTURE_2D); 

問題是,它只適用於.bmp文件,並且它們變藍,所以出了什麼問題? 另外,當我嘗試加載.png時,它顯示出很奇怪。

回答

2

錯誤的顏色可能會導致通道順序錯誤。我用來加載.bmp的代碼使用GL_BGR代替GL_RGB,所以我認爲這將解決你的問題。

你的PNG圖像的問題更可能是由於PNG是每像素32位。對你來說最好的解決方案可能是檢查SDL表面的格式字段,以確定適當的標誌/值傳遞給glTexImage2D。

+0

好的,BGR的作品,但我不知道如何做第二件事。我從互聯網上面得到了上面的代碼... – dirkwillem

+1

@dirkwillem您的PNG圖片可能持有alpha通道信息。嘗試使用'GL_RGBA'。 – jrok

+0

謝謝,這工作! – dirkwillem