(nehe教程)不使用auxDIBImageLoad,加载bmp文件

(初学者,如有不妥之处请指正)

最近在学习nehe的opengl教程,学到第六课时,用到了一个auxDIBImageLoad(Filename),加载位图文件,什么鬼函数,貌似没见过,定睛一看原来是来自<glaux.h>,估计好多人的第一反应就是,卧槽,又要去网上找,当然,博主也是懒人一个,能有现成的为什么不用,就去百度一番,果然有,拿来用啊(我用的是xcode),下载,拷贝,运行,报错,什么鬼,又仔细一看,glaux.h里面又包含了GL/gl.h,GL/glu.h,我了个去啊,不找了,自己动手丰衣足食(当然,如果以后必须要用,还是要加),百度了一下,还真有人写这个函数,但是有些地方说的不清楚,所以决定重写一番。话不多说,转入正题。

auxDIBImageLoad(Filename)这个函数实现的是什么?这个函数的作用就是加载一个位图,把位图的信息(位图的宽,高,数据信息)读取并返回,返回的数据类型为AUX_RGBImageRec*,按博主目前的揣测,就是一个结构体,里面有图片的宽,高,数据信息,于是我就定义了以下结构体。

struct ImageFileDate {
    unsigned long bWidth;
    unsigned long bHeight;
    unsigned char* fileData;
};

剩下的就很简单了,把位图加载并读取,定义个读取位图的函数

struct ImageFileDate *image = NULL;
GLuint texture[1];

void LoadImageFile(char* imageName)
{
    image = (struct ImageFileDate*)malloc(sizeof(struct ImageFileDate));
    image->bHeight = 0;
    image->bWidth = 0;
    image->fileData = NULL;
    FILE* imageFile = NULL; //文件指针
    unsigned long size = 0; //文件的数据部分
    
    imageFile = fopen(imageName, "rb"); //二进制的方式打开文件
    //简单的解释一下,bmp文件的数据格式,头部有54个字节文件信息,剩下的是文件的数据部分(包括像素信息和调色板信息),是我们要读取的数据部分
    //头部的54个字节文件信息,包括文件的大小,类型,宽,高等信息
    //文件的大小,类型等信息,我们不关注,即前18个字节我们不管,接下来,4个字节是文件的宽,4个字节是文件的高
    fseek(imageFile,18,SEEK_SET); //跳过18个字节
    
    fread(&(image->bWidth), 4, 1, imageFile); //文件的宽
    
    fread(&(image->bHeight), 4, 1, imageFile); //文件的高
    
    fseek(imageFile, 0, SEEK_END); //跳至文件开头
    
    size = ftell(imageFile) - 54;  //算出文件数据部分的长度
 
    image->fileData = (unsigned char*) malloc(size);
    memset(image->fileData, 0, size);
    
    fseek(imageFile, 54, SEEK_SET); //跳至文件的数据部分
    
    fread(image->fileData, size, 1, imageFile); //读取文件的数据部分
    
    fclose(imageFile);
}


剩下的使用部分,就是跟nehe教程是一样的

........

glTexImage2D(GL_TEXTURE_2D, 0, 3, (GLsizei)image->bWidth, (GLsizei)image->bHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, image->fileData);
........

 然后你就可以看到完美的运行

如果想要完整的源码,留言即可,初学者,如有什么不对的地方,请指出,互相交流,共同进步!


阅读更多
文章标签: opengl bmp 位图
个人分类: opengl 学习
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

(nehe教程)不使用auxDIBImageLoad,加载bmp文件

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