对于上一章的纹理贴图,不少朋友给我说,有些图片可以成功读取,但是显示不正常。
例如这只猪:

解决方案是这样的。造成这个问题的原因是因为像素在bmp图片中保存格式为BGR,gluBuild2Dmipmaps函数会要求你提供颜色的组成类型(GL_RGB),而某些OpenGL版本的中并没有GL_BGR或GL_BGR_EXT,所以在LoadTexture函数中,我写了个交换器来使其变成RGB,最终使用GL_RGB生成纹理。那么,对于显示不正常的图片,将这个参数改成GL_BGR_EXT即可。
新的LoadTexture如下:
int LoadBitmap(const char *file)
{
unsigned int ID; //纹理的id
int width,height;
byte *image; //接受图像数据
FILE *fp; //文件指针
BITMAPFILEHEADER FileHeader; //接受位图文件头
BITMAPINFOHEADER InfoHeader; //接受位图信息头
fp=fopen(file,"rb");
if (fp == NULL)
{
printf("Exception: Fail to open file!\n");
return -1;
}
fread(&FileHeader, sizeof(BITMAPFILEHEADER), 1, fp);
if(FileHeader.bfType != BITMAP_ID) //确保文件是一个位图文件,效验文件类型
{
printf("Exception: This file is not a bmp file!\n");
fclose(fp);
return -1;
}
fread(&InfoHeader, sizeof(BITMAPINFOHEADER), 1, fp);
width=InfoHeader.biWidth;
height=InfoHeader.biHeight;
InfoHeader.biSizeImage = width*height*3;
fseek(fp, FileHeader.bfOffBits, SEEK_SET); //将文件指针移动到实际图像数据处
image=(byte *)malloc(sizeof(byte)*InfoHeader.biSizeImage); //申请空间
if (image == NULL)
{
free(image);
printf("Exception: No enough space!\n");
return -1;
}
fread(image, 1, InfoHeader.biSizeImage, fp);
fclose(fp);
glGenTextures(1, &ID);
glBindTexture(GL_TEXTURE_2D, ID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEX