我正在编写在OSX下运行的SDL/OpenGL应用程序。我必须使用现有的代码来使用DevIL库来加载JPG和PNG纹理。不幸的是,这在OS X下非常糟糕,所以我决定不使用DevIL,并使用另一个库重写应用程序的各个部分。我想保持它的灵活性(DevIL可以处理很多图像格式)并且易于使用。是否有可以推荐的DevIL替代品?该应用程序完全用C++编写。如何在OSX下的SDL/OpenGL应用中加载JPG/PNG纹理
6
A
回答
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
相关问题
- 1. 如何在jsfiddle中加载纹理
- 2. 如何在Libgdx中加载纹理?
- 3. 如何在由OBJLoader加载的对象上应用纹理?
- 4. 纹理加载
- 5. Minko:如何在3D加载模型上应用材质(纹理)
- 6. 如何在DirectX上加载纹理?
- 7. 在Windows Store应用程序中使用SharpDX加载纹理
- 8. JOGL纹理加载
- 9. 加载纹理LWJGL
- 10. Three.js纹理加载
- 11. DDS纹理加载
- 12. 在Android OpenGL ES应用程序中加载纹理
- 13. 如何为obj加载纹理?
- 14. 如何从文件加载纹理?
- 15. Java - LWJGL加载纹理,仅加载我加载的最新纹理
- 16. 如何在运行时从XNA中的路径加载纹理?
- 17. 块纹理仅在库存中加载
- 18. 无法在WebGl中加载纹理
- 19. 在PIXI.js中多次加载纹理
- 20. 加载所有存在的纹理XNA应用
- 21. 将新纹理加载到已定义的纹理名称中
- 22. 如何在Vpython中添加纹理?
- 23. Artoolkit不加载OS X中的纹理
- 24. 如何在加载collada纹理时调用函数? (three.js所)
- 25. 如何在Xamarin.iOS(C#)中预加载纹理图集(SKTextureAtlas)?
- 26. 如何使用LWJGL加载用作openGL纹理的图像?
- 27. opengl es 2.0纹理加载
- 28. 了解andengine纹理加载
- 29. 纹理加载和映射
- 30. Android:OpenGL重新加载纹理
为什么你认为使用JPEG,PNG,<把你最喜欢的图像格式放在这里>是存储纹理的好主意? – n0rd 2010-11-11 10:03:19
正如n0rd所暗示的那样,您只需要在编译时支持标准图像格式。构建过程应该将所有图形资源转换为通用格式。这也减少了你的应用在启动时需要做的工作,所以它的加载速度会更快。 – 2010-11-11 15:41:31
好点!我可能会坚持使用PNG图像。 – 2010-11-13 12:49:09