欢迎来到学术参考网

MFC的OpenGL纹理贴图技术研

发布时间:2015-07-09 11:06

摘要:OpenGL是一个开放的三维图形软件包,而Visual C++是目前主要的OpenGL开发工具。本文简要介绍了
OpenGL的纹理贴图技术及其在MFC中的基本操作步骤。并通过最后的实例验证了纹理贴图技术在绘制真实感图形中的必要性。

关键词:OpenGL;MFC;纹理贴图;计算机图形学

现实世界中的物体表面往往有各种纹理,因此要绘制逼真的三维物体,除了对物体进行光照处理外,还需要加上纹理贴图,使物体看起来更真实。OpenGL是SGI公司的一个开放的三维计算机图形软件接口,为用户提供丰富的图形库,能快速渲染出高质量的三维彩色图像。OpenGL编程的重点是图形的生成和如何产生各种真实效果,但是编写一个优秀的Windows程序,还必须用到用户界面接口。VC++的MFC模式可以较为完美地实现对OpenGL生成的效果图的动态交互操作。

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

OpenGL纹理贴图
纹理映射是将指定图像的一部分映射到允许进行纹理映射的每个图段上。这种映射伴随着使用一幅图像的颜色到某一图段的(s,t,r)坐标所指示的位置上并修改该图段的RGBA颜色。但要特别注意的是,在OpenGL中,纹理映射仅在RGBA模式下说明,在颜色索引模式下,它的使用未作定义。概括地说,使用纹理绘制的一般步骤为:定义纹理贴图、控制纹理、说明纹理贴图方式,定义纹理坐标等。
2.1 定义纹理
纹理的定义有两种:连续法和离散法。连续法把纹理定义为一个二元函数,函数的定义域就是纹理空间。而离散法则是把纹理定义在一个二维数组中,该数组表示纹理空间中行间隔和列间隔固定的一组网格点上的纹理值。网格点之间的其它点的纹理值可以通过对相邻网格点上纹理值进行插值来获得。通过纹理空间与物体空间之间的坐标变换,可以把纹理映射到物体表面。一般来说,离散法是较为常用的纹理定义方法。其实现函数为
glTexlmage2D()。该函数的原型void glTexImage2D(Gl_enum target,GLint level,Gl_enum compo—nents, GLsizei width, GLsizei height, Glint border,Gl_enumformat。Gl_enumtype,const GLvoid pixels);其中:target指定纹理映射,此处必须是GL—TEXT—URE 2D;level指定纹理图像分辨率的级数,当只
有一种分辨率时,level=0;Components是选择用于调整和混合的成分;width和height分别指定纹理图像的宽和高,必须是2 ,凡为正数;Border为边界的宽度,必须是0和1;format和type分别指定纹理映射的格式和数据类型;Pixels指定一个指针,指向纹理数据在内存中的位置。
2.2 控制纹理
纹理图像在映射到物体时会产生许多问题。这些问题主要有纹理图像的纹理怎样对应到屏幕上的像素、怎样通过纹理贴图实现纹理缩放和纹理重复等。其实现函数为glTexParmneter(),该函数的原型(以glTexParmneterf形式为例)为:void glTexPa—rmneterf(GLeRuin target,GLeRuin pname,GLfloat pa—ram),其中target参数为目标纹理,pname参数的取值有以下几个:GL TEXTURE MIN FILTER、GL,ⅡⅨ TURE—MAG一兀I肛R、GL—TEXrrI yRE— WRAP一GL— TEXTU RE —WRAP— T,而parmn参数的取值要根据pname而定。
2.3 说明纹理贴图方式
OpenGL用于纹理贴图方式的函数为glTex~v(),该函数的原型(以glTexEnvf形式为例)为:voidglTexEnv(Gl_enum target,Gl_enum pname,GLfloat pa—ram)其中target参数必须为GL—TEXTURE —ENV,pname参数必须为GL—TEXTURE —ENV—MODE,而参数parmn为GL—MODULATE 、GL—DECAL或GL—BLEND。
2.4 定义纹理坐标
纹理坐标控制纹理图像中的像素怎样映射到物体。纹理坐标可以是1、2、3、4维的,通常用齐次坐标来表示,即(5,t,r,q)。OpenGL定义纹理坐标的函数为 xCoord()。该函数共有32种不同的形式。例如:glTexCoord4f(O.Of,0.Of,0.Of,0.Of)。
3 基于MFC的OpenGL中的纹理贴图利用VC++的MFC AppWizard(exe)建立一个新项目OpenglTexture,选择基于单文档界面的应用,其它选项都使用缺省值。在OpenglTextureView.h头文件中,添加各成员变量和成员函数。for(i=0;i128;i++)
forfj=0;j64;j++)


{
c=(((i&Ox08)==0) ((j ))==0)*255;
g=(4*i)%255;
b:(j*i)%255;
imag~Ei儿j][0]=(GIaxbyte)b;
image[i儿J儿1]=(GIaxbyte)g;
image~i][j]=(GIaibyte)c;
}
glPixelStorei(GL—UNPACK— ALIGNMENT,2);
glTexImage2D(GL—TEXTURE一2D,0,3,64,64 ,0,GL— RGB,GL—UNSIGNED— BYTE,image);

//定义纹理
glTexParameteri(GL— TEXTURE一2D,GL— TEXTURE — W RAP— S,
GL— CLAMP);

//控制纹理
glTexParameteri(GL—
TEXTURE一2D,GL— TE XTURE — WRAP—T,GL— CLAMP);
glTexParameteri(GL—TEXTURE一2D,GL—TEXTURE—MAG—FIL—E R,GL— NEAREST);
glTexParameteri(GL— TEXTURE 一2D,GL— TEXTURE — MIN— FIL—TE R,GL— NE AREST);
rSTexEnvf(GL—TEXTURE —ENV,GL—TEXTURE —ENV—MODE,GL— DECAL);//说明纹理贴图方式
glEnable(GL— TEXTURE 一2D);//启动纹理贴图
glShadeModel(GL—SMOOTH);
glBegin(GL— QUADS);//定义纹理坐标和物体几何坐标
glTexCoord2f(1.of,1.Of);glVertex3f(1.Of,1.Of,0.Of);
glTexCoord2f(1.of,0.Of);glVertex3f(1.Of,一1.Of,0.Of);
glTexCoord2f(0.of,0.Of);glVertex3f(一1.Of,一1.Of,0.Of);
glTexCoord2f(0.Of.I.Of);glVertex3f(一I.Of,I.Of,0.Of);
glEnd();
glDisabh(GL—TEXTURE 一2D);//关闭纹理贴图


结束语
利用OpenGL强大的图形功能,可以轻松地实现逼真的贴图模型。在此基础上,运用VC++的MFC应用程序模式,可对OpenGL产生的模型进行更进一步的控制和变化。同时提供给用户一个友好的操作环境,这在当今的时尚编程中是不可或缺的。

参考文献
[1] 向世明.OpenGL编程与实例[M].北京:电子工业出版社,1999.
Hearn D,Baker M P.计算机图形学[M].北京:电子工业出版社,1998.
Kruglinski D J.Visual C++技术内幕(第四版)[M].北京:清华大学出版社,2001.
李颖,朱伯立.OpenGL技术应用实例精粹[M].北京:国防工业出版社,2001.
Toudeft Abd~ e,GaUinari Patrick.Neural and Ia ve o0n一terns[J].IEE Proceedings:Control theory and Applications,1997,144(6):531—536.

上一篇:浅谈办公网络中防火墙的应用

下一篇:防御DDoS攻击的实时监测模型