OpenGL技术教学课件_第1页
OpenGL技术教学课件_第2页
OpenGL技术教学课件_第3页
OpenGL技术教学课件_第4页
OpenGL技术教学课件_第5页
已阅读5页,还剩207页未读 继续免费阅读

下载本文档

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

文档简介

第10章OpenGL10.1简介10.2OpenGL基本程序结构10.3OpenGL程序设计入门第10章OpenGL10.1简介110.1简介10.1.1什么是OpenGL?OpenGL是一个功能强大的开放图形库(OpenGraphicsLibrary)。其前身是SGI公司为其图形工作站开发的IRISGL。为使其能够更加容易地移植到不同的硬件和操作系统,SGI开发了OpenGL。OpenGL被打造为开放性标准,任何软硬件厂商均可自由使用,这让它受到广泛的欢迎。

10.1简介10.1.1什么是OpenGL?2

1992年7月,SGI正式发布OpenGL1.0标准。OpenGL1.0完全实现了SGI的预期设计目标:功能强大、移植性良好并能自由使用。SGI和微软进行首次合作、联手将OpenGL1.0移植到WindowsNT平台。

1995年,SGI推出了更为完善的OpenGL1.1版本。OpenGL1.1的性能比1.0版提高甚多,同时还加入了诸如顶点数组、顶点位置、新纹理等新特性,并增强了元文件对OpenGL的调用等等。OpenGL1.1同样获得了成功,而它也有对应的WindowsNT版本。

1992年7月,SGI正式发布OpenGL1.0标准。O31992年成立的独立财团OpenGLArchitectureReviewBoard(ARB)控制。SGI等ARB成员以投票方式产生标准,并制成规范文档(Specification)公布,各软硬件厂商据此开发自己系统上的实现。只有通过了ARB规范全部测试的实现才能称为OpenGL。1995年12月ARB批准了1.1版本,1999.5通过的1.2.1。2003年的7月,ARB公布OpenGL1.5规范——这也是迄今为止最新的OpenGL版本。1992年成立的独立财团OpenGLArchitectur410.1.2OpenGL的特点从程序开发人员的角度来看,OpenGL是一组绘图命令的API集合。利用这些API能够方便地描述二维和三维几何物体,并控制这些物体按某种方式绘制到显示缓冲区中。OpenGL的API集提供了物体描述、平移、旋转、缩放、光照、纹理、材质、像素、位图、文字、交互以及提高显示性能等方面的功能,基本涵盖了开发二、三维图形程序所需的各个方面。与一般的图形开发工具相比,OpenGL具有以下几个突出特点:10.1.2OpenGL的特点5(1)跨平台特性

OpenGL与硬件、窗口和操作系统是相互独立的。为了构成一个完整功能的图形处理系统,其设计实现共分5层:图形硬件、操作系统、窗口系统、OpenGL和应用软件。因而,OpenGL可以集成到各种标准窗口和操作系统中。例如,操作系统包括UNIX,WindowsNT,Windows95/98,DOS等;窗口系统包括XWindows,MicrosoftWindows等。(1)跨平台特性6(2)应用的广泛性OpenGL是目前最主要的二、三维交互式图形应用程序开发环境,已成为业界最受推荐的图形应用编程接口。自从1992年发表以来,OpenGL已被广泛地应用于CAD/CAM、三维动画、数字图像处理以及虚拟现实等领域,Kinetix公司的3DStudioMax就是突出的代表。无论是在PC机上,还是在工作站甚至是大型机和超级计算机上,OpenGL都能表现出它的高性能和强大威力。(2)应用的广泛性7(3)网络透明性建立在客户/服务器模型上的网络透明性是OpenGL的固有特性,它允许一个运行在工作站上的进程在本机或通过网络在远程工作站上显示图形。利用这种性质能够均衡各工作站的工作负荷,共同承担图形应用任务。(4)高质量和高性能无论是在CAD/CAM、三维动画还是可视化仿真等领域,OpenGL高质量和高效率的图形生成能力都能得到充分的体现。在这些领域中,开发人员可以利用OpenGL制作出效果逼真的二、三维图像来。(3)网络透明性8(5)出色的编程特性

OpenGL在各种平台上已有多年的应用实践,加上严格的规范控制,因此OpenGL具有良好的稳定性。OpenGL具有充分的独立性与易使用性等。(5)出色的编程特性910.2OpenGL基本程序结构

Windows95/98以及WindowsNT3.51以上的操作系统中提供了OpenGL的动态库,在VC++2.0以上的版本中提供了OpenGL的静态库,所以,使用OpenGL编程,在微机上使用时,最好是在上述软件环境中编写OpenGL程序。

在微机版本中,OpenGL提供了三个函数库,它们是基本库、实用库和辅助库。

10.2.1Windows系统下的OpenGL函数10.2OpenGL基本程序结构Windows10OpenGL的基本库是OpenGL的核心函数库,在这个函数库中,提供了115个函数,这些函数都是以“gl”为前缀。这类API的主要功能包括物体描述、平移、旋转、缩放、光照、纹理、材质、像素、位图、文字处理等。所有OpenGL提供的操作都可以使用这些函数来实现,而且,对于不同的软件和硬件平台,这些函数的使用是完全相同的,这个特性注定了OpenGL程序完美的可移植性。OpenGL的基本库是OpenGL的核心函数库,在这个函数库11OpenGL的实用库是OpenGL基本库的一套子程序,它提供了43个函数,这些函数都是以”glu”为前缀。基本的OpenGL不支持传统上同图形标准相关的一些几何对象,为了减少一些编程负担,OpenGL提供了实用库。主要功能包括绘制二次曲面、NURBS曲线曲面、复杂多边形以及纹理、矩阵管理等。实用库中的所有函数全都是由OpenGL基本库函数来编写的,所以,在使用上和OpenGL基本库的使用是完全相同的,而且,用户也可以使用基本函数库来实现实用库的函数功能。OpenGL的实用库是OpenGL基本库的一套子程序,它提供12OpenGL的辅助库是为了方便用户用标准C编写OpenGL程序而编写的。OpenGL是一个图形标准,所以,在OpenGL中没有提供窗口管理和消息事件响应的函数,这样使用标准C编写OpenGL程序是很不方便的,所以提供了辅助库。它提供了31个函数,这些函数都是以“aux”为前缀。OpenGL辅助库提供了一些基本的窗口管理函数、事件处理函数和一些简单模型的制作函数等,例如,定义窗口的大小、处理键盘时间、鼠标击键事件、绘制多面体等等。

