《虚拟现实技术》渲染工具_第1页
《虚拟现实技术》渲染工具_第2页
《虚拟现实技术》渲染工具_第3页
《虚拟现实技术》渲染工具_第4页
《虚拟现实技术》渲染工具_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

虚拟现实与人机交互余月ContentsOpenGL1OGRE23web3DOpenGL概述一、发展简史

在计算机发展初期,人们就开始从事计算机图形的开发,但直到20世纪80年代末、90年代初,三维图形才开始迅速发展,涌现出各种三维图形工具软件包,比较典型的有SGI公司开发的IRIS图形库(IRISGraphicsLibrary,IRISGL)。IRISGL是一个工业标准的3D图形软件接口,功能虽然强大但移植性不好,于是SGI公司便在此基础上开发了开放图形库(OpenGraphicsLibrary,OpenGL)。OpenGL被设计成独立于硬件、独立于窗口系统、在运行各种操作系统的各种计算机上都可用的标准化接口,并能在网络环境下以C/S模式工作,已成为专业图形处理、科学计算等高端应用领域的标准图形库,任何软、硬件厂商均可自由使用,这让它备受业界人士的追捧,应用领域十分宽广,如军事、电视广播、CAD/CAM/CAE、娱乐、艺术造型、医疗影像、虚拟世界等。二、性能与特点(1)跨平台特性(2)应用的广泛性(3)网络透明性(4)高质量和高性能(5)出色的编程特性OpenGL概述OpenGL的基本功能主要包括:1)模型绘制;2)模型观察;3)颜色模式的指定;4)光照运算;5)图像效果增强;6)位图和图像处理;7)纹理影射;8)实时动画;9)交互技术;OpenGL概述三、工作流程 整个OpenGL的基本工作流程如下图所示OpenGL概述四、操作步骤

根据OpenGL的基本工作流程,可以归纳出在OpenGL中进行主要的图形操作直至在计算机屏幕上渲染绘制出三维图形景观的基本步骤:根据基本图形单元建立景物模型,并且对所建立的模型进行数学描述。把景物模型放在三维空间中的合适的位置,并且设置视点(viewpoint)以观察所感兴趣的景观。计算模型中所有物体的色彩,其中的色彩根据应用要求来确定,同时确定光照条件、纹理粘贴方式等。把景物模型的数学描述及其色彩信息转换至计算机屏幕上的象素,这个过程也就是光栅化(rasterization)。 在这些步骤的执行过程中,OpenGL可能执行其他的一些操作,例如自动消隐处理等。另外,景物光栅化之后被送入帧缓冲器之前还可以根据需要对象素数据进行操作。OpenGL概述五、库函数(1)基本库GL (包括115个函数)

这些函数都以“gl”为前缀,主要功能包括物体描述、平移、旋转、缩放、光照、纹理、材质、像素、位图、文字处理等。所有OpenGL提供的操作都可以使用这些函数来实现,而且对于不同的软件和硬件平台,这些函数的使用是完全相同的,这个特性注定了OpenGL程序完美的可移植性。(2)实用库GLU(包括43个函数)

基本的OpenGL不支持传统上同图形标准相关的一些几何对象,为了减少一些编程负担,OpenGL提供了实用库。这是OpenGL基本库的一套子程序,这些函数以“glu”为前缀,主要功能包括绘制二次曲面、NURBS曲线曲面、复杂多边形以及纹理、矩阵管理等。实用库中的所有函数全都是由OpenGL基本库函数来编写的,使用方法与基本库相同。OpenGL概述(3)辅助库AUX

(包括31个函数) OpenGL是一个图形标准,它没有提供窗口管理和消息事件响应的函数,这样使用标准C编写OpenGL程序很不方便。辅助库以“aux”为前缀,为了方便用户提供了一些基本的窗口管理函数、事件处理函数和一些简单模型的制作函数等。例如,定义窗口的大小、处理键盘、鼠标击键事件、绘制多面体(见下表)等等。OpenGL概述三维物体绘制函数OpenGL概述(4)实用工具库GLUT(包括30多个函数)

对应于实用库GLU,OpenGL还有一个实用工具库—GLUT。GL是核心,GLU是对GL的部分封装,而GLUT是OpenGL的跨平台工具库。GL中包含了最基本的绘图函数,而GLU似乎对GL的辅助,如果算法好,不用GLU的情况下,也是可以做出同样的效果。

