2010-12-02 6 views
4

Je souhaite convertir une SDL_Surface, qui a été chargée par IMG_Load() dans un autre format de pixel (rgba8) pour une texture OpenGL. Comment puis je faire ça? J'ai lu à propos de SDL_ConvertSurface() dans la documentation, mais je n'arrive pas à comprendre comment l'assembler.Conversion de format de pixels de surface SDL

+0

Avez-vous réellement besoin de le convertir en RGBA, ou tout simplement le charger dans une texture? – genpfault

Répondre

3

Donnez "How To Load an OpenGL Texture from an SDL_Surface" un coup:

GLuint texture;   // This is a handle to our texture object 
SDL_Surface *surface; // This surface will tell us the details of the image 
GLenum texture_format; 
GLint nOfColors; 

if((surface = SDL_LoadBMP("image.bmp"))) 
{ 
    // Check that the image's width is a power of 2 
    if((surface->w & (surface->w - 1)) != 0) 
    { 
     printf("warning: image.bmp's width is not a power of 2\n"); 
    } 

    // Also check if the height is a power of 2 
    if((surface->h & (surface->h - 1)) != 0) 
    { 
     printf("warning: image.bmp's height is not a power of 2\n"); 
    } 

    // get the number of channels in the SDL surface 
    nOfColors = surface->format->BytesPerPixel; 
    if(nOfColors == 4)  // contains an alpha channel 
    { 
     if(surface->format->Rmask == 0x000000ff) 
      texture_format = GL_RGBA; 
     else 
      texture_format = GL_BGRA; 
    } 
    else if(nOfColors == 3)  // no alpha channel 
    { 
     if(surface->format->Rmask == 0x000000ff) 
      texture_format = GL_RGB; 
     else 
      texture_format = GL_BGR; 
    } 
    else 
    { 
     printf("warning: the image is not truecolor.. this will probably break\n"); 
     // this error should not go unhandled 
    } 

    // Have OpenGL generate a texture object handle for us 
    glGenTextures(1, &texture); 

    // Bind the texture object 
    glBindTexture(GL_TEXTURE_2D, texture); 

    // Set the texture's stretching properties 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    // Edit the texture object's image data using the information SDL_Surface gives us 
    glTexImage2D 
     (
     GL_TEXTURE_2D, 
     0, 
     nOfColors, 
     surface->w, 
     surface->h, 
     0, 
     texture_format, 
     GL_UNSIGNED_BYTE, 
     surface->pixels 
     ); 
} 
else 
{ 
    printf("SDL could not load image.bmp: %s\n", SDL_GetError()); 
    SDL_Quit(); 
    return 1; 
}  

// Free the SDL_Surface only if it was successfully created 
if(surface) 
{ 
    SDL_FreeSurface(surface); 
} 
+0

Ce lien semble être rompu. – rsethc

+0

@rsethc: Doit être corrigé. – genpfault

+0

Oui, ça marche maintenant. Merci – rsethc

Questions connexes