欢迎来到论文网! 识人者智,自知者明,通过生日认识自己! 生日公历:
网站地图 | Tags标签 | RSS
论文网 论文网8200余万篇毕业论文、各种论文格式和论文范文以及9千多种期刊杂志的论文征稿及论文投稿信息,是论文写作、论文投稿和论文发表的论文参考网站,也是科研人员论文检测和发表论文的理想平台。lunwenf@yeah.net。
您当前的位置:首页 > 科技论文 > 计算机论文

基于OpenGL的三维物体纹理贴图研究初苗(图文)

时间:2011-04-23  作者:秩名

论文导读:现实世界中的物体表面往往有着丰富的纹理,因此,要绘制逼真的三维物体,除了对物体进行光照处理外,还需要给物体表面附加上这种纹理特征,使之看起来更真实,这就要用到“纹理贴图”技术。文中将论述在Windows窗口系统下,用C语言和OpenGL实现三维物体的纹理贴图过程,从中可以看到纹理贴图的一般性原理与方法。三维物体的纹理贴图是开发过程中的重要一环。
关键词:OpenGL,纹理贴图,三维物体
 

0.引 言

在软件开发过程中,为了能够更好地再现三维图形,常常需要绘制逼真的景物。现实世界中的物体表面往往有着丰富的纹理,因此,要绘制逼真的三维物体,除了对物体进行光照处理外,还需要给物体表面附加上这种纹理特征,使之看起来更真实,这就要用到 “纹理贴图”技术。文中将论述在Windows窗口系统下,用C语言和OpenGL实现三维物体的纹理贴图过程,从中可以看到纹理贴图的一般性原理与方法。

1.纹理贴图的概述

纹理贴图技术又称纹理映射技术,是计算机图形学中广泛应用的一项重要技术。传统的几何造型很难描述景物表面的微观细节,而利用纹理图像来描述景物表面各点处的反射属性,可以达到模拟景物表面丰富的纹理细节的目的,从而提高计算机生成图形的真实性。另一方面,采用纹理映射的方法可以大大地简化建模的过程。发表论文。比如,同是一栋大楼表面,若完全用建模的方法来构造,则需要画出大楼的每一扇门、每一扇窗户;若采用纹理映射,只需建立简单的长方体模型, 用拍下的大楼外观图片贴至模型表面即可。相比之下,工作量要小得多。发表论文。

纹理贴图,从本质上讲,是一个位图图像。在程序中,一个纹理图像就是一个一维或二维数组,存储每一个像素的颜色值(包括R、G、B、A分值,分别存储一个像素的红、绿、蓝、透明度分值)。运用一个纹理贴图,就是把纹理图像根据纹理坐标对应到图元上。比如,现在有一个三角形,顶点坐标分别是V1、V2、V3,以及一幅纹理图像。现在,我们可以在绘制三角形之前,为顶点V1、V2、V3指定纹理坐标,使每一个顶点的坐标和它的纹理坐标一一对应,如图1所示:

图1 纹理映射

一旦建立起这种对应关系,就可以开启纹理贴图功能,让OpenGL根据顶点的贴图坐标渲染出指定的三角形,如图2那样:

图2 最终贴图结果

这就是纹理贴图的原理。

2. OpenGL的纹理贴图

纹理映射是将制定图像的一部分映射到允许进行纹理映射的每个图段上。这种映射伴随着使用一幅图像的颜色到某一图段的(s, t, r)坐标所指示的位置上并修改该图段的RGBA颜色。概括地说,使用纹理绘制的一般步骤为:定义纹理贴图、控制纹理、说明纹理贴图方式、定义纹理坐标等。

2.1 定义纹理

一般来说,离散法是比较常用的纹理定义方法,其实现函数为:glTexImage2D ()

该函数的原型如下:void glTeImage2D(GLenum target, Glintlevel, GLenum components, GLsizei width, GLsizei height, Glint border,GLenumformat,

GLenum type,const GLvoid*pixels)

其中:target指定纹理映射,此处必须是GLTEXTURE2D;level指定纹理图像分辨率的级数,当只有一种分辨率时,level=0;Components是选择用于调整和混合的成分;width和height分别指定纹理图像的宽和高,必须是2n,n为正数;Border为边界的宽度,必须是0和1;format和type分别指定纹理映射的格式和数据类型;Pixels指定一个指针,指向纹理数据在内存中的位置。

2.2 控制纹理

纹理图像在映射到物体时会产生许多问题。这些问题主要有纹理图像的纹理怎样对应到屏幕上的像素、怎样通过纹理贴图实现纹理缩放和纹理重复等。其实现函数为glTexParameter(),该函数的原型(以glTexParameterf形式为例)为: voidglTexParameterf (GLenum target, GLenum pname, GLfloat param), 其中target参数为目标纹理,pname参数的取值有以下几个: GL_TEXTURE_MIN_FILTER、GL_TEXTURE_MAG_FILTER、GL_TEXTURE_WRAP_S、GL_TEXTURE_WRAP_T,而param参数的取值要根据pname而定。发表论文。

2.3 纹理贴图模式

OpenGL用于纹理贴图方式的函数为glTexEnv(),该函数的原型(以glTexEnvf形式为例)为: voidglTexEnvf(GLenum target, GLenum pname, GLfloat param),其中target参数必须为GL_TEXTURE_ENV,pname参数必须为GL_TEXTURE_ENV_MODE,而参数param为GL_MODULATE、GL_DECAL或GL_BLEND。