OpenGL的辅助库是为了方便用户用标准C编写OpenGL程1310.2.2一个简单的OpenGL程序下面将通过一个简单的OpenGL程序来说明OpenGL头文件的使用、语法规则、程序的基本结构、程序的运行环境配置。例10.1OpenGL例程sample.c#include<windows.h>#include<GL/gl.h>#include<GL/glu.h>#include<GL/glaux.h>#include<stdio.h>

voidmyinit(void);voidCALLBACKmyReshape(intw,inth);voidCALLBACKdisplay(void);10.2.2一个简单的OpenGL程序下面将通过一个简单14voidmyinit(void)//初始化{glClearColor(0.0,0.0,0.0,0.0);//将窗口清为黑色}voidCALLBACKdisplay(void){glClear(GL_COLOR_BUFFER_BIT);//将颜色缓存清为glClearColor命令所设置的颜色,即背景色glColor4f(0.2,0.8,1.0,1.0);//选颜色(R,G,B)glRotatef(30,1.0,1.0,0.0);//做旋转变换auxWireCube(1.0);//绘制六面体的虚线图glFlush();//强制绘图,不驻留缓存

}voidmyinit(void)//初始化15voidCALLBACKmyReshape(intw,inth)//用于窗口大小改变时的处理,与绘图无关{glViewport(0,0,w,h);}voidmain(void){auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);//窗口显示单缓存和RGB(彩色)模式auxInitPosition(0,0,200,200);//大小x=200y=200(0,0)是屏幕左上点auxInitWindow(“openglsample.c”);//初始化窗口,参数是标题myinit();auxReshapeFunc(myReshape);auxMainLoop(display);}voidCALLBACKmyReshape(intw16OpenGL技术教学课件171.头文件使用若应用程序使用OpenGL核心函数,应包括头文件<GL/gl.h>;使用GLU库函数,应包括头文件<GL/glu.h>;使用AUX库函数,应包括头文件<GL/glaux.h>;使用WGL和Win32应包括头文件<windows.h>。2.回调(CALLBACK)函数CALLBACK函数是一些用来让系统调用的函数,系统调用它们来实现显示、接受输入事件功能。1.头文件使用若应用程序使用OpenGL核心函数,应包括183.语法规则OpenGL基本库的所有操作函数都是以“gl”为前缀的。实用库的所有操作函数都是以“glu”为前缀。辅助库的所有操作函数都是以“aux”为前缀的。OpenGL命令带有后缀。以sample.c中的glColor4f为例,前缀“gl”指这个函数是OpenGL的核心库函数,组成命令的单词首字母大写,如“Color”;后缀“4”表示颜色值是由4个变量来表示的;“f”表示所表示颜色的每个分量的类型为32位浮点数。OpenGL核心库函数常量是以“GL_”开头,均用大写字母,并用下划线将每个关键词分开,如GL_COLOR_BUFFER_BIT。

3.语法规则OpenGL基本库的所有操作函数都是以“gl194.程序的基本结构一个OpenGL程序的基本结构是很简单的,无论多么复杂的OpenGL程序,可以大致分解成以下部分:(1)定义窗口Windows系统下的OpenGL实现提供了一个辅助函数库aux,用于解决开窗口和处理输入事件等问题。窗口管理函数:首先,调用voidauxInitDisplayMode(Glbitfieldmask)函数定义窗口的特性,如颜色和缓存区的性质。例如:auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);//窗口显示单缓存和RGB(彩色)模式4.程序的基本结构20其次,调用voidauxInitPosition(Glintx,Glinty,Glintwidth,Glintheight)定义窗口在屏幕上的位置和大小。其中,x,y为窗口左上角的坐标,width,height分别为窗口的宽和高(像素个数)。默认值为(0,0,100,100)。例如:auxInitPosition(0,0,200,200);//大小x=200y=200(0,0)是屏幕左上点最后,完成上述两个函数调用后,用函数voidauxInitWindow(Glbyte*titleString)打开窗口。窗口的标题为字符串titleString。窗口把ESC键与退出函数联系起来,可以用来关闭窗口,退出程序。例如:auxInitWindow(“openglsample.c”);//初始化窗口,参数是标题其次,调用voidauxInitPosition(Glin21处理输入事件:当改变窗口尺寸、移动窗口、重新显示窗口时,由auxReshapeFunc(myReshape)调用函数myReshape重新定义窗口属性。通常myReshape函数调用glViewPort函数,对当前图形进行裁剪,重新定义投影矩阵等。OpenGL辅助函数库中还包括处理键盘和鼠标输入事件的函数。处理输入事件:22(2)初始化操作由于OpenGL的绘图方式是由一系列的状态确定的,因而在绘制图形前需要做一些准备工作,包括清缓存区(buffer)、定义光照模型、定义纹理映射等基本操作的初始化状态、设置三维视景体、定义视口。

例如:glClearColor(0.0,0.0,0.0,0.0);//将窗口清为黑色glClear(GL_COLOR_BUFFER_BIT);//将颜色缓存清为glClearColor命令所设置的颜色,即背景色(2)初始化操作23(3)设置观察坐标系下的取景模式和取景框位置及大小主要利用了三个函数:

函数voidglViewport(GLintx,Glinty,Glsizeiwidth,Glsizeiheight):设置在屏幕上的视口大小,四个参数描述屏幕视口四个角上的坐标(以像素表示)。参数(x,y)用于指定视口的左下角在窗口坐标系中的位置,参数width和height分别确定矩形视口的宽和高,均以像素为单位。注意:视口的大小和尺寸是在窗口坐标系中进行度量的,默认状态下其坐标原点位于窗口的左下角,其尺寸与窗口的大小相同。

(3)设置观察坐标系下的取景模式和取景框位置及大小24视点方向观察体积

函数voidglOrtho(left,right,bottom,top,near,far):设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体。视点方向观察体积

