两种加载BMP纹理图像的方法

时间:2021-07-10 09:43:57

     在NeHe上,通过BMP文件来加载纹理,使用的是glaux.h函数库中的auxDIBImageLoad(Filename)函数来解决的,使用起来比较方便,可是,glaux.h这个函数库作为OpenGL平台发展的一个中间过渡产品,存在这不够稳定及功能不够完整的缺点,所以一般不使用这个函数库,而选择glut.h,以下是分别应用这两种函数库来实现纹理图像加载的实例:

   1. 使用glaux.h函数库实现

     主要由两个函数实现,分别是LoadBMP()与LoadGLTextures()。

 

两种加载BMP纹理图像的方法两种加载BMP纹理图像的方法Code

 

 

两种加载BMP纹理图像的方法两种加载BMP纹理图像的方法Code

 

   2.在glut.h函数库下实现

    通过函数实现LoadTexture(LPTSTR szFileName, GLuint &texid)实现

 

两种加载BMP纹理图像的方法两种加载BMP纹理图像的方法Code

 

   其中有三个函数需要进一步的解释,分别是LoadImage(),GetModuleHandle,GetObject()。

   LoadImage()在系统中的定义如下:

两种加载BMP纹理图像的方法两种加载BMP纹理图像的方法Code

   参数分别表示如下:

   HINSTANCE---------包含所需要图片的实例的句柄。
   LPCSTR--------------图片所在路径及文件名。

   UINT-------------------图片类型。

   int-----------------------图片宽度。
   int-----------------------图片高度。
   UINT-------------------load flags(具体意义还没有弄清楚)

   而在LoadImage函数中HINSTANCE参数是通过GetModuleHandle(NULL)获取的,GetModuleHandle的函数声明如下:

     HMODULE GetModuleHandle( LPCTSTR lpModuleName);  

     函数的声明挺简单的,但对这个函数的解释却不少,解释如下:

     用指针指向一个包含模块名以NULL字符结尾的串,模块是.dll或.exe文件。如果文件扩展名省略,则增加默认的扩展名.dll。文件名串可以是省略号(...),表示模块名没有扩展名。这个串不是必须指定一个路径。当指定一个路径时,确定要用反斜线(\),而不是斜线(/)。这个模块名将和当前映射到调用进程地址空间的模块名进行独立地比较。假如这个参数是NULL,函数将返回创建调用进程(.exe文件)的文件的句柄。 

    如果函数调用成功,返回值是某一模块的句柄。如果函数调用失败,返回NULL。

    最后就是GetObject()函数的注释,如下:  

    函数原型:int GetObject(HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject);

    参数:
  hgdiobj:指向感兴趣的图形对象的句柄,它可以是这样的一个句柄:一个逻辑位图、一个刷子、一种字体、一个调色板、笔或通过调用CreateDIBsection函数创建的与设备无关位图。
  cbBuffer:指定将要写到缓冲区的信息的字节数目。
  lpvObject:指向一个缓冲区的指针,该缓冲区将要检索指定图形对象的信息。
      这三个参数暂时还不能完全的理解,只是现在会使用就够了,以后再做深究。

      好了,以上两种情况下的BMP纹理图像的加载就是这么多,如果以后有更好的方法再做更新。

  特别需要注意的一点是,以上两种方法加载对.bmp位图的纹理图片,在加载之前应仔细检查图片是不是.bmp格式的,检查方法,用二进制工具UltraEdit打开图片,若开头两个字符数是"BM",说明是.bmp文件,否则不是.