2.4 纹理坐标

纹理坐标控制纹理图像中的像素怎样映射到物体。纹理坐标可以是1、2、3、4维的,通常用齐次坐标来表示,即(s, t,r, q)。OpenGL定义纹理坐标的函数为glTexCoord()。该函数共有32种不同的形式。例如:glTexCoord4f(0.0f, 0.0f,0.0f, 0.0f)。

3.三维物体纹理贴图的实现

在C++ Builder的开发环境下,结合OpenGL的纹理贴图技术,给一个六面体的表面附加纹理。首先,要定义一个纹理贴图,并将其载入内存,需在OpenGLAPPanel1的控件的OnInit事件中编写如下代码:

Void __fastcallTForm1::OpenGLAPPanel1Init (TObject *Sender)

{

BMPTexture *BMPTex = NULL;

BMPTex = OpenGLAPPanel1->LoadBMPTexture('Data/crate.bmp', false);//按照制定路径载入纹理贴图

glGenTextures(3, &texture[0]);

glBindTexture(GL_TEXTURE_2D,texture[0]);

glTexImage2D(GL_TEXTURE_2D,0, 3, BMPTex->GetWidth(), BMPTex->GetHeight(), 0, GL_RGB,GL_UNSIGNED_BYTE, BMPTex->GetPixels()); //定义纹理

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);//控制纹理

glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);//说明贴图方式

delete BMPTex;

glEnable(GL_TEXTURE_2D);//启动纹理贴图

glShadeModel(GL_SMOOTH);

}

然后,给六面体的表面附加纹理,需在OpenGLAPPanel1控件的OnPaint事件编写如下代码:

Void __fastcall TForm1::OpenGLAPPanel1Paint (TObject *Sender)

{

glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);//清除颜色缓冲区和深度缓冲区

glLoadIdentity();//重置坐标系统

glTranslatef(0.0f,0.0f,z);

glBegin(GL_QUADS);//定义纹理坐标和物体几何坐标

//前表面

glNormal3f( 0.0f, 0.0f, 1.0f);

glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);

glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);

//后表面

glNormal3f( 0.0f, 0.0f,-1.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);

glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);

glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);

//上表面

glNormal3f( 0.0f, 1.0f, 0.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);

glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);

glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);

//下表面

glNormal3f( 0.0f,-1.0f, 0.0f);

glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);

glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);

//右表面

glNormal3f( 1.0f, 0.0f, 0.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);

glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);

glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);

//左表面

glNormal3f(-1.0f, 0.0f, 0.0f);

glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);

glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);

glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);

glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);

glEnd();

}

这样我们就可以得到一个比较逼真的六面体了(如图3所示)。

图3 为上述程序产生的六面体

4.应用实例

在Windows编程和图像处理中,位图是我们经常要处理的图形图像,将位图显示在指定的区域是Windows编程的基本要求。位图可以作为图像合成的背景,也可以作为一种纹理贴在物体的表面。例如,对于一面砖墙,若不使用纹理映射,则每块砖都必须用几个多边形来绘制,整面墙需要用成千上万个多边形才能构造出来,这样会使图像过于光滑和规则而不够真实,事实上可以将这面墙看成一个大矩形,然后将一幅墙的照片贴上去,会取得更好的效果。

如图4、5所演示的模拟球体运动的画面来看,图4的物体表面均未加纹理贴图,比较图4和图5,可以看出,图5的画面更形象更逼真。

.

图4 正在运动的球体图5 正在运动的球体

5.结束语

三维物体的纹理贴图是开发过程中的重要一环。文中详细论述了在利用OpenGL开发三维图形系统的过程中,实现三维物体纹理贴图的思路和方法,对实际的项目开发具有一定的意义。


参考文献:
[1]向世明. OpenGL编程与实例[M]. 北京:电子工业出版社,1999
[2]Hearn D,Baker M P. 计算机图形学(第三版)[M]. 蔡士杰等译. 北京:电子工业出版社,2005
[3]李颖,朱伯立. OpenGL技术应用精粹[M]. 北京:国防工业出版社,2001
[4]Richard S.Wright,Jr. Benjamin Lipchak. OpenGL超级宝典(第三版)[M]. 徐波译.北京:人民邮电出版社,2005
[5]和平鸽工作室. OpenGL三维图形系统开发与使用技术(基础编程篇)[M].重庆:重庆大学出版社,2003
[6]和平鸽工作室.OpenGL高级编程与可视化系统开发系统开发篇(第二版)[M].北京:中国水利水电出版社,2005
[7]和平鸽工作室.OpenGL高级编程与可视化系统开发高级编程篇(第二版)[M]北京:中国水利水电出版社,2005
 

 

查看相关论文专题
加入收藏  打印本文
上一篇论文:基于Ontology的搜索引擎排序算法的研究
下一篇论文:基于OpenGL的虚拟现实技术在工业产品设计中的应用研究
科技论文分类
科技小论文 数学建模论文
数学论文 节能减排论文
数学小论文 低碳生活论文
物理论文 建筑工程论文
网站设计论文 农业论文
图书情报 环境保护论文
计算机论文 化学论文
机电一体化论文 生物论文
网络安全论文 机械论文
水利论文 地质论文
交通论文
相关计算机论文
    无相关信息
最新计算机论文
读者推荐的计算机论文