2010-11-11 79 views
6

我正在编写在OSX下运行的SDL/OpenGL应用程序。我必须使用现有的代码来使用DevIL库来加载JPG和PNG纹理。不幸的是,这在OS X下非常糟糕,所以我决定不使用DevIL,并使用另一个库重写应用程序的各个部分。我想保持它的灵活性(DevIL可以处理很多图像格式)并且易于使用。是否有可以推荐的DevIL替代品?该应用程序完全用C++编写。如何在OSX下的SDL/OpenGL应用中加载JPG/PNG纹理

+2

为什么你认为使用JPEG,PNG,<把你最喜欢的图像格式放在这里>是存储纹理的好主意? – n0rd 2010-11-11 10:03:19

+0

正如n0rd所暗示的那样,您只需要在编译时支持标准图像格式。构建过程应该将所有图形资源转换为通用格式。这也减少了你的应用在启动时需要做的工作,所以它的加载速度会更快。 – 2010-11-11 15:41:31

+0

好点!我可能会坚持使用PNG图像。 – 2010-11-13 12:49:09

回答

9

看看SDL_image库。它提供像IMG_LoadPNG这样的功能,将图片加载为“SDL_Surface”。 由于您已经使用SDL,因此您的程序应该很适合。

样品从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

谢谢,SDL_image做的不错! – 2010-11-13 12:48:10

0

如果你在Mac OS上,为什么不使用CGImageSource来加载? OS X本身支持加载包括PNG和JPEG在内的多种文件格式。

1

看看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

可运行SDL 2示例

#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; 
} 

编译时:

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

在Ubuntu 16.10,SDL 2.0.4。

+0

Downvoters请解释;-) – 2017-06-06 05:59:30