How do I load textures to OpenGL using FreeImage library?
我正在使用 NeHe 教程在 C 语言中学习 OpenGL,但我正在尝试使用 FreeImage 库而不是 Glaux 或 SOIL 来完成它们。我看到使用 FreeImage 的好处是它的最后一次更新是在去年 10 月,而 SOIL 已经有 5 年没有更新了。我遇到的问题是我无法正确加载纹理。
这是我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | static GLuint texture = 0; if (texture == 0) { FIBITMAP* bitmap = FreeImage_Load( FreeImage_GetFileType("textures/test/nehe_06.png", 0), "textures/test/nehe_06.png"); glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); 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, 3, FreeImage_GetWidth(bitmap), FreeImage_GetHeight(bitmap), 0, GL_RGB, GL_UNSIGNED_BYTE, FreeImage_ConvertTo32Bits(bitmap)); FreeImage_Unload(bitmap); } |
使用此代码,我得到的纹理是错误的:它是黑色的,带有彩色点和条,并且更改图像会得到相同的结果,所以我假设我没有正确加载纹理。 我尝试交换红色和蓝色位(读取 FreeImage 在 BGR 中加载),但没有更好的结果。最后,如果我通过 *FreeImage_GetBits(bitmap)* 更改 *FreeImage_ConvertTo32Bits(bitmap)* 我得到一个段错误。 我做错了什么? 您的代码有两个问题 - 一个是您将图像转换为 32 位,但您为 openGL ( 你需要这样做
2
3
4
5
6
7
8
int nWidth = FreeImage_GetWidth(pImage);
int nHeight = FreeImage_GetHeight(pImage);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, nWidth, nHeight,
0, GL_BGRA, GL_UNSIGNED_BYTE, (void*)FreeImage_GetBits(pImage));
FreeImage_Unload(pImage);
扩展上一个答案:
FreeImage 中有另一个函数可以让你得到未对齐的紧密排列的像素数组: