不用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
// draw your stuff here
// blah blah
// blah blah
// blah.
....
// blah
// Last one, I promise...
// blah.
我发现这个函数比调用AuxDIBImageLoad()或者win32 API要快,呵呵。如此之酷。