不用AuxDIBImageLoad()向opengl中载入bmp纹理

来源:互联网 发布:淘宝店铺地址哪里看 编辑:程序博客网 时间:2024/05/22 17:00

转载:不用AuxDIBImageLoad()向opengl中载入bmp纹理 


原文地址:http://www.cnblogs.com/gaoteng/archive/2011/12/03/2350368.html



不用AuxDIBImageLoad()向opengl中载入bmp纹理 这个函数从硬盘中加载24位window DIB 位图。呵呵,解释的多了。为了节约时间,我没有加载整个bmp图的Header部分,而仅仅获取我们需要的部分:宽度,高度,和图片大小。 下面是代码部分 

unsigned int LoadTex(string Image){    unsigned int Texture;                FILE* img = NULL;                img = fopen(Image.c_str(),"rb");    unsigned long bWidth = 0;        unsigned long 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.file) - 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_BGR_EXT, GL_UNSIGNED_BYTE, data);    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);    if (data)        free(data);        return Texture;}

正如你可以看到,bitmap的宽度和高度偏移量为18和24尺寸准确,我们只是整个文件的大小减去54(大小我们得到一个准确的读数文件头的大小有时会出现故障。

用这个函数是相当容易的,就像是加载一个普通的纹理一样。

bool texLoaded = false;unsigned int texture;...if (!texLoaded){     texture = LoadTex("omfgleebhax.bmp");     // load the texture     texLoaded = true;}glBindTexture(GL_TEXTURE_2D, texture);     // bind the texture


我发现这个函数比调用AuxDIBImageLoad()或者win32 API要快,呵呵。如此之酷。


0 0
原创粉丝点击