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

不用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要快,呵呵。如此之酷。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值