GLUT是基本的窗口界面,是独立于GL和GLU的。如果不喜欢用GLUT,则可以借用MFC和Win32窗口等来代替。但GLUT是跨平台的,这就保证编出的程序也是跨平台的。如果是用MFC或者Win32实现,则只能在windows操作系统上使用。 选用OpenGL的一个很大原因就是因为它的跨平台性,所以应该可以尽量的使用GLUT库。OpenGL概述六、基本语法

OpenGL的数据类型定义与其它语言,如C/C++语言基本一致。前缀数据类型相应C/C++语言类型OpenGL类型b8-bitintegersignedcharGLbytes16-bitintegershortGLshorti32-bitintegerlongGLint,GLsizeif32-bitfloating-pointfloatGLfloat,GLclampfd64-bitfloating-pointdoubleGLdouble,GLclampdub8-bitunsignedintegerunsignedcharGLubyte,GLbooleanus16-bitunsignedintegerunsignedshortGLushortui32-bitunsignedintegerunsignedlongGLuint,GLenum,GLbitfieldOpenGL概述 OpenGL的库函数命名方式很有规律,了解这种规律后阅读和编写程序都比较容易方便。 <库前缀><根命令><可选的参数个数><可选的参数类型> 首先,每个库函数有前缀gl、glu、glut、aux、wgl、glx等,表示此函数分属于OpenGL某个库,其后的函数名头字母大写,后缀是参数类型的简写,取i、f。

例如:

glVertex2i(2,

4); glVertex3f(2.0,

3.0,

5.0);OpenGL概述注意:有的参数类型后缀前带有数字2、3、4。2代表二维,3代表三维,4代表alpha值。有些函数最后带一个字母v,表示函数参数可用一个指针指向一个向量(或数组)来替代一系列单个参数值。例如,下面两种格式都表示设置当前颜色为红色,二者等价。

glColor3f(1.0,

0.0,

0.0); floatcolor_array[]={1.0,

0.0,

0.0}; glColor3fv(color_array);还有一种带“*”星号的表示方法,例如glColor*(),它表示可以用函数的各种方式来设置当前颜色。同理,glVertex*v()表示用一个指针指向所有类型的向量来定义一系列顶点坐标值。OpenGL也定义GLvoid类型,可以用它替代void类型。OpenGL概述绘制基本图元(GL库) OpenGL中绘制几何图元,必须使用glBegain()和glEnd()这一对函数,传递给glBegain()函数的参数唯一确定要绘制何种几何图元,同时,在该函数对中给出了几何图元的定义,函数glEnd()标志顶点列表的结束。

glBegin(…); …… //描述一组顶点,用于建构某种几何对象

glEnd();

函数glBegin(GLenummode)标志描述一个几何图元的顶点列表的开始,其参数mode表示几何图元的描述类型,具体类型见下表。类型说明GL_POINTS单个顶点集GL_LINES多组双顶点线段GL_POLYGON单个简单填充凸多边形GL_TRIANGLES多组独立填充三角形GL_QUADS多组独立填充四边形GL_LINE_STRIP不闭合折线GL_LINE_LOOP闭合折线GL_TRIANGLE_STRIP线型连续填充三角形串GL_TRIANGLE_FAN扇形连续填充三角形串GL_QUAD_STRIP连续填充四边形串几何图元类型绘制基本图元(GL库)

图形矩阵变换三维空间到二维平面物体是怎样从三维变换到二维的呢?相机模型

设置三角架的位置和方向摆放物体调焦或更换镜头按快门洗照片照相机模型视见体世界坐标系中的三维物体三维物体几何变换三维裁剪窗口视口变换屏幕坐标系中的图形显示投影照相机模型和变换的关系----OpenGL中常用的变换

视点变换设置三角架的位置和方向

模型变换摆放物体,调整位置

投影变换调焦或更换镜头后按快门

视口变换洗照片注意:人眼和相机镜头的视见体是圆锥形的,OpenGL中用的是棱台。

图形矩阵变换一、矩阵操作 1.设置当前矩阵 voidglLoadMatrix{fd}(constTYPE*m); 2.设置当前矩阵模式 voidglMatrixMode(GLenummode); GL_MODELVIEW 模型矩阵(默认) GL_PROJECTION 投影矩阵

GL_TEXTURE 纹理矩阵

图形矩阵变换3.设置当前矩阵为单位矩阵 voidglLoadIdentity(void);

//与glMatrixMode()配合4.矩阵堆栈操作voidglPushMatrix(void);

压入当前矩阵堆栈,以保存当前变换矩阵voidglPopMatrix(void);

将当前矩阵堆栈的栈顶矩阵弹出,恢复当前变换矩阵原先的状态。

图形矩阵变换

矩阵变换函数--视点变换二、视点变换