函数voidglOrtho(left25

函数voidgluPerspective(fovy,aspect,zNear,zFar):设置投影方式为透视投影,其取景体积是一个截头锥体,在这个体积内的物体投影到锥的顶点。它通过指定x-z平面内的视角大小及宽高比来确定沿视线方向的棱锥,并通过指定远、近剪切面与视点间的距离来截断棱锥,得到观察体。

函数voidgluPerspective(fovy,as26注:在默认状态下投影方式为平行正交投影。注:在默认状态下投影方式为平行正交投影。27

(4)使用OpenGL的库函数构造几何物体对象的数学描述。包括点线面的位置和拓扑关系、几何变换、光照处理等。这是OpenGL程序的主要部分。在例10.1中,在函数voidCALLBACKdisplay(void)中写好要绘制的三维图形,然后,在主程序中调用auxMainLoop(display)就可让该图形一直显示。

(4)使用OpenGL的库函数构造几何物体对象的数学描述。28(5)程序的微机运行环境配置•软件与硬件环境操作系统:Windows95/98,WindowsNT软件开发环境:MicrosoftVisualC++4.0及以上版本硬件:奔腾级微机,最好配有支持OpenGL硬加速的图形卡•连接三个静态库程序中除了包含必需的头文件如<windows.h><GL/gl.h><GL/glaux.h><GL/glu.h>外,在创建执行文件时,在VC环境设置中要连接opengl32.lib,glu32.lib和glaux.lib三个函数库。运行已创建的执行文件时,在windows\system目录下要有opengl32.dll,glu32.dll两个动态连接库。(5)程序的微机运行环境配置2910.3OpenGL程序设计入门OpenGL的状态机制OpenGL中的图元绘制坐标变换及其OpenGL实现应用变换的一个实例光照处理10.3OpenGL程序设计入门OpenGL的状态机制3010.3.1OpenGL的状态机制OpenGL的绘图方式是由一系列的状态决定的,如果设置了一种状态或模式而不改变它,OpenGL在绘图过程中将一直保持这种状态或模式。

例如,当前绘图颜色就是OpenGL的一个状态,当选定颜色后,OpenGL就用这个颜色绘图。在例10.1中,以下语句voidmyinit(void){glClearColor(0.0,0.0,0.0,0.0);}中的函数glClearColor(0.0,0.0,0.0,0.0)将视口背景色清为黑色,如果不改变这种状态,视口背景色将一直保持为黑色。

10.3.1OpenGL的状态机制31再如:glColor3f(1.0,0.0,0.0);//设置当前颜色为红色glColor3f(0.0,0.0,1.0);//设置当前颜色为蓝色glRectf(0.5,0.5,0.7,0.7);//绘制一个矩形glColor3f(0.0,1.0,0.0);//设置当前颜色为绿色glRectf(0.8,0.8,0.9,0.9);glRectf(0.2,0.2,0.4,0.4);执行结果是:一个蓝色的矩形和两个绿色的矩形。

再如:3210.3.2OpenGL中的图元绘制任何复杂的图形都是由基本的图元点、线和多边形组成的。程序格式如下:要绘制某个几何对象,首先必须指明究竟是哪种类型的几何对象(例如点、线和多边形),否则系统在执行绘图操作时无法判断究竟是画什么。OpenGL提供了一对用于指定顶点序列操作的函数,确定基本几何对象的类型。glBegin(…);……//描述一组顶点,用于建构某种几何对象glEnd();

10.3.2OpenGL中的图元绘制任何复杂的图形都是331.点的绘制OpenGL中点定义为一个方块,在默认状态下,点是屏幕上的一个像素。在OpenGL中,一个点是当作一个n(2,3,4)维向量来处理的。OpenGL中的点是三维的,如果用户设定二维坐标(x,y),则OpenGL在实际计算时处理的点为(x,y,0);对于由四维齐次坐标定义的顶点(x,y,z,w),在w非零时,齐次顶点(x,y,z,w)对应于三维坐标中的点(x/w,y/w,z/w);若w=0.0,则对应于无穷远处的点。glVertex{2,3,4}{dfis}{v}(TYPEcoords);

1.点的绘制34例如:glVertex2i(0,1);glVertex3d(-1.0,1.0,3.1425926);glVertex4d(40,-15.9,0,2);Glfloatv[3]={-1.2f,3.4f,5.6f};glVertex3fv(v);以下操作的结果是在屏幕上绘制三个点:glBegin(GL_POINTS)glVertex3f(1.0,0.0,0.0);glVertex3f(1.0,1.0,0.0);glVertex3f(0.0,1.0,1.0);glEnd();

例如:352.线的绘制与数学意义上两端无限延伸的直线不同,OpenGL的线是数学定义中的线段,用成对的端点来描述。如:glBegin(GL_LINES)glVertex2f(0.0,0.0);glVertex2f(1.0,1.0);glEnd();上述操作描述了一条由坐标原点到点(1.0,1.0)的线段。

2.线的绘制363.多边形的绘制多边形指封闭线段围成的区域。但OpenGL中可以描述的多边形有两点限制:多边形的边除了多边形的顶点外不允许相交,即确保多边形为简单多边形;多边形为凸多边形,即任给多边形的两个内部点,其连线完全在多边形内。多边形的描述方式如下:glBegin(GL_POLYGON);glVertex*(v0);glVertex*(v1);……..glVertex*(vn);glEnd();其中,*表示glVertex函数的上述任一种组合形式,由多边形顶点v0,v1,…,vn的表示形式而定。注意:多边形顶点应按一定顺序排列(如逆时针)。

3.多边形的绘制374.矩形的绘制由于矩形在几何体构造中出现得比较频繁,所以OpenGL提供了专门的矩形函数:voidglRect{dfis}(TYPEx1,TYPEy1,TYPEx2,TYPEy2);voidglRect{dfis}v(TYPE*v1,TYPE*v2);矩阵的左上、右下角点坐标分别为(x1,y1)和(x2,y2),或者用数组指针v1、v2表示。用上述函数描述的矩形位于z=0平面内,并且各边分别平行于x、y轴。但注意:经过坐标变换之后,这些特性可能改变。

4.矩形的绘制38例10.2基本的图元绘制程序

为简单起见,我们仅改变例10.1中的绘制函数voidCALLBACKdisplay(void)如下:voidCALLBACKdisplay(void){glClear(GL_COLOR_BUFFER_BIT);//将颜色缓存清为glClearColor命令所设置的颜色,即背景色

glColor4f(1.0,1.0,1.0,1.0);//选颜色(R,G,B)glPointSize(6.0);//设置点的大小glBegin(GL_POINTS);//在屏幕上绘制三个点glVertex3f(0.1,0.2,0.0);

glVertex3f(0.2,0.7,0.0);glVertex3f(0.5,0.8,0.0);glEnd();例10.2基本的图元绘制程序39glBegin(GL_LINES);//在屏幕上绘制一条线段glVertex2f(0.0,0.4);glVertex2f(-0.3,0.8);glEnd();

glBegin(GL_POLYGON);//在屏幕上绘制一个四边形glVertex2f(-0.6,0.0);glVertex2f(-0.4,0.0);glVertex2f(-0.4,0.3);glVertex2f(-0.6,0.4);glEnd();glColor3f(1.0,0.0,0.0);//设置当前颜色为红色glColor3f(0.0,0.0,1.0);//设置当前颜色为蓝色glRectf(0.5,0.5,0.7,0.7);//绘制一个矩形

glBegin(GL_LINES);//在屏幕上绘制一条40glColor3f(0.0,1.0,0.0);//设置当前颜色为绿色glRectf(0.8,0.8,0.9,0.9);//绘制一个矩形glRectf(0.2,0.2,0.4,0.4);//绘制一个矩形

glFlush();//强制绘图,不驻留缓存}用该函数替换例10.1中相应的函数后,运行的结果如下图所示。

glColor3f(0.0,1.0,0.0);//设置4110.3.3坐标变换及其OpenGL实现在二维平面上创建三维物体的过程:在三维空间中创建所绘制物体的模型,由计算机经过适当的变换,将三维坐标系中的点转换为屏幕上的相应位置,以得到理想的视觉效果。OpenGL就是实现将物体的各个顶点通过各种变换矩阵的作用映射到屏幕的过程。下图是顶点变换过程。注意:在模式观察变换过程中,顶点的法向量也自动地进行变换。10.3.3坐标变换及其OpenGL实现在二维平面上创建42在OpenGL编程过程中,程序员必须在头脑中有整个坐标变换过程的清晰的图像,才能将所建的场景模型正确地显示在屏幕上。在OpenGL编程过程中,程序员必须在头脑中有整个坐标变换过43OpenGL的坐标变换过程类似于用照相机拍摄照片的过程。使用照相机与坐标变换的步骤比较如下:(1)竖起三角架,将照相机对准场景(视图变换,取景变换,视点变换)。(2)将要拍的场景置于所要求的位置上(造型变换)。(3)选择照相机透镜或调整焦距(投影变换)。(4)确定最终的照片需要多大,例如放大照片(视口变换)。其中(1)、(2)顺序可看成照相馆中的照相过程;而在室外摄影时,由于先有景物,再选择照相机的位置与方向,因此照相顺序可看成(2)、(1)。OpenGL的坐标变换过程类似于用照相机拍摄照片的过程。使用44OpenGL中的多种变换(几何变换、投影变换等)是由矩阵的乘积实现的。OpenGL提供了一系列矩阵操作函数。(1)通用的矩阵操作命令voidglMatrixMode(Glenummode);参数取值:GL_MODELVIEW、GL_PROJECTION或GL_TEXTURE。默认的选定矩阵为造型-观察变换矩阵。voidglLoadIdentity(void);OpenGL中的变换命令都是对当前矩阵(当前矩阵为以后图形变换所要使用的矩阵)进行操作,因此在选定可修改矩阵后,应首先用上述命令设置当前操作矩阵为单位矩阵。

OpenGL中的多种变换(几何变换、投影变换等)是由矩阵的45(2)造型-观察变换造型-观察变换过程就是一个将顶点坐标从世界坐标变换到视觉坐标的过程。这里很重要的是对两个坐标系的认识。

世界坐标系也称为全局坐标系。它是一个右手坐标系,可以认为该坐标系是固定不变的,在初始态下,其x轴为沿屏幕水平向右,y轴为沿屏幕垂直向上,z轴则为垂直屏幕面向外指向用户。

视觉坐标系(即观察坐标系)也称为局部坐标系。它是一个左手坐标系,该坐标系是可以活动的。在初始态下,其原点及x、y轴分别与世界坐标系的原点及x、y轴重合,而z轴则正好相反,即为垂直屏幕面向内。在初始状态下,相机在观察坐标系的原点且指向z轴正向,即为垂直屏幕面向内。(2)造型-观察变换造型-观察变换过程就是一个将顶点坐标46•平移变换voidglTanslate{fd}(TYPEx,TYPEy,TYPEz);•旋转变换voidglRotate{fd}(TYPEangle,TYPEx,TYPEy,TYPEz);绕矢量v=(x,y,z)T逆时针方向旋转angle指定的角度。旋转角度的范围是0~360度。当angle=0时,glRotate()不起作用。

•缩放变换

voidglScale{fd}(TYPEx,TYPEy,TYPEz);•平移变换47变换的顺序:glMatrixMode(GL_MODELVIEW);glLoadIdentity();glMultMatrixf(N);/*applytransformationN*/glMultMatrixf(M);/*applytransformationM*/glMultMatrixf(L);/*applytransformationL*/glBegin(GL_POINTS);glVertex3f(v);/*drawtransformedvertexv*/glEnd();

在这个过程中,在GL_MODELVIEW状态下,相继引入了I(单位阵),N,M,L矩阵。变换后的顶点为NMLv(顶点取列向量)。因此,顶点的变换为N(M(Lv)),即是先作变换L,然后是变换M,最后才是N。这里,顶点v的实际变换顺序正好与指定的顺序相反。变换的顺序:48(3)投影变换在调用投影变换命令前必须先在程序中加入下述语句:glMatrixMode(GL_PROJECTION);glLoadIdentity();这两条命令一方面指定接下来的变换命令只影响投影矩阵,同时也将当前投影矩阵设置为单位阵。

(3)投影变换在调用投影变换命令前必须先在程序中加入下述语句49•透视投影voidgluPerspective(Gldoublefovy,Gldoubleaspect,GldoublezNear,GldoublezFar);•正交投影

voidglOrtho(Gldoubleleft,Gldoubleright,Gldoublebottom,Gldoubletop,Gldoublenear,Gldoublefar);

对于二维图形向二维屏幕的投影,则应使用实用库中的如下函数:voidgluOrtho2D(Gldoubleleft,Gldoubleright,Gldoublebottom,Gldoubletop);前面提到过,用二维顶点命令绘制的二维物体的z坐标均为零,而gluOrtho2D()命令假定场景中的z坐标介于-1.0和1.0之间。

•透视投影•正交投影对于二维图形向二维屏幕的投影,50(4)视口变换

voidglViewport(GLintx,Glinty,Glsizeiwidth,Glsizeiheight);窗口和视口是两个不同的概念。注意:应该使视口的长宽比与取景体积的长宽比相等,否则会使图像变形。(4)视口变换5110.3.4应用变换的一个实例本节将通过一个简单的程序进一步阐述OpenGL的基本变换命令及其使用方法。例10.3三维空间绘制立方体的程序cube.c#include<windows.h>#include<GL/gl.h>#include<GL/glu.h>#include<GL/glaux.h>#include<stdio.h>

voidmyinit(void);voidCALLBACKmyReshape(intw,inth);voidCALLBACKdisplay(void);10.3.4应用变换的一个实例本节将通过一个简单的程序进52//初始化voidmyinit(void){glClearColor(0.0,0.0,0.0,0.0);//将窗口清为黑色}glShadeModel(GL_FLAT);//常量明暗处理方式voidCALLBACKdisplay(void){glClear(GL_COLOR_BUFFER_BIT);//将颜色缓存清为glClearColor命令所设置的颜色,即背景色glColor3f(1.0,1.0,1.0);//选当前颜色(R,G,B)为白色glLoadIdentity();//设置当前矩阵为单位矩阵

//初始化53glTranslatef(0.0,0.0,-3.0);//平移变换glRotatef(45,1.0,1.0,0.0);//旋转变换glScalef(1.0,2.0,1.0);//缩放变换auxWireCube(1.0);//绘制立方体glFlush();//强制绘图,不驻留缓存}voidCALLBACKmyReshape(intw,inth)//用于窗口改变大小时的处理,与绘图无关{glMatrixMode(GL_PROJECTION);//指明当前矩阵操作是针对投影矩阵进行的glLoadIdentity();//设置当前矩阵为单位矩阵gluPerspective(70.0,(GLfloat)w/(GLfloat)h,1.5,40.0);//投影变换glMatrixMode(GL_MODELVIEW);//返回视点-模型矩阵glViewport(0,0,w,h);//定义视口变换}glTranslatef(0.0,0.0,-3.54voidmain(void){auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);//窗口显示单缓存和RGB(彩色)模式auxInitPosition(0,0,200,200);//大小x=200、y=200,(0,0)是屏幕左上点auxInitWindow(“Perspective3-DCubes”);//初始化窗口,参数是标题myinit();auxReshapeFunc(myReshape);auxMainLoop(display);}voidmain(void)55OpenGL技术教学课件5610.3.5光照处理光照处理是OpenGL中绘制逼真的三维图形的一个重要步骤。否则,就无法使最终显示在屏幕上的物体表现出立体感。在RGBA模式下,如果不启用光照处理,则顶点的颜色由当前颜色值所确定;启用光照处理后,则另行计算。场景中物体的光照计算不仅取决于光源的属性,而且与材料的特性直接相关。即光照计算要反映出在场景中使用的光照特性,以及场景中的物体对这种光的反射和吸收特性。10.3.5光照处理光照处理是OpenGL中绘制逼真的三571.OpenGL光照的基本概念OpenGL中将光视为由红、绿、蓝三种成分所组成,光源的特性由所发出的三种颜色的光的比例来确定。说明:光源的RGB值代表各种颜色占最大光强的比例,通过调整各数值可以使光源呈现出各种不同的颜色。例如:R=G=B=1时得到最强的白光,而R=G=B=0.5时,由于光强减弱,得到灰白光。OpenGL在光照模拟中将光线分为辐射光、环境光、漫反射光和镜面反射光4种独立的成分。1.OpenGL光照的基本概念58辐射光:源自发光体,并且不受其他光源的影响。环境光(泛光):它经过环境的多次散射,已不可能确定其方向,而是好像来自各个方向。它作用于物体的表面时,将沿各个方向均匀反射。漫反射光:它来自一个方向,但作用于物体表面后将沿各个方向均匀散射。镜面反射光:来自一个方向,并沿一特定方向离开。顺便指出,可以在场景中设置多个独立的光,通过调整各光源的参数,得到满意的光照效果。辐射光:源自发光体,并且不受其他光源的影响。59物体表面的材质特性:OpenGL中认为,材料的颜色决定于其对入射光中的红、绿、蓝各成分的反射比例。例如,对于理想的红色物体来说,它完全反射红色光,完全吸收绿色光和蓝色光。因而,白光照射下物体呈红色;纯绿光照射下物体则呈黑色。说明:材料的设置参数中也包括对R、G、B值的设定,但与光照的参数设置相比,两者的含义是不同的。对材料来说,上述各值分别对应材料对各种颜色光的反射比例。如上述理想的红色物体对应的参数为R=1,G=0,B=0。一般地,如果光源和材料的参数分别为(Rl,Gl,Bl)和(Rm,Gm,Bm),若不考虑其它影响因素,则观察到的光线的参数为(Rl*Rm,Gl*Gm,Bl*Bm)。物体表面的材质特性:60与光线的情况相似,材料也具有辐射色、环境色、漫反射色和镜面反射色。为了模拟场景中的发光体,可以设定材料的辐射光特性;而环境色、漫反射色和镜面反射色则反映材料对环境光、漫反射光和镜面反射光的反射系数。材料的泛光与每个入射光源的泛光组分相结合;漫反射与入射光源的漫反射光组分相结合;镜面反射与入射光源的镜面反射光组分相结合。与光线的情况相似,材料也具有辐射色、环境色、漫反射色和镜面反612.光照步骤的处理以下程序绘制一个有光照的球体:#include<windows.h>#include<GL/gl.h>#include<GL/glu.h>#include<GL/glaux.h>voidmyinit(void);voidCALLBACKmyReshape(intw,inth);voidCALLBACKdisplay(void);2.光照步骤的处理62voidmyinit(void)//初始化{glClearColor(0.0,0.0,0.0,0.0);//将窗口清为黑色Glfloatmat_specular[]={1.0,1.0,1.0,1.0};Glfloatmat_shininess={50.0};Glfloatlight_position[]={1.0,1.0,1.0,0.0};//无穷远光源glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);glLightfv(GL_LIGHT0,GL_POSITION,light_position);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glDepthFunc(GL_LESS);glEnable(GL_DEPTH_TEST);}voidmyinit(void)//初始化63voidCALLBACKdisplay(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//将颜色缓存清为glClearColor命令所设置的颜色,即背景色glColor4f(0.2,0.8,1.0,1.0);//选颜色(R,G,B)auxSolidSphere(1.0);glFlush();//强制绘图,不驻留缓存}voidCALLBACKdisplay(void)64voidCALLBACKmyReshape(intw,inth)//定义视口变换和投影变换{glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h)glOrtho(-1.5,1.5,-1.5*(GLfoalt)h/(GLfloat)w,1.5*(GLfoalt)h/(GLfloat)w,-10.0,10.0);elseglOrtho(-1.5*(GLfoalt)h/(GLfloat)w,1.5*(GLfoalt)h/(GLfloat)w,-1.5,1.5,-10.0,10.0);glMatrixMode(GL_MODELVIEW);glIdentity();}voidCALLBACKmyReshape(intw65/*MainpLoop*Openwindowwithinitialwindowsize,titlebar,*RGBAdisplaymode,andhandleinputevents.*/voidmain(void){auxInitDisplayMode(AUX_SINGLE|AUX_RGBA|AUX_DEPTH);auxInitPosition(0,0,500,500);auxInitWindow(“Lighting”);myinit();auxReshapeFunc(myReshape);auxMainLoop(display);}/*MainpLoop66从上面的程序可以看出,对物体光照处理的步骤是:•定义物体各顶点的法向量,由此确定物体与光源的相对方向。OpenGL通过法向量来确定指定顶点从每个光源所得到的受光量,并用于像素点颜色的计算中。•光源的创建、定位和启用。由glLight()函数创建光源,指定光源的位置。可创建8个。必须用命令glEnable(GL_LIGHTING)启用所定义的光源。用glEnable(GL_LIGHTi)打开第i个光源。•选择光照模型。光照模型由glModel()函数进行选择。OpenGL的光照模型由三部分组成:全景泛光强度、观察点的位置、对前、后面光照计算的处理。OpenGL技术教学课件67•定义场景中物体的材料属性。通过函数glMaterial()指定材料的环境色、漫反射色、镜面反射色及其光亮度。•定义场景中物体的材料属性。683.光照计算在RGBA模式下,在光照条件下屏幕上某一像素点的颜色计算公式为:顶点颜色=像素点处的材料辐射+经顶点处材料环境光属性缩放后的全场环境光+来自各光源经衰减处理后的各种成分(环境光、漫反射光和镜面反射光)3.光照计算69其中emission表示物体发射光,如果物体本身不是光源,则这一项为0;ambient,diffuse,specular分别表示泛光、漫反射光、镜面反射光,其中每一项都是物体与光源的组合(相乘);shininess表示物体的光洁度;符号n表示顶点的法线方向,l表示视线方向,s表示入射光方向。上述计算对R、G、B分量分别进行,计算所得的结果被调整到0~1的范围之内。其中emission表示物体发射光,如果物体本身不是光源,则70实验1。在微机环境下,在VC++运行环境中调试并运行例10.1,10.2与10.3程序,以初步了解OpenGL程序的基本结构和编程方法。实验1。在微机环境下,在VC++运行环境中调试并运行例1071DirectX发展历史功能简介编程入门DirectX发展历史72发展历史

DirectX是微软独自开发的API。DirectX的服务范围涵盖图形、输入/输出、音频、显示、多媒体等等许多领域,组件包括DirectGraphics(Direct3D+DirectDraw)、DirectInput、DirectPlay、DirectSound、DirectShow、DirectSetup、DirectMediaObjects等等。发展历史

DirectX是微软独自开发的API。73发展历史

1995年,微软的第一个API——DirectX1发布。它仅提供了对2D图形和基本音频功能的支持,主要是为了弥补Windows95对图形管理的不足。

1996年,DirectX的第二个版本DirectX2推出。它引入了Direct3D技术、DirectX2采用平滑模拟和RGB模拟两种方式来加速3D图像生成;同时,原有的2D部分得到了有效增强、加入了2D动态效果,并更正了原有的一些bug。整个DirectX的设计架构基本确定,它也是如今的DirectX的雏形。Trident、S3公司开始支持DirectX2,代表游戏是《红色警报》。发展历史

1995年,微软的第一个API——DirectX74发展历史

同年,DirectX3发布,不过它只是DirectX2的简单改进而已,对DirectSound和DirectPlay等功能作了些变动,总体来说还属于功能简单的DirectX2技术体系。nVIDIARiva128和Intel的i740都支持它,代表游戏《极品飞车3》。

1997年,微软发布DirectX5,对Direct3D作了彻底修改:加入雾化效果、Alpha混合等特效,大大增强3D游戏的真实感;DirectX5在音频、游戏控制方面均做了大量的改进,游戏开放商的移植工作也变得更简单,DirectX5可以说是DirectXAPI技术成熟的标志。代表游戏就是《古墓丽影3》。OpenGL已经在《Quake2》之类的3D游戏中发挥威力,在纯3D领域,OpenGL的影响力远甚于DirectX5。发展历史

同年,DirectX3发布,不过它只是Direc75发展历史1998年,DirectX6推出。这个时候,DirectX已被许多厂商认可并成为2D游戏和部分3D游戏的标准API。实现了多纹理、顶点缓冲和凸凹映射等功能。nVIDIA的TNT2继续对它提供支持,代表游戏则是《极品飞车5》和《CS》。这个时候,OpenGL还被广泛认为优于DirectX。

1999年,DirectX7发布——DirectXAPI发展史上的转折点。nVIDIA开创了GPU概念。微软及时在DirectX7中对其提供了支持:加入硬件几何转换与光源处理技术(即所谓的“硬件T&L”)以及贴图的矩阵混合,自然,它获得更广的支持度。发展历史1998年,DirectX6推出。这个时候,Dir76发展历史DirectX8于2000年推出,同DirectX7相比,DirectX8没有硬件T&L的概念,取而代之的是具有可编程能力的VertexShader(顶点着色引擎)和PixelShader(像素着色引擎)。可提供更优异的效能,例如创建出水波纹的动态效果、衣物的褶皱及光线变化效果,这在以往根本不可能实现。此外,DirectX8在视频、音频等方面也有许多重要的改进,综合实力全盘超越OpenGL,nVIDIA和ATI都将它作为标准的图形API加以支持,OpenGL则退缩为它们的第二选择。2001年,微软发布DirectX8的升级版:DirectX8.1,它将PixelShader的版本提高到1.4。直到今天DirectX8.1还是中低端游戏显卡的标准API,当前大量的3D游戏和几乎所有的2D游戏都对它提供支持。发展历史DirectX8于2000年推出,同DirectX77发展历史

DirectX9是当前无可争议的新一代图形API标准,nVIDIA、ATI、XGI等图形厂商都以它作为产品开发的指导方向,新一代游戏也积极提供支持。DirectX9构建于DirectX8.0/8.1,但它并不是功能上的小修小补,而是带来了许多革命性的新特性。主要包括:将顶点着色引擎、像素着色引擎升级至2.0版本;浮点色彩处理的精度提高到128位(DirectX8.0/8.1为32位);引入硬件位移贴图的概念;支持40位真彩色;发展历史

DirectX9是当前无可争议的新一代图形AP78简介DirectX由显示部分、声音部分、输入部分和网络部分四大部分组成。显示部分又分为DirectDraw(DDraw)和Direct3D(D3D)前者主要负责2D加速。

后者负责3D加速,比如极品飞车3-6的车身与烟雾,CS中的场景和人物,古墓丽影中劳拉等等。简介DirectX由显示部分、声音部分、输入部分和网络部分79简介声音部分包括声效和MIDI音乐,不同的声卡表现的效果不同,目前的声卡基本上都支持DirectSound。输入部分:DirectInput不仅支持更多的游戏输入设备,而且对这些设备的识别与驱动上更加细致,充分发挥设备的最佳状态和全部功能。除了键盘和鼠标之外还可以连接手柄、摇杆、模拟器等。

简介声音部分包括声效和MIDI音乐,不同的声卡表现的效果不同80简介网络部分:DirectPlay,它为游戏而来。通过它可以让计算机之间互联无障碍,提供多种连接方式,TPC/IP,IPX,Modem,串口等等。简介网络部分:DirectPlay,它为游戏而来。通过它可以81编程入门为了创建Direct3D程序,需要安装DirectXSDK,下载网址:/downloads/

DirectX9SDK为VC用户提供了一个程序向导,可以很方便地生成“空”的Direct3D程序。编程入门为了创建Direct3D程序,需要安装DirectX82编程入门DirectX的功能都是以COM组件的形式提供的。COM----组件对象模型(ComponentObjectModel),一种协议,用来实现软件模块间的二进制连接。当COM连接建立后,两个模块之间就可以通过称为“接口(Interface)”的机制来通信。所谓接口,其实就是一组特殊的C++对象,应用程序通过调用这些对象的成员函数,来访问COM组件,实现组件的功能。在COM术语中,这些成员函数被称作方法(Method)。编程入门DirectX的功能都是以COM组件的形式提供的。83编程入门基本步骤:调用适当的函数获取接口指针;调用接口的方法(成员函数)来完成所需功能;用完接口后,调用Release方法进行“释放”,注意释放顺序应该和获取它们的顺序相反。编程入门基本步骤:84编程入门创建应用程序框架初始化Direct3D创建Direct3D对象,然后用该对象创建设备对象。设备对象可以说是Direct3D中最重要的部件,几乎所有的3D绘图功能都要通过它实现。3。渲染4。释放编程入门创建应用程序框架85实验2利用Direct3D实现初级教程中三角形和圆锥程序的功能。以了解Direct3D的基本编程方法。实验2利用Direct3D实现初级教程中三角形和圆锥程序86OpenInventorOpenInventor是一套面向对象的3D工具。整套工具基于OpenGL,用C++语言写成。对三维虚拟场景中的各种要素都进行了对象化的封装。使得用户对三维场景的构造和图形编程变成了对各种对象的操作,而场景渲染、刷新等繁琐工作则留给OpenInventor自动完成,大大简化了图形应用程序的开发,加快了开发速度。支持虚拟现实设备,这为CAD系统中使用虚拟现实设备提供了便利。OpenInventorOpenInventor是一套面87Openinventor基本库场景数据库:场景数据库由Openinventor管理。数据库元素是最基本的一系列的对象,它们是用来创建三维场景数据库的基本要素。每个数据库元素包含一系列的重要信息如:形状描述,材料种类,几何变换和光源等。数据库元素主要包括以下几种:形状元(如:球、圆锥、圆柱、长方体、Nubs曲面等)、特性元(如光照环境、光源种类、材料种类等)。图形引擎(用来联系对象和有关的场景并对场景产生动画),传感器(用来对场景数据库中的数据改变做出响应,以调用相关的操作和实现时间进程管理)。数据库元素按照一定的规则组合起来就得到了复杂的三维场景图。场景图储存在场景数据库中。一旦用户生成了一幅场景图,用户就可以对场景图的对象进行操作,这些操作对象的管理也是由场景数据库来实现的。Openinventor基本库场景数据库:场景数据库由Op88Openinventor基本库操作库操作库主要响应用户的交互操作事件,这种响应是非常直观并且可以编辑的。一个很明显的例子是鼠标的点取和操作盒显示。用户可以点取Openinventor三维场景中的任一对象,此对象将被高亮度显示,该对象的标志指针将被返回给用户的程序。用户还可以拖动对象的操作盒(一个类似于包围盒的、以线框方式显示的;高亮度的平行六面体),以实现对对象的放大、缩小、改变位置等操作。用户使用操作库对图形对象操作就像用户使用鼠标操作窗口的大小与位置那样方便与直观。Openinventor基本库操作库操作库主要响89Openinventor场景管理机制Openinventor由于采用了面向对象思想,把它创建的图形对象和对这些图形对象的操作“捆绑”在一起,这样,用户很容易对创建的图形对象实现改变颜色、大小、纹理、移动位置、变换视角、动画、鼠标选取,高亮度显示,包围盒计算,搜索等一系列操作。从而使三维图形的创建与操作变得简单而有序。Openinventor所创建的对象的所有信息:对象的位置、形状、大小、色彩、表现纹理、光源等都储存在Openinventor的场景数据库中,用户可读取或显示这些信息。

Openinventor场景管理机制Openinvent90Openinventor场景管理机制OpenInventor的场景由结点组成,结点中包含了物体的几何形状、属性、以及物体间的拓扑结构。结点如何组织由开发人员根据需要自行安排,OpenInventor并不做严格的规定。 从程序语言的角度来说结点的本质是类,其中有很多成员变量和成员函数。它的成员变量被称为域,域不是基本的数据类型,它的本质也是类,其中封装了很多的方法(即成员函数),可以方便的操作其中的数据的内容而无需考虑数据的组织与存储空间的管理。Openinventor场景管理机制OpenInvent91Openinventor场景管理机制结点被分为三种基本类型:形体结点,它用于表示物体的几何形状属性结点,它用于表示场景或其中的物体的显示特征组结点,它用于场景树的组织,负责处理场景的拓扑结构创建结点的方法很简单,例如:SoSphere*sphere=newSoSphere;这样一条语句就创建了一个球体的结点。Openinventor场景管理机制结点被分为三种基本类型92Openinventor场景管理机制场景树的管理:在OpenInventor中通常应用以下结点组织场景树和管理场景树:SoSeparator结点、SoGroup结点、SoSelection结点等。用户有权对用户结点进行组织与管理,这通过系统所支持的Group、UnGroup操作来实现。Openinventor场景管理机制场景树的管理:93Openinventor场景树的结构两类对象:系统对象和用户对象……SceneGraphforasingleview……ROOTSYSTEMGRAPHUSERGRAPHOpeninventor场景树的结构两类对象:系统对象和用94四视图场景树ROOT0TOPSIDEPERSPECTIVE,ETC,ROOT1ROOT2ROOT3FRONTSceneGraphforafour-viewframe四视图场景树ROOT0TOPSIDEPERSPECTIVE,95OpenGL技术教学课件96OpenGL技术教学课件97OpenGL技术教学课件98OGREOGRE是一款开源的图形渲染引擎,它的全名叫Object-orientedGraphicsRenderingEngine,是由一个核心小组开发并维护,由于它是一款开源引擎,所以也像Linux一样,被各种不同的团体和组织改造和扩充,并使它能够适应不同的应用领域和拥有更强大的功能。OGREOGRE是一款开源的图形渲染引擎,它的全名叫Obje99OGREOGRE是用C++开发的面向对象且使用灵活的3D引擎,它的目的是让开发者更方便和直接地开发基于3D硬件设备的应用程序或游戏.引擎中的类库对更底层的系统库(如:Direct3D和OpenGL)的全部使用细节进行了抽象,并提供了基于现实世界对象的接口和其它类。OGREOGRE是用C++开发的面向对象且使用灵活的3D引擎100OGRE效率特性1、简单、易用的面向对象接口设计能更容易地渲染3D场景,并使实现产品独立于渲染API(如Direct3D/OpenGL/Glide等等)。2、可扩展的程序框架(framework)能更快的编写出更好的程序。3、为了节省宝贵时间,OGRE会自动处理常见的需求,如渲染状态管理,hierarchicalculling,半透物体排序等等。4、清晰、整洁的设计加上全面的文档支持。OGRE效率特性1、简单、易用的面向对象接口设计能更容易地渲101平台和3DAPI支持1、支持Direct3D和OpenGL

2、支持Windows平台,用VisualC++6(或VisualC++.Net)和STLport来编译。

3、支持Linux平台,用gcc3+(或gcc2.9x)和STLport来编译。

4、材质/Shader支持

5、支持从PNG、JPEG或TGA这几种文件中加载纹理;自动产生MipMap;自动调整纹理大小以满足硬件需求。

平台和3DAPI支持1、支持Direct3D和OpenGL102平台和3DAPI支持6、支持可程序控制的纹理坐标生成(如环境帖图)和转换(平移、扭曲、旋转)。

7、材质可以拥有足够多的纹理层,每层纹理支持各种渲染特效,支持动画纹理。

8、自动应用多通道渲染和多纹理,从而大幅度提高渲染质量。

9、支持透明物体和其它场景级别的渲染特效。

10、通过脚本语言可以不用重新编译就设置和更改高级的材质属性。

平台和3DAPI支持6、支持可程序控制的纹理坐标生成(如环103特效1、粒子系统包括可以通过编写插件来扩展的粒子发射器(emitter)和粒子特效影响器(affector)。通过脚本语言可以不用重新编译就设置和更改粒子属性。支持并自动管理粒子池,从而提升粒子系统的性能。2、支持天空盒、天空面和天空圆顶,使用非常简单。3、支持公告板,以实现特效。4、自动管理透明物体(系统自动帮助设置渲染顺序和深度缓冲)特效1、粒子系统包括可以通过编写插件来扩展的粒子发射器(em104OpenGL技术教学课件105OpenGL技术教学课件106第10章OpenGL10.1简介10.2OpenGL基本程序结构10.3OpenGL程序设计入门第10章OpenGL10.1简介10710.1简介10.1.1什么是OpenGL?OpenGL是一个功能强大的开放图形库(OpenGraphicsLibrary)。其前身是SGI公司为其图形工作站开发的IRISGL。为使其能够更加容易地移植到不同的硬件和操作系统,SGI开发了OpenGL。OpenGL被打造为开放性标准,任何软硬件厂商均可自由使用,这让它受到广泛的欢迎。

10.1简介10.1.1什么是OpenGL?108

1992年7月,SGI正式发布OpenGL1.0标准。OpenGL1.0完全实现了SGI的预期设计目标:功能强大、移植性良好并能自由使用。SGI和微软进行首次合作、联手将OpenGL1.0移植到WindowsNT平台。

1995年,SGI推出了更为完善的OpenGL1.1版本。OpenGL1.1的性能比1.0版提高甚多,同时还加入了诸如顶点数组、顶点位置、新纹理等新特性,并增强了元文件对OpenGL的调用等等。OpenGL1.1同样获得了成功,而它也有对应的WindowsNT版本。

1992年7月,SGI正式发布OpenGL1.0标准。O1091992年成立的独立财团OpenGLArchitectureReviewBoard(ARB)控制。SGI等ARB成员以投票方式产生标准,并制成规范文档(Specification)公布,各软硬件厂商据此开发自己系统上的实现。只有通过了ARB规范全部测试的实现才能称为OpenGL。1995年12月ARB批准了1.1版本,1999.5通过的1.2.1。2003年的7月,ARB公布OpenGL1.5规范——这也是迄今为止最新的OpenGL版本。1992年成立的独立财团OpenGLArchitectur11010.1.2OpenGL的特点从程序开发人员的角度来看,OpenGL是一组绘图命令的API集合。利用这些API能够方便地描述二维和三维几何物体,并控制这些物体按某种方式绘制到显示缓冲区中。OpenGL的API集提供了物体描述、平移、旋转、缩放、光照、纹理、材质、像素、位图、文字、交互以及提高显示性能等方面的功能,基本涵盖了开发二、三维图形程序所需的各个方面。与一般的图形开发工具相比,OpenGL具有以下几个突出特点:10.1.2OpenGL的特点111(1)跨平台特性

OpenGL与硬件、窗口和操作系统是相互独立的。为了构成一个完整功能的图形处理系统,其设计实现共分5层:图形硬件、操作系统、窗口系统、OpenGL和应用软件。因而,OpenGL可以集成到各种标准窗口和操作系统中。例如,操作系统包括UNIX,WindowsNT,Windows95/98,DOS等;窗口系统包括XWindows,MicrosoftWindows等。(1)跨平台特性112(2)应用的广泛性OpenGL是目前最主要的二、三维交互式图形应用程序开发环境,已成为业界最受推荐的图形应用编程接口。自从1992年发表以来,OpenGL已被广泛地应用于CAD/CAM、三维动画、数字图像处理以及虚拟现实等领域,Kinetix公司的3DStudioMax就是突出的代表。无论是在PC机上,还是在工作站甚至是大型机和超级计算机上,OpenGL都能表现出它的高性能和强大威力。(2)应用的广泛性113(3)网络透明性建立在客户/服务器模型上的网络透明性是OpenGL的固有特性,它允许一个运行在工作站上的进程在本机或通过网络在远程工作站上显示图形。利用这种性质能够均衡各工作站的工作负荷,共同承担图形应用任务。(4)高质量和高性能无论是在CAD/CAM、三维动画还是可视化仿真等领域,OpenGL高质量和高效率的图形生成能力都能得到充分的体现。在这些领域中,开发人员可以利用OpenGL制作出效果逼真的二、三维图像来。(3)网络透明性114(5)出色的编程特性

OpenGL在各种平台上已有多年的应用实践,加上严格的规范控制,因此OpenGL具有良好的稳定性。OpenGL具有充分的独立性与易使用性等。(5)出色的编程特性11510.2OpenGL基本程序结构

Windows95/98以及WindowsNT3.51以上的操作系统中提供了OpenGL的动态库,在VC++2.0以上的版本中提供了OpenGL的静态库,所以,使用OpenGL编程,在微机上使用时,最好是在上述软件环境中编写OpenGL程序。

在微机版本中,OpenGL提供了三个函数库,它们是基本库、实用库和辅助库。

10.2.1Windows系统下的OpenGL函数10.2OpenGL基本程序结构Windows116OpenGL的基本库是OpenGL的核心函数库,在这个函数库中,提供了115个函数,这些函数都是以“gl”为前缀。这类API的主

温馨提示

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

评论

0/150

提交评论