2010-11-11 15 views
6

Estoy escribiendo una aplicación SDL/OpenGL que se ejecuta bajo OSX. Tengo que usar el código existente que usa la biblioteca DevIL para cargar texturas JPG y PNG. Lamentablemente, esto funciona muy mal en OS X, por lo que decidí no utilizar DevIL en absoluto y reescribir las partes respectivas de la aplicación utilizando otra biblioteca. Quiero mantenerlo flexible (DevIL puede manejar una gran cantidad de formatos de imagen) y fácil de usar. ¿Hay un buen reemplazo para DevIL que puedas recomendar? La aplicación está escrita completamente en C++.Cómo cargar texturas JPG/PNG en una aplicación SDL/OpenGL bajo OSX

+2

¿Por qué crees que usar JPEG, PNG, es una buena idea para almacenar texturas? – n0rd

+0

Como n0rd alude, solo necesita soporte para formatos de imagen estándar en tiempo de compilación. El proceso de compilación debe convertir todos sus recursos gráficos a un formato común. Esto también reduce el trabajo que su aplicación necesita hacer al inicio, por lo que se cargará más rápido. –

+0

¡buen punto! probablemente me quedo con solo imágenes PNG. –

Respuesta

9

Eche un vistazo a la biblioteca SDL_image. Ofrece funciones como IMG_LoadPNG que cargan su imagen "como" SDL_Surface. Dado que ya trabaja con SDL, esto debería encajar bastante bien en su programa.

muestra tomada del SDL_image documentation:

// Load sample.png into image 
SDL_Surface* image = IMG_Load("sample.png"); 
if (image == nullptr) { 
    std::cout << "IMG_Load: " << IMG_GetError() << "\n"; 
} 
+0

gracias, SDL_image hace lo correcto! –

0

Si tiene Mac OS de todos modos, ¿por qué no utiliza CGImageSource para realizar la carga? OS X admite de forma nativa la carga de muchos formatos de archivo, incluidos PNG y JPEG.

1

Tome un vistazo a freeimage. Es compatible con todos los formatos principales y se construye fácilmente con macports. Es bueno trabajar con ellos también. Detecta automáticamente el formato de imagen, etc.

FREE_IMAGE_FORMAT format = FreeImage_GetFileType(filename.c_str(), 0); 
FIBITMAP *bitmap = FreeImage_Load(format, filename.c_str()); 
if (!bitmap) 
{ 
    LOG_ERROR("Unable to load texture: " + filename); 
    return false; 
} 
mlWidth = FreeImage_GetWidth(bitmap); 
mlHeight = FreeImage_GetHeight(bitmap); 
glGenTextures(1, &mpTextures[0]); 
glBindTexture(GL_TEXTURE_2D, mpTextures[0]); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,  GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,  GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, mlWidth, mlHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, 
     (GLvoid*)FreeImage_GetBits(bitmap)); 
FreeImage_Unload(bitmap); 
0

Ejecutable SDL 2 ejemplo

#include <stdlib.h> 

#include <SDL2/SDL.h> 
#include <SDL2/SDL_image.h> 

int main(void) { 
    SDL_Event event; 
    SDL_Renderer *renderer = NULL; 
    SDL_Texture *texture = NULL; 
    SDL_Window *window = NULL; 

    SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO); 
    SDL_CreateWindowAndRenderer(
     COMMON_WINDOW_WIDTH, COMMON_WINDOW_WIDTH, 
     0, &window, &renderer 
    ); 
    IMG_Init(IMG_INIT_PNG); 
    texture = IMG_LoadTexture(renderer, "flower.png"); 
    common_fps_init(); 
    while (1) { 
     SDL_RenderCopy(renderer, texture, NULL, NULL); 
     SDL_RenderPresent(renderer); 
     common_fps_update_and_print(); 
     if (SDL_PollEvent(&event) && event.type == SDL_QUIT) 
      break; 
    } 
    SDL_DestroyTexture(texture); 
    IMG_Quit(); 
    SDL_DestroyRenderer(renderer); 
    SDL_DestroyWindow(window); 
    SDL_Quit(); 
    return EXIT_SUCCESS; 
} 

Compilado con:

sudo apt-get install libsdl2-dev libsdl2-image-dev 
gcc -std=c99 main.c -lSDL2 -lSDL2_image 

en Ubuntu 16.10, SDL 2.0.4.

+0

Downvoters por favor explique ;-) –

Cuestiones relacionadas