gluLookAt()用于设置视觉坐标系。voidgluLookAt(GLdoubleeyex,GLdoubleeyey,GLdoubleeyez, GLdoublecenterx,GLdoublecentery,GLdoublecenterz, GLdoubleupx,GLdoubleupy,GLdoubleupz);

该函数定义一个视图矩阵,并与当前矩阵相乘。

eyex,eyey,eyez指定视点的位置

centerx,centery,centerz指定参考点的位置

upx,upy,upz指定视点向上的方向gluLookAt()参数关系图如下所示。

矩阵变换函数--视点变换

矩阵变换函数--模型变换三、模型视图变换

voidglTranslate{df}(TYPEx,TYPEy,TYPEz); voidglRotate{df}(TYPEangle,TYPEx,TYPEy,TYPEz); voidglScale{df}(TYPEx,TYPEy,TYPEz);

矩阵变换函数三、投影变换

1.透视投影

voidglFrustum(GLdoubleleft,

GLdoubleRight,

GLdoublebottom,

GLdoubletop,

GLdoublenear,

GLdoublefar);

定义近裁剪平面的左下角点和右上角点;

near和far表示离视点的远近,它们总为正值。

矩阵变换函数三、投影变换

2.透视投影

voidgluPerspective(GLdoublefovy,GLdouble aspect,GLdoublezNear,GLdoublezFar);参数说明:

fovy定义视野在X-Z平面的角度,范围是[0.0,180.0]; aspect是投影平面宽度与高度的比率; zNear和zFar分别是近远裁剪面沿Z轴到视点的距离,为正值。

矩阵变换函数三、投影变换

3.正视/射投影

voidglOrtho(GLdoubleleft,

GLdoubleright,

GLdoublebottom,

GLdoubletop,

GLdoublenear,GLdoublefar)

近裁剪平面、远裁剪平面分别是一个矩形

voidgluOrtho2D(GLdoubleleft,GLdoubleright, GLdoublebottom,GLdoubletop)

用于二维图像到二维屏幕上的投影。它的near和far缺省值分别为-1.0和1.0,所有二维物体的Z坐标都为0.0。

矩阵变换函数四、视口变换

为窗口指定图形绘制区域

voidglViewport(GLintx,GLinty,

GLsizeiwidth, GLsizeiheight);

定义了视口左下角点坐标、宽度和高度。

缺省时,参数值即(0,0,winWidth,winHeight)指的是屏幕窗口的实际尺寸大小。

例子分析

gluPerspective(65.0,1,1.0,20.0); gluOrtho2D(0,

0,

400,

400);两个纵横比不同,…

光照与材质一、光照模型1.简单光照模型

当光照射到一个物体表面上时,会出现三种情形 (1)光可以通过物体表面向空间反射,产生反射光; (2)对于透明体,光可以穿透该物体并从另一端射出,产生透射光 (3)部分光将被物体表面吸收而转换成热。

在上述三种情况中,仅仅是透射光和反射光能够进入人眼产生视觉效果。反射光可以分成三个分量,即环境反射、漫反射和镜面反射。一、光照模型

2.OpenGL光照模型

环境光(AmbientLight)来自各个方向,并均匀等量向保个方向反射出去;

漫射光(DiffuseLight) 来自特定方向,向空间各方向均匀反射出去;

镜面光(SpecularLight) 100%沿特定方向反射出去;

辐射光(EmittedLight) 直接由物体发出。

光照与材质

光照与材质--光照模型3.创建光源 voidglLight{if}[v](GLenumlight,GLenumpname,TYPEparam) light指定所创建的光源号,如GL_LIGHT0...7;

pname指定光源特性(环境、漫反射、位置、衰减因子); param设置相应的光源特性值。4.启动光源

glEnable(GL_LIGHTING); //启动光照gDisable(GL_LIGHTING);//关闭光照

glEnable(GL_LIGHT0);//使所定义的每个光源有效

光照与材质--光照模型函数glLight*()参数pname说明______________________________________________________pname参数名缺省值说明______________________________________________________

GL_AMBIENT(0.0,0.0,0.0,1.0)RGBA模式下环境光GL_DIFFUSE(1.0,1.0,1.0,1.0)RGBA模式下漫反射光GL_SPECULAR(1.0,1.0,1.0,1.0)RGBA模式下镜面光GL_POSITION(0.0,0.0,1.0,0.0)光源位置齐次坐标(x,y,z,w)GL_SPOT_DIRECTION(0.0,0.0,-1.0)点光源聚光方向矢量(x,y,z)GL_SPOT_EXPONENT 0.0点光源聚光指数GL_SPOT_CUTOFF 180.0点光源聚光截止角GL_CONSTANT_ATTENUATION1.0常数衰减因子GL_LINER_ATTENUATION 0.0线性衰减因子GL_QUADRATIC_ATTENUATION0.0平方衰减因子_______________________________________________________

