论文部分内容阅读
摘要:自然景物的模拟是近年来计算机图形学中具有挑战性的研究方向之一。OpenGL技术是实现真实感图形模拟的重要方法之一。本文使用OpenGL的编程接口,应用纹理映射技术,实现了三维场景的真实模拟。纹理映射技术的应用能增强三维场景绘制的真实感,并能提高三维场景的渲染速度。
关键词:OpenGL;纹理映射;三维场景
中图分类号:TP301文献标识码:A文章编号:1009-3044(2007)03-10812-02
1 引言
纹理映射技术产生上个世纪七十年代,是模拟自然景物表面细节的一种有效方法,在生成真实感图形中得到了大量的应用。在过去的几十年中,人们一直通过建模的方法仿真客观世界,由于客观世界千变万化、错综复杂,要把客观世界的各种细微结构直接用几何模型表示出来,不仅模型难以建立,而且计算量庞大,难以满足实时显示的要求。因此,在实际应用中,为了获得比较高的显示速度,往往以牺牲图形的真实感为代价。尽管这样,显示一幅较复杂的图形往往需要好几个小时,并且能满足实时性要求的几何模型一直没有找到。于是,人们就想象是否可以用“贴”墙纸的方法将反映物体表面细节的图案贴到物体表面上,从而开辟了一个新的研究领域——纹理映射(texture mapping)。
2 OpenGL简述
OpenGL是由SGI公司推出的独立于操作系统和硬件环境的开放式三维图形库,作为一种用于实时3D图形的工业标准API(Application Programmin Interface)已经得到了广泛的认可和接受。
OpenGL提供了155个图形函数,开发人员可以利用这些函数来构造景物模型,开发三维图形实时交互软件。OpenGL具有强大的图形功能和良好的跨平台移植能力,目前已被广泛应用于可视化技术、实体造型、CAD/CAM、模拟仿真等诸多领域。
纹理映射技术是OpenGL的一个重要的技术,在进行模型转换和投影转换都能执行操作,可用到所有的图元:点、线、多边形、位图和图像上。
3 纹理的定义和分类
我们可以从自然角度、运算角度及分析角度分别给出纹理的定义:
从自然角度来看,纹理是在某一确定的图象区域中,以近乎周期的种类和方式重复其自身的局部基本模式元。这一定义由Pratt給出,它适合应用于确定类型的线条模式。
基于运算角度,纹理是在某一运算表达式规定下,为近乎不变或者近乎周期性的数量表达。此定义由Sklansky给出,它适合于根据数学的分析方法抽取纹理特征以实现纹理区域分类的应用领域。
基于分析角度,纹理为一个宏观的图象区域,其结构可以简单地归结为一些重复性的模式,这些模式的基本模式元依据确定的规则排列,f=R(e),式中,R为关系,e为基本模式元,f为纹理。
从上述三个不同形式的定义中,我们可以看出:人们无法依据一个关于纹理的完整的形式化定义来工作,必须根据具体的情况来决定使用那种纹理分析方法。
根据纹理定义域的不同,纹理可分为一维纹理、二维纹理和三维纹理;基于纹理的表现形式,纹理可又分为颜色纹理、几何纹理和过程纹理三大类。
颜色纹理是通过颜色色彩或明暗度的变化体现出来的表面细节,它在光滑表面上描绘附加定义的花纹或图案,例如大理石墙面、墙上贴的字画、器皿上的图案等都可用颜色纹理来模拟,如图1(a)所示。
图1 颜色纹理、几何纹理与过程纹理
几何纹理是指基于景物表面微观几何形状的表面纹理,它是根据粗糙表面的光反射原理,通过一个扰动函数扰动物体表面参数,使表面呈现出凹凸不平的形状,又称为粗糙纹理,如桔子、树干、岩石、山脉等表面呈现的凹凸不平的纹理细节,如图1(b)所示。而过程纹理则表现了各种规则或不规则的动态变化的自然景象,如水波、云、火、烟雾等,图1(c)为一块云的过程纹理。
4 纹理映射的概念
纹理映射技术是指将一个纹理函数映射到三维物体表面来模拟景物的表面细节,是真实感图形生成的有效途径。
一般来说,二维纹理定义在一平面区域内,它可以用数学函数解析地表示,亦可以用各种数字化图像来离散定义。这样,该平面区域上的每一点处,均定义有一灰度值或颜色值。我们称该平面区域为纹理空间。在图形绘制时,应用纹理映射方法可方便地确定景物表面上任一可见点P在纹理空间中的对应位置(u,v),而(u,v)处所定义的纹理值或颜色值即描述了景物表面在P点处的某种纹理属性,如表面法向量、漫反射系数等。
以二维纹理为例,其关键点是建立物体空间坐标(x,y,z)与纹理空间坐标(s,t)之间的对应关系,用函数来描述即为:
在(1)式中T表示纹理空间,O表示景物空间。例如将一块木柴纹理映射到一个立方体上,其结果如图2所示:
图2 将一块木板纹理映射到由立方体上来模拟木箱
5 基于OpenGL的纹理映射
尽管纹理映射是一个较复杂的过程,但是大都具备以下几个基本步骤:(1)纹理定义;(2)控制滤波;(3)启用纹理映射;(4)给出纹理坐标和几何坐标以绘制场景。
5.1 定义纹理
正如大多数图像那样,纹理通常被认为是二维的。但是,纹理也可以是一维的或者是三维的。描述纹理的数据,每个纹理单元可以包括1、2、3或4个元素,用来表示从用一个常数,到用(R,G,B,A)四元组所能表示的任何事物。OpenGL定义二维纹理的函数是glTexImage2D(),其函数原型为:
voidglTexImage2D(Glenumtarget,Glintcomponents,GLsizeiwidth,GLsizeiheight,GLintborder,GLenuformat,GLenumtype,constGLvoid*pixels);
5.2 纹理模式
OpenGL对于不同的渲染类型定义三种纹理模式:(1)GL-MODULATE,默认模式,在绘制到帧缓存区之前,纹理图像与帧缓存区复合。调整当前亮度和元素信息,使之适应纹理图像;(2)GL-DECAL,纹理图像直接绘制到帧缓存区;(3)GL-BLEND,在绘制到帧缓存区之前,纹理图像与一种常量颜色GL-TEXTURE-ENV-MODE混色。
使用glTexEnv()函数设置纹理模式的举例:
glTexEnvi(GL-TEXTURE-ENV,GL-TEXTURE-ENV-MODE,GL-DECAL);
5.3 纹理过滤
OpenGL提供两种纹理控制方式:放大滤波和缩小滤波。
例如:
glTexParameeteri(GL-TEXTURE-2D,
GLTEXTURE-MAG-FILTER,GL-NEAR-EST)
glTexParameeteri(GL-TEXTURE-2D,
GLTEXTURE-MIN-FILTER,GL-NEAR-EST)
5.4 纹理坐标
纹理坐标可以包含1、2、3或4个坐标值的,通常用s、t、r和q来表示。OpenGL用函数glTexCoord()定义纹理坐标。纹理坐标,纹理矩形大小以及被贴物体的表面形状将直接影响纹理贴图的效果。
5.4.1 重复和定位纹理
纹理坐标位于0.0和1.0之间,当坐标值不在这一范围内时,它们或者被夹紧(wrap=GL-CLAMP,默认),或者重复(wrap=GL-REPEAT)。GL-CLAMP:纹理坐标到了图像边界时,会在边界处停止。GL-REPEAT:纹理坐标进行重复,绕转到图像的另一边。
用glTexParameterf()函数重复和定位纹理,例如在s和t方向上重复纹理:
glTexParameterf(GL-TEXTURE-2D,GLTEXTURE-WRAP-S,GL-REPEAT);
glTexParameterf(GL-TEXTURE-2D,GLTEXTURE-WRAP-T,GL-REPEAT);
5.4.2 自动生成纹理坐标
使用纹理映射构造模型的轮廓图,或者模拟光亮物体表面反射周围场景中的景物效果时,使用glTexGen()函數自动生成纹理坐标。
Void glTexGen{ifd} {v}(GLenumcoord,GLenumpname,TYPEparam);
函数说明:该函数自动生成某一方向上的纹理坐标。
Coord:必须是GL-S、GL-T、GL-R和GL-Q,分别生成s、t、r和q纹理坐标。
(1)创建轮廓图
pname为GL-TEXTURE-GEN-MODE,param为GL-OBJECT-LINEAR时,生成函数对物体顶点坐标(x0,y0,z0,w0)进行线性组合。
生成的坐标=(p1x0,p2y0,p3z0,p4w0),p1、p2、p3和p4的值由glTexGen()函数的param参数给出,对p1、p2、p3和p4进行单位化,该函数给定了顶点到平面的距离。例如:若p1=p3=p4,p2=1,则函数给定的是顶点到平面y=0的距离。顶点到平面一面的距离为正,到平面另一面的距离为负,如果为零则顶点在平面上。
一个纹理图像对于移动的物体一直保持不变时,应在物体坐标中指定参考平面,可以使用GL-OBJECT-LINEAR,在物体表面贴铺木纹;在移动的物体上生成动态的轮廓线,应在视点坐标GL-EYE-LINEAR中指定参考平面。
(2)环境映射
对于位于场景中表面光滑的物体,在真实世界中,它的表面应该反射出周围环境中的景物。这种效果可以运用OpenGL的环境映射来实现。
例如:自动生成支持环境映射的纹理坐标
glTexGeni(GL-S,GL-TEXTURE-GEN-MODE,GL-SPHERE-MAP);
glTexGeni(GL-T,GL-TEXTURE-GEN-MODE,GL-SPHERE-MAP);
glEnable(GL-TEXTURE-GEN-S);
glEnable(GL-TEXTURE-GEN-T);
GL-SPHERE-MAP常量为引用环境映射,创建适当的纹理坐标,并且在s和t方向上指定此常量。
6 真实感图形的绘制
在绘制三维场景时,应用OpenGL纹理映射技术绘制具有真实感场景图。其效果图如图3、图4所示。
在图4中通过增加融合、反走样和雾化等一些特殊的显示效果,使生成的场景看起来更有真实感。
7 结束语
在VC++环境下,使用OpenGL的编程接口,在场景中采用光照、纹理映射等技术,能逼真地再现了三维场景中三维地形的真实感,取得了较好的渲染效果。
参考文献:
[1] Peachey D R. Modeling waves and surfaces[J]. Computer Graphics, 4,pp.65-74, 1986.
[2] 徐迎庆, 等. 基于物理模型的流水及波浪模拟[J]. 计算机学报,1996,19[S]:153-163.
[3] DavidFRogers(美),石教英, 等译. 计算机图形学的算法[M]. 机械工业出版社,2002.
[4] Mason Woo, 等. OpenGL编程权威指南[M]. 中国电力出版社,2001.
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词:OpenGL;纹理映射;三维场景
中图分类号:TP301文献标识码:A文章编号:1009-3044(2007)03-10812-02
1 引言
纹理映射技术产生上个世纪七十年代,是模拟自然景物表面细节的一种有效方法,在生成真实感图形中得到了大量的应用。在过去的几十年中,人们一直通过建模的方法仿真客观世界,由于客观世界千变万化、错综复杂,要把客观世界的各种细微结构直接用几何模型表示出来,不仅模型难以建立,而且计算量庞大,难以满足实时显示的要求。因此,在实际应用中,为了获得比较高的显示速度,往往以牺牲图形的真实感为代价。尽管这样,显示一幅较复杂的图形往往需要好几个小时,并且能满足实时性要求的几何模型一直没有找到。于是,人们就想象是否可以用“贴”墙纸的方法将反映物体表面细节的图案贴到物体表面上,从而开辟了一个新的研究领域——纹理映射(texture mapping)。
2 OpenGL简述
OpenGL是由SGI公司推出的独立于操作系统和硬件环境的开放式三维图形库,作为一种用于实时3D图形的工业标准API(Application Programmin Interface)已经得到了广泛的认可和接受。
OpenGL提供了155个图形函数,开发人员可以利用这些函数来构造景物模型,开发三维图形实时交互软件。OpenGL具有强大的图形功能和良好的跨平台移植能力,目前已被广泛应用于可视化技术、实体造型、CAD/CAM、模拟仿真等诸多领域。
纹理映射技术是OpenGL的一个重要的技术,在进行模型转换和投影转换都能执行操作,可用到所有的图元:点、线、多边形、位图和图像上。
3 纹理的定义和分类
我们可以从自然角度、运算角度及分析角度分别给出纹理的定义:
从自然角度来看,纹理是在某一确定的图象区域中,以近乎周期的种类和方式重复其自身的局部基本模式元。这一定义由Pratt給出,它适合应用于确定类型的线条模式。
基于运算角度,纹理是在某一运算表达式规定下,为近乎不变或者近乎周期性的数量表达。此定义由Sklansky给出,它适合于根据数学的分析方法抽取纹理特征以实现纹理区域分类的应用领域。
基于分析角度,纹理为一个宏观的图象区域,其结构可以简单地归结为一些重复性的模式,这些模式的基本模式元依据确定的规则排列,f=R(e),式中,R为关系,e为基本模式元,f为纹理。
从上述三个不同形式的定义中,我们可以看出:人们无法依据一个关于纹理的完整的形式化定义来工作,必须根据具体的情况来决定使用那种纹理分析方法。
根据纹理定义域的不同,纹理可分为一维纹理、二维纹理和三维纹理;基于纹理的表现形式,纹理可又分为颜色纹理、几何纹理和过程纹理三大类。
颜色纹理是通过颜色色彩或明暗度的变化体现出来的表面细节,它在光滑表面上描绘附加定义的花纹或图案,例如大理石墙面、墙上贴的字画、器皿上的图案等都可用颜色纹理来模拟,如图1(a)所示。
图1 颜色纹理、几何纹理与过程纹理
几何纹理是指基于景物表面微观几何形状的表面纹理,它是根据粗糙表面的光反射原理,通过一个扰动函数扰动物体表面参数,使表面呈现出凹凸不平的形状,又称为粗糙纹理,如桔子、树干、岩石、山脉等表面呈现的凹凸不平的纹理细节,如图1(b)所示。而过程纹理则表现了各种规则或不规则的动态变化的自然景象,如水波、云、火、烟雾等,图1(c)为一块云的过程纹理。
4 纹理映射的概念
纹理映射技术是指将一个纹理函数映射到三维物体表面来模拟景物的表面细节,是真实感图形生成的有效途径。
一般来说,二维纹理定义在一平面区域内,它可以用数学函数解析地表示,亦可以用各种数字化图像来离散定义。这样,该平面区域上的每一点处,均定义有一灰度值或颜色值。我们称该平面区域为纹理空间。在图形绘制时,应用纹理映射方法可方便地确定景物表面上任一可见点P在纹理空间中的对应位置(u,v),而(u,v)处所定义的纹理值或颜色值即描述了景物表面在P点处的某种纹理属性,如表面法向量、漫反射系数等。
以二维纹理为例,其关键点是建立物体空间坐标(x,y,z)与纹理空间坐标(s,t)之间的对应关系,用函数来描述即为:
在(1)式中T表示纹理空间,O表示景物空间。例如将一块木柴纹理映射到一个立方体上,其结果如图2所示:
图2 将一块木板纹理映射到由立方体上来模拟木箱
5 基于OpenGL的纹理映射
尽管纹理映射是一个较复杂的过程,但是大都具备以下几个基本步骤:(1)纹理定义;(2)控制滤波;(3)启用纹理映射;(4)给出纹理坐标和几何坐标以绘制场景。
5.1 定义纹理
正如大多数图像那样,纹理通常被认为是二维的。但是,纹理也可以是一维的或者是三维的。描述纹理的数据,每个纹理单元可以包括1、2、3或4个元素,用来表示从用一个常数,到用(R,G,B,A)四元组所能表示的任何事物。OpenGL定义二维纹理的函数是glTexImage2D(),其函数原型为:
voidglTexImage2D(Glenumtarget,Glintcomponents,GLsizeiwidth,GLsizeiheight,GLintborder,GLenuformat,GLenumtype,constGLvoid*pixels);
5.2 纹理模式
OpenGL对于不同的渲染类型定义三种纹理模式:(1)GL-MODULATE,默认模式,在绘制到帧缓存区之前,纹理图像与帧缓存区复合。调整当前亮度和元素信息,使之适应纹理图像;(2)GL-DECAL,纹理图像直接绘制到帧缓存区;(3)GL-BLEND,在绘制到帧缓存区之前,纹理图像与一种常量颜色GL-TEXTURE-ENV-MODE混色。
使用glTexEnv()函数设置纹理模式的举例:
glTexEnvi(GL-TEXTURE-ENV,GL-TEXTURE-ENV-MODE,GL-DECAL);
5.3 纹理过滤
OpenGL提供两种纹理控制方式:放大滤波和缩小滤波。
例如:
glTexParameeteri(GL-TEXTURE-2D,
GLTEXTURE-MAG-FILTER,GL-NEAR-EST)
glTexParameeteri(GL-TEXTURE-2D,
GLTEXTURE-MIN-FILTER,GL-NEAR-EST)
5.4 纹理坐标
纹理坐标可以包含1、2、3或4个坐标值的,通常用s、t、r和q来表示。OpenGL用函数glTexCoord()定义纹理坐标。纹理坐标,纹理矩形大小以及被贴物体的表面形状将直接影响纹理贴图的效果。
5.4.1 重复和定位纹理
纹理坐标位于0.0和1.0之间,当坐标值不在这一范围内时,它们或者被夹紧(wrap=GL-CLAMP,默认),或者重复(wrap=GL-REPEAT)。GL-CLAMP:纹理坐标到了图像边界时,会在边界处停止。GL-REPEAT:纹理坐标进行重复,绕转到图像的另一边。
用glTexParameterf()函数重复和定位纹理,例如在s和t方向上重复纹理:
glTexParameterf(GL-TEXTURE-2D,GLTEXTURE-WRAP-S,GL-REPEAT);
glTexParameterf(GL-TEXTURE-2D,GLTEXTURE-WRAP-T,GL-REPEAT);
5.4.2 自动生成纹理坐标
使用纹理映射构造模型的轮廓图,或者模拟光亮物体表面反射周围场景中的景物效果时,使用glTexGen()函數自动生成纹理坐标。
Void glTexGen{ifd} {v}(GLenumcoord,GLenumpname,TYPEparam);
函数说明:该函数自动生成某一方向上的纹理坐标。
Coord:必须是GL-S、GL-T、GL-R和GL-Q,分别生成s、t、r和q纹理坐标。
(1)创建轮廓图
pname为GL-TEXTURE-GEN-MODE,param为GL-OBJECT-LINEAR时,生成函数对物体顶点坐标(x0,y0,z0,w0)进行线性组合。
生成的坐标=(p1x0,p2y0,p3z0,p4w0),p1、p2、p3和p4的值由glTexGen()函数的param参数给出,对p1、p2、p3和p4进行单位化,该函数给定了顶点到平面的距离。例如:若p1=p3=p4,p2=1,则函数给定的是顶点到平面y=0的距离。顶点到平面一面的距离为正,到平面另一面的距离为负,如果为零则顶点在平面上。
一个纹理图像对于移动的物体一直保持不变时,应在物体坐标中指定参考平面,可以使用GL-OBJECT-LINEAR,在物体表面贴铺木纹;在移动的物体上生成动态的轮廓线,应在视点坐标GL-EYE-LINEAR中指定参考平面。
(2)环境映射
对于位于场景中表面光滑的物体,在真实世界中,它的表面应该反射出周围环境中的景物。这种效果可以运用OpenGL的环境映射来实现。
例如:自动生成支持环境映射的纹理坐标
glTexGeni(GL-S,GL-TEXTURE-GEN-MODE,GL-SPHERE-MAP);
glTexGeni(GL-T,GL-TEXTURE-GEN-MODE,GL-SPHERE-MAP);
glEnable(GL-TEXTURE-GEN-S);
glEnable(GL-TEXTURE-GEN-T);
GL-SPHERE-MAP常量为引用环境映射,创建适当的纹理坐标,并且在s和t方向上指定此常量。
6 真实感图形的绘制
在绘制三维场景时,应用OpenGL纹理映射技术绘制具有真实感场景图。其效果图如图3、图4所示。
在图4中通过增加融合、反走样和雾化等一些特殊的显示效果,使生成的场景看起来更有真实感。
7 结束语
在VC++环境下,使用OpenGL的编程接口,在场景中采用光照、纹理映射等技术,能逼真地再现了三维场景中三维地形的真实感,取得了较好的渲染效果。
参考文献:
[1] Peachey D R. Modeling waves and surfaces[J]. Computer Graphics, 4,pp.65-74, 1986.
[2] 徐迎庆, 等. 基于物理模型的流水及波浪模拟[J]. 计算机学报,1996,19[S]:153-163.
[3] DavidFRogers(美),石教英, 等译. 计算机图形学的算法[M]. 机械工业出版社,2002.
[4] Mason Woo, 等. OpenGL编程权威指南[M]. 中国电力出版社,2001.
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。