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

原创 2006年05月28日 21:50:00


    大家在OpenGL中一般是用aux库的auxDIBImageLoad()函数来加载BMP格式的图片来作为纹理,这个确实是比较简单易用,但aux库的性能不佳,经常会出问题,稳定性较差。所以一般最好不要用aux库,可以用glut库,但glut库没有纹理加载函数。而有些程序是直接读取BMP格式来获得图像数据,从而生成纹理的,这种方法虽然很强大,但比较复杂,需要了解BMP的格式,对初学者比较困难。而下面的一段程序是用windows的API函数LoadImage()来实现这个功能,这种实现方法很简单,可以说比auxDIBImageLoad()函数复杂不了多少。

    首先,加上头文件:

    #include <gl/glext.h>

    这是因为后面的GL_BGR_EXT是定义在这个头文件里的,因为BMP格式是按Blue,Green,Red顺序储存图像数据的,这与OpenGL中正好相反。GL_BGR_EXT就是完成两者之间的转换的。

    下面就是不用AUX库来加载BMP图片作为纹理的函数:

bool LoadTexture(LPTSTR szFileName, GLuint &texid)     // Creates Texture From A Bitmap File
{
 HBITMAP hBMP;             // Handle Of The Bitmap
 BITMAP BMP;             // Bitmap Structure

 glGenTextures(1, &texid);          // Create The Texture
 hBMP=(HBITMAP)LoadImage(GetModuleHandle(NULL), szFileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE );

 if (!hBMP)              // Does The Bitmap Exist?
  return FALSE;            // If Not Return False

 GetObject(hBMP, sizeof(BMP), &BMP);        // Get The Object
                 // hBMP:        Handle To Graphics Object
                 // sizeof(BMP): Size Of Buffer For Object Information
                 // &BMP:        Buffer For Object Information

 glPixelStorei(GL_UNPACK_ALIGNMENT, 4);       // Pixel Storage Mode (Word Alignment / 4 Bytes)

 // Typical Texture Generation Using Data From The Bitmap
 glBindTexture(GL_TEXTURE_2D, texid);        // Bind To The Texture ID
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Linear Min Filter
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Linear Mag Filter
 glTexImage2D(GL_TEXTURE_2D, 0, 3, BMP.bmWidth, BMP.bmHeight, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits);

 DeleteObject(hBMP);            // Delete The Object

 return TRUE;             // Loading Was Successful
}

    简单吧,以后就用这个函数来加载BMP图片作为纹理吧,很方便的!

    我的BLOG:http://sm3d.126.com,QQ:175910174,欢迎交流!

 

相关文章推荐

纹理(openGL)

0.概述 a. b.小栗子 对两个正方形进行纹理贴图 #include "grapg.h" #define Width 64 #define Height 64 GLubyte image_te...

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

#include #include #include #include #define FileName "./duke.bmp" #define BMP_Header_Leng...

linux 下 OpenGL 读取 JPG, PNG, TAG 纹理数据

实际读取图片的代码已经上传到我的资源里面; 下面贴出使用例子: unsigned char*  esLoadJPG(const char *fileName, int *width, int *h...
  • zg260
  • zg260
  • 2014年12月30日 11:36
  • 1181

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

OpenGL加载BMP文件

以下代码来自NeHe,基于第一课框架之上:http://download.csdn.net/source/1907052  1,定义一个全局变量来存储BMP文件:GLuint texture[1]; ...

OpenGL(十一) BMP真彩文件的显示和复制操作

glut窗口除了可以绘制矢量图之外,还可以显示BMP文件,用函数glDrawPixels把内存块中的图像数据绘制到窗口上,glDrawPixels函数原型: glDrawPixels (GLsizei...
  • dcrmg
  • dcrmg
  • 2016年11月14日 22:54
  • 731

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

opengl 库的说明和简单使用

来源:http://www.cnblogs.com/crazyxiaom/articles/2073586.html 1.库的说明 所有 OpenGL 函数采用了以下格式:。 库前缀有 gl、g...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

OpenGL中gl,glu,glut的区别

OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库, gl是核心,glu是对gl的部分封装,glut是OpenGL的跨平台工具库,gl中包含了最基本的3D函数,而glu似乎对gl的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenGL中不用AUX库来加载BMP图片作为纹理
举报原因:
原因补充:

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