光照与材质--光照模型光照应用示例

GLfloatlight_position[]={1.0,1.0,1.0,0.0}; //光源位置 GLfloatlight_ambient[]={0.0,0.0,0.0,1.0}; //环境光

GLfloatlight_diffuse[]={1.0,1.0,1.0,1.0}; //漫反射光

GLfloatlight_specular[]={1.0,1.0,1.0,1.0}; //镜面光

//设置光源特性

glLightfv(GL_LIGHT0,GL_POSITION,light_position); glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);

glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);

glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular); glEnable(GL_LIGHTING); //启动光照

glEnable(GL_LIGHT0); //使用0号光源

二、明暗处理

明暗处理模式的函数为:

voidglShadeModel(GLenummode);

函数参数为GL_FLAT或GL_SMOOTH,分别表示平面明暗处理和光滑明暗处理。

系统默认为

GL_SMOOTH

光照与材质

光照与材质--材质处理三、材质处理

1.材质与定义

OpenGL用材料对光的红、绿、蓝三原色的反射率来近似定义材料的颜色。

材料颜色也分成环境、漫反射和镜面反射成分,它们决定了材料对环境光、漫反射光和镜面反射光的反射程度。

材质的定义与光源的定义类似。其函数为:

voidglMaterial{if}[v](GLenumface,GLenumpname,

TYPEparam);

参数face可以是GL_FRONT、GL_BACK、GL_FRONT_AND_BACK,它表明当前材质应用到物体的哪一个面上;pname说明一个特定的材质参数名称;param是材质的具体数值pname参数名param缺省值说明GL_AMBIENT(0.2,0.2,0.2,1.0)材料的环境光颜色GL_DIFFUSE(0.8,0.8,0.8,1.0)材料的漫反射光颜色GL_AMBIENT_AND_DIFFUSE

材料的环境光和漫反射光颜色GL_SPECULAR(0.0,0.0,0.0,1.0)材料的镜面反射光颜色GL_SHINESS0.0镜面指数(光亮度)GL_EMISSION(0.0,0.0,0.0,1.0)材料的辐射光颜色GL_COLOR_INDEXES(0,1,1)材料的环境光、漫反射光和镜面光颜色

光照与材质--材质处理三、材质处理 1.材质更改

不同的物体或同一物体的不同部分都有可能设置不同的材质,OpenGL函数库提供了两种方式实现这种要求。 (1)运用矩阵堆栈多次调用glMaterialfv()来设置多个材质,也就是改变同一场景中的不同物体的颜色。 (2)另一种方式即改变材质颜色:

voidglColorMaterial(GLenumface,GLenummode);

参数face同前,mode同前pname。

光照与材质--材质处理材质更改示例

glColorMaterial(GL_FRONT,GL_DIFFUSE);

glEnable(GL_COLOR_MATERIAL);

glColor3f(0.3,0.5,0.7);

/*drawsomeobjectshere.*/

glcolor3f(0.0,1.0,0.0);

/*drawotherobjectshere.*/

glDisable(GL_COLOR_MATERIAL);

当需要改变场景中大部分方面的单个材质时,最好调用glColorMaterial();当需要修改不止一个材质参数时,最好调用glMaterial*()。

光照与材质--材质处理

光照与材质四、材质和光源RGB值的关系

材质的颜色与光源的颜色有些不同 OpenGL的光源颜色为(LR、LG、LB),材质颜色为(MR、MG、MB),那么,在忽略所有其他反射效果的情况下,最终到达眼睛的光的颜色为(LR*MR、LG*MG、LB*MB)。

纹理映射纹理简单理解就是物体表面的花纹图案。纹理映射(TextureMapping)用来增强物体的真实感。纹理映射所需的步骤1.定义纹理;2.控制滤波;3.说明映射方式;4.

绘制场景,给出顶点的纹理坐标和几何坐标

纹理对象

1.创建纹理对象2.绑定纹理对象3.删除纹理对象一、纹理定义

voidglTexImage2D(GLenumtarget,

GLintlevel,

GLintcomponents,GLsizeiwidth,glsizeiheight,GLintborder,GLenumformat,GLenumtype,constGLvoid*pixels); //定义二维纹理

