OpenGL中用bmp图片做纹理贴图的三种方法_第1页
OpenGL中用bmp图片做纹理贴图的三种方法_第2页
OpenGL中用bmp图片做纹理贴图的三种方法_第3页
OpenGL中用bmp图片做纹理贴图的三种方法_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、OpenGL中用bmp图片做纹理贴图的三种方法方法一:首先获取位图句柄HBITMAP hBmp = (HBITMAP) :LoadImage (AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);然后根据位图句柄得到位图信息BITMAP BM; :GetObject (hBmp, sizeof (BM), &BM);最后根据位图信息中的RGB值建立纹理 gluBuild2DMipmaps( GL_TEXTURE_2D, 3, BM.bmWidth, BM.b

2、mHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, BM.bmBits );方法二:首先用OpenGL辅助库获得位图信息 AUX_RGBImageRec* TextureImage1; TextureImage0=auxDIBImageLoad(1.bmp);然后建立纹理 gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage0-sizeX, TextureImage0-sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage0-data);方法三:从底层做,需要了解bmp文件的结构,首先读取

3、bmp文件结构,包括文件头、信息头和数据,数据用于后面定义纹理long ImageWidth=256;long ImageHeight=256; GLubyte Image2562563;void ReadHeader(FILE *fp , BITMAPFH * p_bitmapheader , BITMAPIH *p_bitmapinfo) fseek(fp, 0, SEEK_SET) ; fread( &p_bitmapheader-bfType,sizeof(unsigned short), 1, fp ); fseek(fp, 2, SEEK_SET) ; fread( &p_bitm

4、apheader-bfSize,sizeof(unsigned long), 1, fp ); fseek(fp, 6, SEEK_SET) ; fread( &p_bitmapheader-bfReserved1,sizeof(unsigned short), 1, fp ); fseek(fp, 8, SEEK_SET) ; fread( &p_bitmapheader-bfReserved2,sizeof(unsigned short), 1, fp ); fseek(fp, 10, SEEK_SET) ; fread( &p_bitmapheader-bfOffBits,sizeof(

5、unsigned long), 1, fp ); fseek(fp, 14, SEEK_SET) ; fread( &p_bitmapinfo-biSize, sizeof(unsigned long), 1, fp ); fseek(fp, 18, SEEK_SET) ; fread( &p_bitmapinfo-biWidth, sizeof(unsigned long), 1, fp ); fseek(fp, 22, SEEK_SET) ; fread( &p_bitmapinfo-biHeight, sizeof(unsigned long), 1, fp ); fseek(fp, 2

6、6, SEEK_SET) ; fread( &p_bitmapinfo-biPlanes, sizeof(unsigned short), 1, fp ); fseek(fp, 28, SEEK_SET) ; fread( &p_bitmapinfo-biBitCount, sizeof(unsigned short), 1, fp ); fseek(fp, 30, SEEK_SET) ; fread( &p_bitmapinfo-biCompression, sizeof(unsigned long), 1, fp ); fseek(fp, 34, SEEK_SET) ; fread( &p

7、_bitmapinfo-biSizeImage, sizeof(unsigned long), 1, fp ); fseek(fp, 38, SEEK_SET) ; fread( &p_bitmapinfo-biXPelsPerMeter, sizeof(unsigned long), 1, fp ); fseek(fp, 42, SEEK_SET) ; fread( &p_bitmapinfo-biYPelsPerMeter, sizeof(unsigned long), 1, fp ); fseek(fp, 46, SEEK_SET) ; fread( &p_bitmapinfo-biCl

8、rUsed, sizeof(unsigned long), 1, fp ); fseek(fp, 50, SEEK_SET) ; fread( &p_bitmapinfo-biClrImportant, sizeof(unsigned long), 1, fp ); void ReadBitmapFile() BITMAPFH bitmapheader ; BITMAPIH bitmapinfo ; FILE *fp; fp = fopen(6.bmp , r) ; if(!fp) puts(Read file failed.) ; return; ReadHeader(fp, &bitmap

9、header , &bitmapinfo) ; if(bitmapinfo.biBitCount != 24) puts(UNSUPPORT) ; return; ImageWidth = bitmapinfo.biWidth; ImageHeight = bitmapinfo.biHeight; int i=bitmapheader.bfOffBits; while(ibitmapheader.bfSize) for(int j=0;jImageWidth;j+) for(int k=0;kImageHeight;k+) fseek(fp, i, SEEK_SET) ; fread(Imag

10、ejk+2, 1, 1, fp) ; fseek(fp, i+1, SEEK_SET) ; fread(Imagejk+1, 1, 1, fp) ; fseek(fp, i+2, SEEK_SET) ; fread(Imagejk, 1, 1, fp) ; i=i+3; fclose(fp) ;glTexImage2D(GL_TEXTURE_2D, 0, 3, ImageWidth,ImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,&Image000);OpenGL中不用AUX库来加载BMP图片作为纹理转载(2007-02-11 21:22:15)大家在Open

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

12、_BGR_EXT是定义在这个头文件里的,因为BMP格式是按Blue,Green,Red顺序储存图像数据的,这与OpenGL中正好相反。GL_BGR_EXT就是完成两者之间的转换的。 下面就是不用AUX库来加载BMP图片作为纹理的函数:bool LoadTexture(LPTSTR szFileName, GLuint &texid)/ Creates Texture From A Bitmap FileHBITMAP hBMP;/ Handle Of The BitmapBITMAPBMP;/ Bitmap StructureglGenTextures(1, &texid);/ Create

13、The TexturehBMP=(HBITMAP)LoadImage(GetModuleHandle(NULL), szFileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE );if (!hBMP)/ Does The Bitmap Exist?return FALSE;/ If Not Return FalseGetObject(hBMP, sizeof(BMP), &BMP);/ Get The Object/ hBMP: Handle To Graphics Object/ sizeof(BMP): Siz

14、e Of Buffer For Object Information/ &BMP: Buffer For Object InformationglPixelStorei(GL_UNPACK_ALIGNMENT, 4);/ Pixel Storage Mode (Word Alignment / 4 Bytes)/ Typical Texture Generation Using Data From The BitmapglBindTexture(GL_TEXTURE_2D, texid);/ Bind To The Texture IDglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);/ Linear Min FilterglTexParameteri(GL_TEXTURE_2D, GL_TEXTU

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论