VC运用OPENGL加载BMP纹理图的实现方法汇总

 更新时间:2020年4月25日 17:42  点击:1623

OpenGL是专业的图形程序接口,功能非常强大,调用方便的底层图形库。本文汇总了运用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.bmHeight,GL_BGR_EXT, GL_UNSIGNED_BYTE,BM.bmBits);

方法二:

首先用OpenGL辅助库获得位图信息:

AUX_RGBImageRec* TextureImage[1];
TextureImage[0]=auxDIBImageLoad("1.bmp");

然后建立纹理

gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

方法三:

从底层做,需要了解bmp文件的结构,首先读取bmp文件结构,包括文件头、信息头和数据,数据用于后面定义纹理

long ImageWidth=256;
long ImageHeight=256; 
GLubyte Image[256][256][3];
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_bitmapheader->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(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, 26, 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_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->biClrUsed, 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, &bitmapheader , &bitmapinfo) ;
 if(bitmapinfo.biBitCount != 24)
 {
  puts("UNSUPPORT") ;
  return;
 }
 ImageWidth = bitmapinfo.biWidth;
 ImageHeight = bitmapinfo.biHeight;
 int i=bitmapheader.bfOffBits;
 while(i<bitmapheader.bfSize)
 {
  for(int j=0;j<ImageWidth;j++)
  for(int k=0;k<ImageHeight;k++)
  {
   fseek(fp, i, SEEK_SET) ;
   fread(Image[j][k]+2, 1, 1, fp) ;
   fseek(fp, i+1, SEEK_SET) ;
   fread(Image[j][k]+1, 1, 1, fp) ;
   fseek(fp, i+2, SEEK_SET) ;
   fread(Image[j][k], 1, 1, fp) ;
   i=i+3;
  } 
 } 
 fclose(fp) ;
}
glTexImage2D(GL_TEXTURE_2D,0,3,ImageWidth,ImageHeight,0,GL_RGB,GL_UNSIGNED_BYTE,&Image[0][0][0]);

#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
}

[!--infotagslink--]

相关文章

  • SpringMVC文件上传原理及实现过程解析

    这篇文章主要介绍了SpringMVC文件上传原理及实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-15
  • C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?

    这篇文章主要介绍了C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?,这也小编做.NET项目时经常思考和让人混乱的一个问题,这篇文章写的挺好,一下清晰了许多,需要的朋友可以参考下...2020-06-25
  • 使用Maven 搭建 Spring MVC 本地部署Tomcat的详细教程

    这篇文章主要介绍了使用Maven 搭建 Spring MVC 本地部署Tomcat,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-08-16
  • SpringMvc自动装箱及GET请求参数原理解析

    这篇文章主要介绍了SpringMvc自动装箱及GET请求参数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
  • vc提示unexpected end of file found的原因分析

    这篇文章主要介绍了vc提示unexpected end of file found的原因分析,给出了几点常见错误原因的分析,需要的朋友可以参考下...2020-04-25
  • SpringMvc获取请求头请求体消息过程解析

    这篇文章主要介绍了SpringMvc获取请求头请求体消息过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-17
  • 详解CocosCreator MVC架构

    这篇文章主要介绍了CocosCreator MVC架构,同学们在制作游戏过程中,尽量使用一些架构,会避免很多问题...2021-04-16
  • Springmvc ResponseBody响应json数据实现过程

    这篇文章主要介绍了Springmvc ResponseBody响应json数据实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-26
  • 基于C#后台调用跨域MVC服务及带Cookie验证的实现

    本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下...2020-06-25
  • 理解javascript中的MVC模式

    这篇文章主要为大家介绍了javascript中的MVC模式,MVC是一种软件架构模式,一般把软件模式分为三部分,本文就针对MVC模式的三部分进行讲解,感兴趣的小伙伴们可以参考一下...2016-02-01
  • 仅30行代码实现Javascript中的MVC

    这篇文章主要介绍了仅30行代码实现Javascript中的MVC的方法,MVC的基础是观察者模式,这是实现model和view同步的关键,想要深入了解的朋友可以参考本文...2016-02-18
  • Spring MVC 处理一个请求的流程

    Spring MVC是Spring系列框架中使用频率最高的部分。不管是Spring Boot还是传统的Spring项目,只要是Web项目都会使用到Spring MVC部分。因此程序员一定要熟练掌握MVC部分。本篇博客简要分析Spring MVC处理一个请求的流程。...2021-02-06
  • 使用jQuery.form.js/springmvc框架实现文件上传功能

    这篇文章主要介绍了使用jQuery.form.jsspringmvc框架实现文件上传功能,非常具有参考借鉴价值,感兴趣的朋友一起学习吧...2016-05-14
  • SpringMVC和rabbitmq集成的使用案例

    这篇文章主要介绍了SpringMVC和rabbitmq集成的使用案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-20
  • AngularJS教程之MVC体系结构详解

    本文主要讲解AngularJS MVC体系结构,这里提供详细的教程供大家学习参考,有需要的小伙伴可以参考下...2016-08-24
  • web面试MVC与MVVM区别及Vue为什么不完全遵守MVVM解答

    这篇文章主要介绍了web面试中常问问题,MVC与MVVM区别以及Vue为什么不完全遵守MVVM的难点解答,有需要的朋友可以借鉴参考下,希望能够有所帮助...2021-09-24
  • ASP.NET MVC API 接口验证的示例代码

    本篇文章主要介绍了ASP.NET MVC API 接口验证的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2021-09-22
  • SpringMVC中的handlerMappings对象用法

    这篇文章主要介绍了SpringMVC中的handlerMappings对象用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-26
  • ASP.NET Core MVC如何实现运行时动态定义Controller类型

    这篇文章主要介绍了ASP.NET Core MVC如何实现运行时动态定义Controller类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • VC中CDC、HDC、pDC区别与联系及相互转换

    这篇文章主要介绍了VC中CDC、HDC、pDC区别与联系及相互转换的方法,非常的详细,有需要的小伙伴可以参考下,希望对大家学习VC能够有所帮助。...2020-04-25