target是常数GL_TEXTURE_2D;level表示纹理图像分辨率的级数components是一个从1到4的整数,指出选择了R、G、B、A中的哪些分量用于调整和混合width和height给出了纹理图像的长度和宽度,参数border为纹理边界宽度,它通常为0,width和height必须是2m+2b,这里m是整数,长和宽可以有不同的值,b是border的值

纹理映射一、纹理定义

voidglTexImage2D(GLenumtarget,

GLintlevel,

GLintcomponents,GLsizeiwidth,glsizeiheight,GLintborder,GLenumformat,GLenumtype,constGLvoid*pixels); //定义二维纹理

参数format和type描述了纹理映射的格式和数据类型;(取值参见教材或其它参考资料)参数pixels包含了纹理图像数据,这个数据描述了纹理图像本身和它的边界。

纹理映射一、纹理定义

voidglTexImage2D(GLenumtarget,

GLintlevel,

GLintcomponents,GLsizeiwidth,glsizeiheight,GLintborder,GLenumformat,GLenumtype,constGLvoid*pixels); //定义二维纹理

参数format描述了纹理映射的格式,可以是GL_COLOR_INDEX、GL_RGB、GL_RGBA、GL_RED、GL_GREEN、GL_BLUE、GL_ALPHA、GL_LUMINANCE或GL_LUMINANCE_ALPHA(注意,不能用GL_STENCIL_INDEX和GL_DEPTH_COMPONENT)。参数type可以是GL_BYPE、GL_UNSIGNED_BYTE、GL_SHORT、GL_UNSIGNED_SHORT、GL_INT、GL_UNSIGNED_INT、GL_FLOAT或GL_BITMAP。

纹理映射一、纹理定义

voidglTexImage1D(GLenumtarget,GLintlevel,

GLintcomponents,

GLsizeiwidth,GLintborder,

GLenumformat,GLenumtype,constGLvoid*pixels);//定义一维纹理

voidglTexImage3D(GLenumtarget,

GLintlevel,

GLintcomponents,GLsizeiwidth,GLsizeidepth,,glsizeiheight,GLintborder,GLenumformat,GLenumtype,constGLvoid*pixels);//定义三维纹理

纹理映射

纹理映射--纹理控制二、纹理控制/滤波voidglTexParameter{if}[v](GLenumtarget,GLenumpname,TYPEparam); //纹理控制参数target可以是GL_TEXTURE_1D或GL_TEXTURE_2D,它指出是为一维或二维纹理说明参数;后两个参数的可能值见表

参数值GL_TEXTURE_WRAP_SGL_CLAMP,GL_REPEATGL_TEXTURE_WRAP_TGL_CLAMP,GL_REPEATGL_TEXTURE_MAG_FILTERGL_NEAREST,GL_LINEARGL_TEXTURE_MIN_FILTERGL_NEAREST,GL_LINEAR

GL_NEAREST_MIPMAP_NEAREST

GL_NEAREST_MIPMAP_LINEAR

GL_LINEAR_MIPMAP_NEAREST

GL_LINEAR_MIPMAP_LINEAR二、纹理控制/滤波

根据所用变换和所用纹理映射,屏幕上单个象素可以对应于一个纹素的一小部分(即放大)或一大批纹素(即缩小)。下面用函数glTexParameter*()说明放大和缩小的方法: glTexParameter*(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameter*(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST); GL_TEXTURE_MAG_FILTER指定为放大滤波, GL_TEXTURE_MIN_FILTER指定为缩小滤波

GL_NEAREST则采用坐标最靠近象素中心的纹素,这有可能使图像走样;若选择GL_LINEAR则采用最靠近象素中心的四个象素的加权平均值。

纹理映射--纹理控制二、纹理控制/滤波

纹理坐标可以超出(0,1)范围,并且在纹理映射过程中可以重复映射或约简映射。在重复映射的情况下,纹理可以在s,t方向上重复,即glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);

若将参数GL_REPEAT改为GL_CLAMP,则所有大于1的纹素值都置为1,所有小于0的值都置为0。

纹理映射--纹理控制

纹理映射--纹理映射方式三、设置纹理映射方式

voidglTexEnv{if}[v](GLenumtarget,GLenumpname,TYPEparam); 参数target必须是GL_TEXTURE_ENV;若参数pname是GL_TEXTURE_ENV_MODE,则参数param可以是GL_DECAL、GL_MODULATE或GL_BLEND,以说明纹理值怎样与原来表面颜色的处理方式;若参数pname是GL_TEXTURE_ENV_COLOR,则参数param是包含四个浮点数(分别是R、G、B、A分量)的数组,这些值只在采用GL_BLEND纹理函数时才有用。

纹理映射四、生成纹理坐标

