在win32环境下,已经提供了GLAUX库,但对于x64位,基本上该库没有提供64为支持。会出现以下错误:
------ 已启动生成: 项目: OpenGL, 配置: Debug x64 ------
1> OpenGL.cpp
1>OpenGL.cpp(746): warning C4244: “return”: 从“WPARAM”转换到“int”,可能丢失数据
1>OpenGL.obj : error LNK2019: 无法解析的外部符号 auxDIBImageLoadA,该符号在函数 "struct _AUX_RGBImageRec * __cdecl LoadBMP(char *)" ([email protected]@[email protected]@[email protected]) 中被引用
1>F:\OpenGL\x64\Debug\OpenGL.exe : fatal error LNK1120: 1 个无法解析的外部命令
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
对此研究了一下午,并没有什么重大发现;所以索性自己写了一个加载bmp的函数,考虑到上下的兼容性。在此我用到了AUX_RGBImageRec结构,其实就是一个结构体,不愿意用的话可以自己重写一下,具体如下:
typedef struct _AUX_RGBImageRec {
GLint sizeX, sizeY;
unsigned char *data;
} AUX_RGBImageRec;
自己写的bmp函数如下:
//自定义加载bmp文件 AUX_RGBImageRec * LoadBMP(char *Filename) { unsigned int Texture; AUX_RGBImageRec * tex_result=new AUX_RGBImageRec; //be careful FILE* img = NULL; img = fopen(Filename, "r"); GLint bWidth = 0; GLint bHeight = 0; DWORD size = 0; fseek(img, 18, SEEK_SET); fread(&bWidth, 4, 1, img); fread(&bHeight, 4, 1, img); fseek(img, 0, SEEK_END); size = ftell(img) - 54; unsigned char *data = (unsigned char*)malloc(size); fseek(img, 54, SEEK_SET); // image data fread(data, size, 1, img); fclose(img); glGenTextures(1, &Texture); glBindTexture(GL_TEXTURE_2D, Texture); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, bWidth, bHeight, GL_BGRA, GL_UNSIGNED_BYTE, data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); tex_result->sizeX = bWidth; tex_result->sizeY = bHeight; tex_result->data = data; // if (data) // free(data); return tex_result; }
此处有几个需要注意是地方:
(1)注意像素格式,是GL_BGRA、GL_RGBA、GL_RGB等的哪一种,否则解析结果不对;
(2)用此函数需要弄清你所用图像位深格式:32还是24