9
votes

Comment charger des textures JPG / PNG dans une application SDL / OpenGL sous OSX

J'écris une application SDL / OpenGL qui fonctionne sous OSX. Je dois utiliser le code existant qui utilise la bibliothèque du diable pour charger des textures JPG et PNG. Malheureusement, cela fonctionne très mal sous OS X, alors j'ai décidé de ne pas utiliser le diable du tout et réécrivez les parties respectives de l'application en utilisant une autre bibliothèque. Je veux rester flexible (le diable peut gérer de nombreux formats d'image) et facile à utiliser. Y a-t-il un bon remplacement pour le diable que vous pouvez recommander? L'application est entièrement écrite en C ++.


3 commentaires

Pourquoi pensez-vous que l'utilisation de JPEG, PNG, est une bonne idée de stocker des textures?


Comme N0RD allusion à, vous n'avez besoin que de la prise en charge des formats d'image standard au moment de la compilation. Le processus de construction doit convertir toutes vos ressources graphiques en format commun. Cela réduit également le travail que votre application doit faire au démarrage. Il va donc charger plus vite.


bon point! Je vais probablement rester avec des images PNG.


4 Réponses :


0
votes

Si vous êtes sur Mac OS quand même, pourquoi pas simplement utiliser cgimagesource pour faire le chargement? OS X prend en charge de manière native chargement de nombreux formats de fichiers, notamment PNG et JPEG.


1 commentaires

D'un look rapide qui ne regarde pas tout comme C ++. Ce serait une raison.



11
votes

Regardez le bibliothèque SDL_Image . Il propose des fonctions telles que img_loadpng code> qui chargent votre image "comme un" sdl_surface. Puisque vous travaillez déjà avec SDL, cela devrait s'adapter assez bien dans votre programme.

Échantillon pris à partir du SDL_IMAGE Documentation : P>

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


0 commentaires

1
votes

Jetez un coup d'œil à FreeImage . Il prend en charge tous les principaux formats et est facilement construit avec MacPorts. Ravi de travailler avec aussi. Détecte automatiquement le format d'image, 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 commentaires

3
votes

SDL 2 SDL_Image Exemple runnable minimal strong>

Main.c P>

sudo apt-get install libsdl2-dev libsdl2-image-dev
gcc -std=c99 -o main -Wall -Wextra -pedantic main.c -lSDL2 -lSDL2_image
./main


0 commentaires