纹理坐标定义

voidgltexCoord{1234}{sifd}[v](TYPEcoords);

设置当前纹理坐标,此后调用glVertex*()所产生的顶点都赋予当前的纹理坐标。1-4维对应s,t,r和q坐标对于gltexCoord1*(),s坐标被设置成给定值,t和r设置为0,q设置为1;用gltexCoord2*()可以设置s和t坐标值,r设置为0,q设置为1;对于gltexCoord3*(),q设置为1,其它坐标按给定值设置;用gltexCoord4*()可以给定所有的坐标。

四、生成纹理坐标----纹理坐标自动产生

voidglTexGen{if}[v](GLenumcoord,GLenumpname,TYPEparam);

第一个参数必须是GL_S、GL_T、GL_R或GL_Q,它指出纹理坐标s,t,r,q中的哪一个要自动产生;第二个参数值为GL_TEXTURE_GEN_MODE、GL_OBJECT_PLANE或GL_EYE_PLANE;第三个参数param是一个定义纹理产生参数的指针,其值取决于第二个参数pname的设置,当pname为GL_TEXTURE_GEN_MODE时,param是一个常量,即GL_OBJECT_LINEAR、GL_EYE_LINEAR或GL_SPHERE_MAP,它们决定用哪一个函数来产生纹理坐标。对于pname的其它可能值,param是一个指向参数数组的指针。

纹理映射

纹理映射--纹理对象1.创建纹理对象(命名纹理对象)glGenTextures(GLsizein,GLuint*textures)2.绑定纹理对象选择纹理对象,建立一个绑定到目标纹理的有名称的纹理glBindTexture(Glenumtarget,Gluint

glTexImage*)3.删除纹理对象

VoidglDeleteTextures(Glsizein,constGLuinttextures);例:

glGenTextures(0,&g_textureID); glBindTexture(GL_TEXTURE_2D,g_textureID); glDeleteTextures(1,&g_textureID);

基于Glut库开发OpenGL程序

OpenGL程序的典型结构首先初始化,包括对GLUT库的初始化和对窗口的设置及显示模式的设置。其次,创建窗口。再次,创作自定义函数,实现图形绘制处理。最后,执行glutMainLoop,进入GLUT事件处理循环。ContentsOpenGL1OGRE23web3DOGRE简介OGRE(Object-OrientedGraphicsRenderingEngine)是一个开源的面向对象图形渲染引擎,具有成熟、稳定、可靠、跨平台的特点,是一个用C++开发的面向场景、非常灵活的3D引擎,它隐藏了底层系统库函数的所有细节,目的是让开发人员更容易、更直接地利用硬件加速的3D图形系统开发应用,可以选择用DirectXSDK和OpenGL库,OGRE对这两个库进行了二次封装。OGRE特点简单、易用的面向对象接口设计使你能更容易地渲染3D场景,并使你的实现产品独立于渲染API(如Direct3D/OpenGL/Glide等等)。可扩展的程序框架(framework)使你能更快的编写出更好的程序。为了节省你的宝贵时间,OGRE会自动处理常见的需求,如渲染状态管理,hierarchicalculling,半透物体排序等等。清晰、整洁的设计加上全面的文档支持。平台和API支持支持Direct3D和OpenGL支持Windows平台,用VisualC++6(或VisualC++.Net)和STLport来编译。支持Linux平台,用gcc3+(或gcc2.9x)和STLport来编译。材质/Shader支持支持从PNG、JPEG或TGA这几种文件中加载纹理;自动产生MipMap;自动调整纹理大小以满足硬件需求。平台和API支持支持可程序控制的纹理坐标生成(如环境帖图)和转换(平移、扭曲、旋转)。材质可以拥有足够多的纹理层,每层纹理支持各种渲染特效,支持动画纹理。自动应用多通道渲染和多纹理,从而大幅度提高渲染质量。支持透明物体和其它场景级别的渲染特效。通过脚本语言可以不用重新编译就设置和更改高级的材质属性。网格MESH高效的网格数据格式提供插件支持从Milkshape3D导出OGRE本身的.mesh和.skeleton文件格式。支持骨骼动画(可渲染多个动画的组合)支持用贝赛尔样条实现的曲面场景特性拥有高效率和高度可配置性的资源管理器,并且支持多种场景类型。使用系统默认的场景组织方法,或通过亲自编写插件使用自己的场景组织方法。通过绑定体(如绑定盒)实现的场景体系视锥拣选。提供的BspSceneManager插件是快速的室内渲染器,它支持加载Quake3关卡和shader脚本分析。优秀的场景组织体系;场景结点支持物体的附属(attach),并带动附属物体一起运动,实现了类似于关节的运动继承体系。特效粒子系统包括可以通过编写插件来扩展的粒子发射器(emitter)和粒子特效影响器(affector)。通过脚本语言可以不用重新编译就设置和更改粒子属性。支持并自动管理粒子池,从而提升粒子系统的性能。支持天空盒、天空面和天空圆顶,使用非常简单。支持公告板,以实现特效。自动管理透明物体(系统自动帮你设置渲染顺序和深度缓冲)其他特性资源管理和文档加载(ZIP、PK3)。支持高效的插件体系结构,它允许你不重新编译就扩展引擎的功能。运用'Controllers'你可以方便地改变一个数值。例如动态改变一个带防护罩的飞船的颜色值。调试用的内存管理器负责检查内存溢出。OGRE工作流程(1)创建一个root节点;(2)定义OGRE要用的资源;(3)创建渲染系统和窗口;(4)加载资源;(5)创建场景;(6)仿真循环;(7)退出。在三维渲染中,对现实的呈现是通过将模型加入场景来实现的。此外还需要与之对应的通道来显示场景,并且还要将该通道对应一个窗口。另外,观察者相当于人的眼睛。OGRE模块OgreMain模块是OGRE中最重要的模块,这个模块中包含了很多的实现类:

