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

翻译 2011年12月03日 19:24:23

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

用VC++编制FTP客户端应用程序

用VC++编制FTP客户端应用程序  FTP协议将使用两条单独的TCP连接,一条专用于发送FTP命令,另一条则专用于传递数据。初始建立连接时,服务器在21号端口上接收来自客户端的命令连接。当需要传送数...
  • ghj1976
  • ghj1976
  • 2001-08-20 11:36:00
  • 1508

OpenGL中用bmp图片做纹理贴图的三种方法

方法一:首先获取位图句柄HBITMAP hBmp = (HBITMAP) ::LoadImage (AfxGetResourceHandle(),                        MAK...
  • lijianyue
  • lijianyue
  • 2007-12-20 07:53:00
  • 831

OpenGL载入图片作为纹理

参考资料:《厦门大学计算机图像学教程》第4.1章 #ifndef GL_TEXTURE_LOADER #define GL_TEXTURE_LOADER typedef struct ...
  • xieziwei2008
  • xieziwei2008
  • 2013-10-25 12:58:35
  • 2471

OpenGL加载纹理深入详解。

//OpenGL进行纹理映射的基本流程: 1,首先要开启纹理映射的功能。 glEnable(GL_TEXTURE_2D);  2,载入位图资源。 3,将位图资源转化成纹理。 4,释放位图资源。 5,使...
  • Zzitai
  • Zzitai
  • 2017-05-22 09:48:19
  • 980

opengl读取24位BMP文件为纹理并处理黑色背景为透明

原理: 直接用BITMAP数据而未用
  • nisigesazi
  • nisigesazi
  • 2014-05-26 13:23:13
  • 1874

OpenGL学习笔记-2015.4.1——纹理加载与控制

在纹理贴图技术问世之前,虚拟3维世界只能通过几何模型去模拟现实,可想而知,现实世界的错综复杂,计算量之大并不能满足实时显示的需求。纹理映射带来了革命性的变换,简单的使得虚拟的3维世界得以无限接近于现实...
  • coderling
  • coderling
  • 2015-04-05 18:18:37
  • 3126

OpenGL纹理贴图24位bmp图片,代码如下

#include #include #include #include #define FileName "./duke.bmp" #define BMP_Header_Leng...
  • isaacblue
  • isaacblue
  • 2012-06-06 15:54:05
  • 1842

OpenGL中不用AUX库来加载BMP图片作为纹理

    大家在OpenGL中一般是用aux库的auxDIBImageLoad()函数来加载BMP格式的图片来作为纹理,这个确实是比较简单易用,但aux库的性能不佳,经常会出问题,稳定性较差。所以一般最...
  • skyman_2001
  • skyman_2001
  • 2006-05-28 21:50:00
  • 10348

VS2010 下 OpenGL auxDIBImageLoad函数出错

VS2010下 解决无法解析的外部符号 _auxDIBImageLoadA@4,该符号在函数 "struct _AUX_RGBImageRec * __cdecl LoadBMP(char *)"  ...
  • twtian01
  • twtian01
  • 2013-11-12 16:18:53
  • 2417

OpenGL学习笔记之加载纹理

OpenGL学习笔记之加载纹理纹理贴图步骤1、在主函数打开纹理贴图的开关 glEnable(GL_TEXTURE_2D); 2、加载位图文件struct BMP { int iWidth;//...
  • Mr_zxy
  • Mr_zxy
  • 2017-08-30 09:12:59
  • 231
收藏助手
不良信息举报
您举报文章:不用AuxDIBImageLoad()向opengl中载入bmp纹理
举报原因:
原因补充:

(最多只允许输入30个字)