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

OpenGL载入图片作为纹理

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

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

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

opengl 光照,材质,BMP纹理贴图的代码模板

BMP纹理贴图: 首先把纹理图片,用画图另存为转成BMP格式(24bit-bmp) 纹理加载函数: //两个纹理对象的编号 GLuint tex1; GLuint tex2; int power_of...
  • u010309553
  • u010309553
  • 2016年10月20日 13:34
  • 1378

OpenGL加载纹理深入详解。

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

OpenGL纹理详解(上)

转载自:http://www.jianshu.com/p/1829b4acc58d 写在前面的话 现实生活中,纹理最通常的作用是装饰我们的物体模型,它就像是贴纸一样贴在物体表面,使得物体表...
  • dream2050csdn
  • dream2050csdn
  • 2017年03月16日 19:21
  • 278

孙其功陪你学之——OpenGL加载OBJ模型文件并进行纹理修饰

本人在学习opengl做项目时,需要设计三维人脸模型。于是寻找多种方案。求得用opengl读取OBJ模型文件,并进行纹理修饰这一解决方案。在使用中用到了glm.c的库。以下是进行解决读取OBJ文件并进...
  • a350203223
  • a350203223
  • 2013年08月20日 04:34
  • 5350

OpenGL显示中文和旋转立方体贴图

用OpenGL实现立方体贴图和显示中文。初学者可以阅读。
  • hushiwei1993
  • hushiwei1993
  • 2015年01月05日 20:04
  • 785

[OpenGL] 基于纹理绘制的透明精灵(透明纹理)

在二维游戏中,我们几乎绕不开精灵绘制这一过程,除了直接在opengl读入图像并绘制外,我们更常使用纹理来完成这一过程,把纹理贴到在xy平面上的面片,做出二维游戏的效果。         这样我们可以很...
  • ZJU_fish1996
  • ZJU_fish1996
  • 2016年07月11日 02:39
  • 4920

opengles加载obj格式3D模型含光照和纹理

效果图 顶点加载类 package test.com.opengles9_5; import java.io.BufferedReader; import java.i...
  • hb707934728
  • hb707934728
  • 2016年09月12日 16:17
  • 3672

OpenGL学习笔记4:纹理

原始图像数据像素包装图像数据在内存中很少以紧密包装的形式存在。在许多硬件平台上,处于性能上的考虑,一幅图像的每一行都应该从一种特定字节对齐地址开始。绝大多数编译器会自动把变量和缓冲区放置在一个针对该架...
  • ylbs110
  • ylbs110
  • 2016年06月30日 22:33
  • 4750
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不用AuxDIBImageLoad()向opengl中载入bmp纹理
举报原因:
原因补充:

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