SceneManager:场景管理器; MaterialManager:材质管理器; RenderSystem:场景渲染管理器 MeshManager:网格管理器; ResourceManager:资源管理器; ArchiveManager:文档管理器; FrameListener:事件监听器(虚函数,只有.h文件) MemoryManager:自定义内存管理器; FontManager:字体管理器OGRE模块特性

相关类场景组织体系

Node,SceneNode,SceneManager,Camera,MovableObjectMaterial管理

MaterialManager,Material,Material::TextureLayer插件动态加载系统Root,DynLibManager,DynLib数学支持库Math,Vector3,Matrix3,Matrix4,Quaternion渲染器和几何管道RenderSystem,RenderQueue,Renderable网格/几何实体管理

MeshManager,Mesh,SubMesh,MeshSerializer,PatchSurface资源管理ResourceManager,Resource,ArchiveManager,ArchiveEx天空/背景渲染SceneManager公告板系统和粒子系统

BillboardSet,Billboard,ParticleSystemManager,ParticleSystem,ParticleEmitter,ParticleAffector日志和异常处理

Exception,LogManager,Log事件监听器FrameListener,RenderTargetListener编解码器和图像加载器

Codec,JPGCodec,TGACodec,PNGCodec自定义内存管理器MemoryManager基本动画

Animation,AnimationTrack,KeyFrame骨骼动画

Skeleton,Bone,Animation,AnimationTrack,KeyFrame字体渲染/字体加载

FontManager,Font覆盖(Overlay)表面,二维元素

Overlaymanager,Overlay,GuiElement,GuiContainerOGRE模块特性相关类BSP树BspSceneManager,BspLevel,BspNode关卡导入

Quake3LevelShader支持Quake3Shadermanager,Quake3ShaderBSP场景管理该插件用BSP树和clusters提供了室内场景的管理。它可以导入Quake3的关卡。文件系统插件提供在文件系统的文件夹中定位资源的能力。GuiElement插件提供标准的二维表面元素,如文本输入区和边框。OctreeSceneManager插件用八叉树管理标准场景。你也可以用它来渲染地形。OGRE模块ParticleFX插件此插件提供了标准的粒子发射器和粒子特效影响器。Direct3D7渲染系统插件此插件提供了基于Direct3D7的渲染系统。Direct3D8渲染系统插件此插件提供了基于Direct3D8的渲染系统。SDL渲染系统插件此插件提供了基于OpenGL和SDL的渲染系统。OGRE模块3DstudioMax导出器这是一个3DStudioMAX(版本4或5)的插件,可以将3DStudio的模型数据转换成OGRE的.mesh或.skeleton格式。位图字体创建工具能过此工具你可以把二进制字体文件转换成OGRE的.fontdef文件。Milkshape3D导出器这个工具是Milkshape3D(一个建模工具)的插件,它允许你将模式导出成OGRE支持的.mesh和.skeleton文件格式。OGRE模块Python接口设计这个子工程的目的是以dll的形式提供一个接口,使Python(一种脚本语言)可以直接驱动OGRE,并且允许OGRE直接调用Python脚本以实现游戏相关的脚本语言。

