簡體   English   中英

如何在OSX下的SDL / OpenGL應用程序中加載JPG / PNG紋理

[英]How to load JPG/PNG Textures in an SDL/OpenGL App under OSX

我正在編寫一個在OSX下運行的SDL / OpenGL應用程序。 我必須使用現有的代碼,它使用DevIL庫來加載JPG和PNG紋理。 不幸的是,這在OS X下非常糟糕,所以我決定根本不使用DevIL,並使用另一個庫重寫應用程序的各個部分。 我想保持它的靈活性(DevIL可以處理很多圖像格式)並且易於使用。 你可以推薦一個很好的替代DevIL嗎? 該應用程序完全用C ++編寫。

看看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";
}

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上游

編譯並運行:

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

結果:

在此輸入圖像描述

在Ubuntu 16.04,GCC 6.4.0,SDL 2.0.4,SDL Image 2.0.1上測試。

看看freeimage 它支持所有主要格式,並且可以使用macport輕松構建。 很高興也能合作。 自動檢測圖像格式等

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);

如果您還在使用Mac OS,為什么不使用CGImageSource進行加載呢? OS X本身支持加載許多文件格式,包括PNG和JPEG。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM