2012-07-01 4 views
1

.png 이미지를 SDL로 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_RGB 대신 GL_BGR을 사용하므로 bmp의 문제를 해결할 것이라고 생각합니다.

png 이미지의 문제는 픽셀 당 32 비트 인 png가 원인 일 가능성이 큽니다. 아마도 가장 좋은 해결책은 SDL 표면의 형식 필드를 검사하여 glTexImage2D에 전달할 적절한 플래그/값을 결정하는 것입니다.

+0

좋아요, BGR은 작동하지만 두 번째 작업을 수행하는 방법을 모릅니다. 위 코드를 인터넷에서 가져 왔습니다. – dirkwillem

+1

@dirkwillem PNG 사진에 알파 채널 정보가있을 것입니다. 'GL_RGBA'를 시도하십시오. – jrok

+0

감사합니다. – dirkwillem