XML转换器此工具可以在.mesh/.skeleton文件和XML文件之间互相转换。OGRE引擎用二进制文件格式可以提升速度和效率,而这个工具允许你导出或导入XML文件,从而方便检查和修改(tweak)模型。OGRE模块OGRE应用程序OGRE提供了一个FrameWork框架用于在OGRE引擎基础上开发自己的应用程序。在创建我们自己的OGRE程序时,只需要继承OGREFrameWork中的类并作少量的改动就可以了。OGREFrameWork与实际应用程序之间的关系如下。OGRE应用程序OGRE的应用框架中定义好了ExampleApplication与ExampleFrameListener类,已封装了3D应用程序的全部要素,应用开发者所要做的工作主要有2点:派生出自己的应用程序类,重新实现createScene函数以创建场景。派生出自己的监听器类,如果需要的话,重新实现frameStarted函数以进行特殊的输入控制和动画控制。OGRE应用程序打开Demo_EnvMapping工程,这是一个非常简单易懂的程序实例。这个程序只有两个文件EnvMapping.h和EnvMapping.cpp。EnvMapping.h文件定义了ExampleApplication类的派生类EnvMapApplication,并重新实现了createScene函数创建出一个亮闪闪的具有环境帖图的食人魔头像。代码如下:classEnvMapApplication:publicExampleApplication{public:EnvMapApplication(){}protected://重新实现createScene函数,创建实际场景voidcreateScene(void){//设置环境光mSceneMgr->setAmbientLight(ColourValue(0.5,0.5,0.5));//创建点光源Light*l=mSceneMgr->createLight("MainLight");//设置点光源l的位置,缺省颜色为白色l->setPosition(20,80,50); //读入ogrehead.mesh模型文件,创建为一个Entity。Entity*ent=mSceneMgr->createEntity("head","ogrehead.mesh");//设置食人魔Entity的材质为指定材质(环境贴图)ent->setMaterialName("Examples/EnvMappedRustySteel");//将食人魔Entity连接到场景根节点上。mSceneMgr->getRootSceneNode()->createChild()->attachObject(ent);}};ContentsOpenGL1OGRE23web3D虚拟现实的Web3D技术Web3D一词来自Web3D协会,它是一个国际性的非赢利组织,主要任务是制定因特网3D图形的标准与规范。随着网络带宽的逐渐提升,采用Web3D技术实现的网站越来越多。Web3D技术主要是针对于三维显示技术的网络应用而开发的,故决定了Web3D技术的主要特点就是使三维模型在网上进行三维交互演示。Web3D是指基于Internet的、依靠软件技术实现的桌面级虚拟现实技术。Web3D技术是实现网页中虚拟现实的一种最新技术。VRML是互联网3D图形的开放标准,是3D图形和多媒体技术通用交换的文件格式,它基于建模技术,描述交互式的3D对象和场景,可应用在互联网与本地客户系统中。由于网上传输的是模型文件,故其传输量明显低于视频图像的传输量。VRML为WWW增加了三维世界功能。虚拟现实建模语言VRML是VirtualRealityModelingLanguage(M也曾写为‘Markup’)的缩写。使用VRML使用户能够在Internet上设计自己的三维虚拟空间。VRML语言概述VRML语言概述VRML(VirtualRealityModelingLanguage,虚拟现实建模语言)是一种用于创建三维造型和渲染的图形描述语言。它将二维、三维图形和动画、音频、视频等多种效果融合在一起,使信息能够在一个具有空间感和实时感的三维空间中被表达出来。同时,它提供灵活有效的人机交互功能,使虚拟世界的真实性和交互性得到更充分的体现。将VRML与WWW一起使用,还可以创建一个通过Internet和WWW链接而成的网络虚拟世界。VRML语言概述VRML把“虚拟世界”看做是一个“场景”,而场景中的一切都被看做是“对象”,对场景中对象的描述就构成了VRML文件。VRML文件以正文格式存储,并以.wrl或.wrz扩展名作为后缀。当用户通过浏览器访问一个VRML文件时,浏览器会将VRML中的信息解释成对目标造型和场景的描述,并根据用户在场景中的不同状态实时绘制和渲染这个虚拟空间。VRML语言概述HTML用于定义可与更多信息相关联的二维页面的布局和内容。

VRML用于定义可与更多信息相关联的三维页面的布局和内容。

VRML不仅是针对VR,也是针对Web设计的。

VRML的设计是从在Web上欣赏实时的3D图像开始的。VRML浏览器,既是插件,又是帮助应用程序,还是独立运行的应用程序,它是传统的虚拟现实中同样也使用的实时的3D着色引擎。这使得VRML应用从三维建模和动画应用中分离出来,在三维建模和动画应用中可以预先对前方场景

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论