Как загрузить текстуры JPG / PNG в приложение SDL / OpenGL под OSX - PullRequest
6 голосов
/ 11 ноября 2010

Я пишу приложение SDL / OpenGL, которое работает под OSX. Я должен использовать существующий код, который использует библиотеку DevIL для загрузки текстур JPG и PNG. К сожалению, в OS X это работает очень плохо, поэтому я решил вообще не использовать DevIL и переписать соответствующие части приложения, используя другую библиотеку. Я хочу, чтобы он был гибким (DevIL может обрабатывать множество форматов изображений) и простым в использовании. Есть ли хорошая замена для DevIL, которую вы можете порекомендовать? Приложение полностью написано на C ++.

Ответы [ 4 ]

9 голосов
/ 11 ноября 2010

Посмотрите библиотеку SDL_image .Он предлагает такие функции, как IMG_LoadPNG, которые загружают ваше изображение "как" SDL_Surface.Поскольку вы уже работаете с SDL, это должно хорошо вписаться в вашу программу.

Образец взят из SDL_image документации :

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

SDL 2 Пример минимального запуска SDL_image

main.c

#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(
        500, 500,
        0, &window, &renderer
    );
    IMG_Init(IMG_INIT_PNG);
    texture = IMG_LoadTexture(renderer, "flower.png");
    while (1) {
        SDL_RenderCopy(renderer, texture, NULL, NULL);
        SDL_RenderPresent(renderer);
        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;
}

GitHub upstream .

Компилировать иrun:

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

Результат:

enter image description here

Проверено на Ubuntu 16.04, GCC 6.4.0, SDL 2.0.4, SDLИзображение 2.0.1.

1 голос
/ 11 ноября 2010

Взгляните на freeimage .Он поддерживает все основные форматы и легко собирается с помощью macports.С ним тоже приятно работать.Автоматически определяет формат изображения и т. Д.

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 голосов
/ 11 ноября 2010

Если вы все равно работаете в Mac OS, почему бы просто не использовать CGImageSource для загрузки?OS X изначально поддерживает загрузку многих форматов файлов, включая PNG и JPEG.

...