




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章OpenGL10.1简介10.2OpenGL根本程序结构10.3OpenGL程序设计入门10.1简介10.1.1什么是OpenGL?OpenGL是一个功能强大的开放图形库〔OpenGraphicsLibrary〕。其前身是SGI公司为其图形工作站开发的IRISGL。为使其能够更加容易地移植到不同的硬件和操作系统,SGI开发了OpenGL。OpenGL被打造为开放性标准,任何软硬件厂商均可自由使用,这让它受到广泛的欢送。
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年成立的独立财团OpenGLArchitectureReviewBoard(ARB)控制。SGI等ARB成员以投票方式产生标准,并制成标准文档(Specification)公布,各软硬件厂商据此开发自己系统上的实现。只有通过了ARB标准全部测试的实现才能称为OpenGL。1995年12月ARB批准了1.1版本,1999.5通过的。2003年的7月,ARB公布OpenGL1.5标准——这也是迄今为止最新的OpenGL版本。10.1.2OpenGL的特点从程序开发人员的角度来看,OpenGL是一组绘图命令的API集合。利用这些API能够方便地描述二维和三维几何物体,并控制这些物体按某种方式绘制到显示缓冲区中。OpenGL的API集提供了物体描述、平移、旋转、缩放、光照、纹理、材质、像素、位图、文字、交互以及提高显示性能等方面的功能,根本涵盖了开发二、三维图形程序所需的各个方面。与一般的图形开发工具相比,OpenGL具有以下几个突出特点:〔1〕跨平台特性OpenGL与硬件、窗口和操作系统是相互独立的。为了构成一个完整功能的图形处理系统,其设计实现共分5层:图形硬件、操作系统、窗口系统、OpenGL和应用软件。因而,OpenGL可以集成到各种标准窗口和操作系统中。例如,操作系统包括UNIX,WindowsNT,Windows95/98,DOS等;窗口系统包括XWindows,MicrosoftWindows等。〔2〕应用的广泛性OpenGL是目前最主要的二、三维交互式图形应用程序开发环境,已成为业界最受推荐的图形应用编程接口。自从1992年发表以来,OpenGL已被广泛地应用于CAD/CAM、三维动画、数字图像处理以及虚拟现实等领域,Kinetix公司的3DStudioMax就是突出的代表。无论是在PC机上,还是在工作站甚至是大型机和超级计算机上,OpenGL都能表现出它的高性能和强大威力。〔3〕网络透明性建立在客户/效劳器模型上的网络透明性是OpenGL的固有特性,它允许一个运行在工作站上的进程在本机或通过网络在远程工作站上显示图形。利用这种性质能够均衡各工作站的工作负荷,共同承担图形应用任务。〔4〕高质量和高性能无论是在CAD/CAM、三维动画还是可视化仿真等领域,OpenGL高质量和高效率的图形生成能力都能得到充分的表达。在这些领域中,开发人员可以利用OpenGL制作出效果逼真的二、三维图像来。〔5〕出色的编程特性
OpenGL在各种平台上已有多年的应用实践,加上严格的标准控制,因此OpenGL具有良好的稳定性。OpenGL具有充分的独立性与易使用性等。10.2OpenGL根本程序结构Windows95/98以及WindowsNT3.51以上的操作系统中提供了OpenGL的动态库,在VC++2.0以上的版本中提供了OpenGL的静态库,所以,使用OpenGL编程,在微机上使用时,最好是在上述软件环境中编写OpenGL程序。在微机版本中,OpenGL提供了三个函数库,它们是根本库、实用库和辅助库。10.2.1Windows系统下的OpenGL函数OpenGL的根本库是OpenGL的核心函数库,在这个函数库中,提供了115个函数,这些函数都是以“gl〞为前缀。这类API的主要功能包括物体描述、平移、旋转、缩放、光照、纹理、材质、像素、位图、文字处理等。所有OpenGL提供的操作都可以使用这些函数来实现,而且,对于不同的软件和硬件平台,这些函数的使用是完全相同的,这个特性注定了OpenGL程序完美的可移植性。OpenGL的实用库是OpenGL根本库的一套子程序,它提供了43个函数,这些函数都是以〞glu〞为前缀。根本的OpenGL不支持传统上同图形标准相关的一些几何对象,为了减少一些编程负担,OpenGL提供了实用库。主要功能包括绘制二次曲面、NURBS曲线曲面、复杂多边形以及纹理、矩阵管理等。实用库中的所有函数全都是由OpenGL根本库函数来编写的,所以,在使用上和OpenGL根本库的使用是完全相同的,而且,用户也可以使用根本函数库来实现实用库的函数功能。OpenGL的辅助库是为了方便用户用标准C编写OpenGL程序而编写的。OpenGL是一个图形标准,所以,在OpenGL中没有提供窗口管理和消息事件响应的函数,这样使用标准C编写OpenGL程序是很不方便的,所以提供了辅助库。它提供了31个函数,这些函数都是以“aux〞为前缀。OpenGL辅助库提供了一些根本的窗口管理函数、事件处理函数和一些简单模型的制作函数等,例如,定义窗口的大小、处理键盘时间、鼠标击键事件、绘制多面体等等。10.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);voidmyinit(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();//强制绘图,不驻留缓存
}voidCALLBACKmyReshape(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);}1.头文件使用假设应用程序使用OpenGL核心函数,应包括头文件<GL/gl.h>;使用GLU库函数,应包括头文件<GL/glu.h>;使用AUX库函数,应包括头文件<GL/glaux.h>;使用WGL和Win32应包括头文件<windows.h>。2.回调〔CALLBACK〕函数CALLBACK函数是一些用来让系统调用的函数,系统调用它们来实现显示、接受输入事件功能。3.语法规那么OpenGL根本库的所有操作函数都是以“gl〞为前缀的。实用库的所有操作函数都是以“glu〞为前缀。辅助库的所有操作函数都是以“aux〞为前缀的。OpenGL命令带有后缀。以sample.c中的glColor4f为例,前缀“gl〞指这个函数是OpenGL的核心库函数,组成命令的单词首字母大写,如“Color〞;后缀“4〞表示颜色值是由4个变量来表示的;“f〞表示所表示颜色的每个分量的类型为32位浮点数。OpenGL核心库函数常量是以“GL_〞开头,均用大写字母,并用下划线将每个关键词分开,如GL_COLOR_BUFFER_BIT。4.程序的根本结构一个OpenGL程序的根本结构是很简单的,无论多么复杂的OpenGL程序,可以大致分解成以下局部:〔1〕定义窗口Windows系统下的OpenGL实现提供了一个辅助函数库aux,用于解决开窗口和处理输入事件等问题。窗口管理函数:首先,调用voidauxInitDisplayMode(Glbitfieldmask)函数定义窗口的特性,如颜色和缓存区的性质。例如:auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);//窗口显示单缓存和RGB(彩色)模式其次,调用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〞);//初始化窗口,参数是标题处理输入事件:当改变窗口尺寸、移动窗口、重新显示窗口时,由auxReshapeFunc(myReshape)调用函数myReshape重新定义窗口属性。通常myReshape函数调用glViewPort函数,对当前图形进行裁剪,重新定义投影矩阵等。OpenGL辅助函数库中还包括处理键盘和鼠标输入事件的函数。〔2〕初始化操作由于OpenGL的绘图方式是由一系列的状态确定的,因而在绘制图形前需要做一些准备工作,包括清缓存区〔buffer〕、定义光照模型、定义纹理映射等根本操作的初始化状态、设置三维视景体、定义视口。例如:glClearColor(0.0,0.0,0.0,0.0);//将窗口清为黑色glClear(GL_COLOR_BUFFER_BIT);//将颜色缓存清为glClearColor命令所设置的颜色,即背景色〔3〕设置观察坐标系下的取景模式和取景框位置及大小主要利用了三个函数:
函数voidglViewport(GLintx,Glinty,Glsizeiwidth,Glsizeiheight):设置在屏幕上的视口大小,四个参数描述屏幕视口四个角上的坐标〔以像素表示〕。参数(x,y)用于指定视口的左下角在窗口坐标系中的位置,参数width和height分别确定矩形视口的宽和高,均以像素为单位。注意:视口的大小和尺寸是在窗口坐标系中进行度量的,默认状态下其坐标原点位于窗口的左下角,其尺寸与窗口的大小相同。
视点方向观察体积
函数voidglOrtho(left,right,bottom,top,near,far):设置投影方式为正交投影〔平行投影〕,其取景体积是一个各面均为矩形的六面体。
函数voidgluPerspective(fovy,aspect,zNear,zFar):设置投影方式为透视投影,其取景体积是一个截头锥体,在这个体积内的物体投影到锥的顶点。它通过指定x-z平面内的视角大小及宽高比来确定沿视线方向的棱锥,并通过指定远、近剪切面与视点间的距离来截断棱锥,得到观察体。注:在默认状态下投影方式为平行正交投影。
〔4〕使用OpenGL的库函数构造几何物体对象的数学描述。包括点线面的位置和拓扑关系、几何变换、光照处理等。这是OpenGL程序的主要局部。在例10.1中,在函数voidCALLBACKdisplay(void)中写好要绘制的三维图形,然后,在主程序中调用auxMainLoop(display)就可让该图形一直显示。〔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两个动态连接库。10.3OpenGL程序设计入门OpenGL的状态机制OpenGL中的图元绘制坐标变换及其OpenGL实现应用变换的一个实例光照处理10.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)将视口背景色清为黑色,如果不改变这种状态,视口背景色将一直保持为黑色。再如: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);执行结果是:一个蓝色的矩形和两个绿色的矩形。
10.3.2OpenGL中的图元绘制任何复杂的图形都是由根本的图元点、线和多边形组成的。程序格式如下:要绘制某个几何对象,首先必须指明究竟是哪种类型的几何对象〔例如点、线和多边形〕,否那么系统在执行绘图操作时无法判断究竟是画什么。OpenGL提供了一对用于指定顶点序列操作的函数,确定根本几何对象的类型。glBegin(…);……//描述一组顶点,用于建构某种几何对象glEnd();
1.点的绘制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);例如: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();
2.线的绘制与数学意义上两端无限延伸的直线不同,OpenGL的线是数学定义中的线段,用成对的端点来描述。如:glBegin(GL_LINES)glVertex2f(0.0,0.0);glVertex2f(1.0,1.0);glEnd();上述操作描述了一条由坐标原点到点〔1.0,1.0〕的线段。3.多边形的绘制多边形指封闭线段围成的区域。但OpenGL中可以描述的多边形有两点限制:多边形的边除了多边形的顶点外不允许相交,即确保多边形为简单多边形;多边形为凸多边形,即任给多边形的两个内部点,其连线完全在多边形内。多边形的描述方式如下:glBegin(GL_POLYGON);glVertex*(v0);glVertex*(v1);……..glVertex*(vn);glEnd();其中,*表示glVertex函数的上述任一种组合形式,由多边形顶点v0,v1,…,vn的表示形式而定。注意:多边形顶点应按一定顺序排列〔如逆时针〕。4.矩形的绘制由于矩形在几何体构造中出现得比较频繁,所以OpenGL提供了专门的矩形函数:voidglRect{dfis}(TYPEx1,TYPEy1,TYPEx2,TYPEy2);voidglRect{dfis}v(TYPE*v1,TYPE*v2);矩阵的左上、右下角点坐标分别为〔x1,y1〕和(x2,y2),或者用数组指针v1、v2表示。用上述函数描述的矩形位于z=0平面内,并且各边分别平行于x、y轴。但注意:经过坐标变换之后,这些特性可能改变。例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();glBegin(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);//绘制一个矩形
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);//绘制一个矩形
glFlush();//强制绘图,不驻留缓存}用该函数替换例10.1中相应的函数后,运行的结果如以下图所示。10.3.3坐标变换及其OpenGL实现在二维平面上创立三维物体的过程:在三维空间中创立所绘制物体的模型,由计算机经过适当的变换,将三维坐标系中的点转换为屏幕上的相应位置,以得到理想的视觉效果。OpenGL就是实现将物体的各个顶点通过各种变换矩阵的作用映射到屏幕的过程。以下图是顶点变换过程。注意:在模式观察变换过程中,顶点的法向量也自动地进行变换。在OpenGL编程过程中,程序员必须在头脑中有整个坐标变换过程的清晰的图像,才能将所建的场景模型正确地显示在屏幕上。OpenGL的坐标变换过程类似于用照相机拍摄照片的过程。使用照相机与坐标变换的步骤比较如下:(1)竖起三角架,将照相机对准场景〔视图变换,取景变换,视点变换〕。(2)将要拍的场景置于所要求的位置上〔造型变换〕。(3)选择照相机透镜或调整焦距〔投影变换〕。(4)确定最终的照片需要多大,例如放大照片〔视口变换〕。其中(1)、(2)顺序可看成照相馆中的照相过程;而在室外摄影时,由于先有景物,再选择照相机的位置与方向,因此照相顺序可看成(2)、(1)。OpenGL中的多种变换〔几何变换、投影变换等〕是由矩阵的乘积实现的。OpenGL提供了一系列矩阵操作函数。(1)通用的矩阵操作命令voidglMatrixMode(Glenummode);参数取值:GL_MODELVIEW、GL_PROJECTION或GL_TEXTURE。默认的选定矩阵为造型-观察变换矩阵。voidglLoadIdentity(void);OpenGL中的变换命令都是对当前矩阵〔当前矩阵为以后图形变换所要使用的矩阵〕进行操作,因此在选定可修改矩阵后,应首先用上述命令设置当前操作矩阵为单位矩阵。〔2〕造型-观察变换造型-观察变换过程就是一个将顶点坐标从世界坐标变换到视觉坐标的过程。这里很重要的是对两个坐标系的认识。
世界坐标系也称为全局坐标系。它是一个右手坐标系,可以认为该坐标系是固定不变的,在初始态下,其x轴为沿屏幕水平向右,y轴为沿屏幕垂直向上,z轴那么为垂直屏幕面向外指向用户。
视觉坐标系(即观察坐标系)也称为局部坐标系。它是一个左手坐标系,该坐标系是可以活动的。在初始态下,其原点及x、y轴分别与世界坐标系的原点及x、y轴重合,而z轴那么正好相反,即为垂直屏幕面向内。在初始状态下,相机在观察坐标系的原点且指向z轴正向,即为垂直屏幕面向内。•平移变换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);变换的顺序: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的实际变换顺序正好与指定的顺序相反。〔3〕投影变换在调用投影变换命令前必须先在程序中参加下述语句:glMatrixMode(GL_PROJECTION);glLoadIdentity();这两条命令一方面指定接下来的变换命令只影响投影矩阵,同时也将当前投影矩阵设置为单位阵。•透视投影voidgluPerspective(Gldoublefovy,Gldoubleaspect,GldoublezNear,GldoublezFar);•正交投影
voidglOrtho(Gldoubleleft,Gldoubleright,Gldoublebottom,Gldoubletop,Gldoublenear,Gldoublefar);
对于二维图形向二维屏幕的投影,那么应使用实用库中的如下函数:voidgluOrtho2D(Gldoubleleft,Gldoubleright,Gldoublebottom,Gldoubletop);前面提到过,用二维顶点命令绘制的二维物体的z坐标均为零,而gluOrtho2D()命令假定场景中的z坐标介于-1.0和1.0之间。〔4〕视口变换voidglViewport(GLintx,Glinty,Glsizeiwidth,Glsizeiheight);窗口和视口是两个不同的概念。注意:应该使视口的长宽比与取景体积的长宽比相等,否那么会使图像变形。10.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);//初始化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();//设置当前矩阵为单位矩阵
glTranslatef(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);//定义视口变换}voidmain(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);}10.3.5光照处理光照处理是OpenGL中绘制逼真的三维图形的一个重要步骤。否那么,就无法使最终显示在屏幕上的物体表现出立体感。在RGBA模式下,如果不启用光照处理,那么顶点的颜色由当前颜色值所确定;启用光照处理后,那么另行计算。场景中物体的光照计算不仅取决于光源的属性,而且与材料的特性直接相关。即光照计算要反映出在场景中使用的光照特性,以及场景中的物体对这种光的反射和吸收特性。1.OpenGL光照的根本概念OpenGL中将光视为由红、绿、蓝三种成分所组成,光源的特性由所发出的三种颜色的光的比例来确定。说明:光源的RGB值代表各种颜色占最大光强的比例,通过调整各数值可以使光源呈现出各种不同的颜色。例如:R=G=B=1时得到最强的白光,而R=G=B=0.5时,由于光强减弱,得到灰白光。OpenGL在光照模拟中将光线分为辐射光、环境光、漫反射光和镜面反射光4种独立的成分。辐射光:源自发光体,并且不受其他光源的影响。环境光〔泛光〕:它经过环境的屡次散射,已不可能确定其方向,而是好似来自各个方向。它作用于物体的外表时,将沿各个方向均匀反射。漫反射光:它来自一个方向,但作用于物体外表后将沿各个方向均匀散射。镜面反射光:来自一个方向,并沿一特定方向离开。顺便指出,可以在场景中设置多个独立的光,通过调整各光源的参数,得到满意的光照效果。物体外表的材质特性:OpenGL中认为,材料的颜色决定于其对入射光中的红、绿、蓝各成分的反射比例。例如,对于理想的红色物体来说,它完全反射红色光,完全吸收绿色光和蓝色光。因而,白光照射下物体呈红色;纯绿光照射下物体那么呈黑色。说明:材料的设置参数中也包括对R、G、B值的设定,但与光照的参数设置相比,两者的含义是不同的。对材料来说,上述各值分别对应材料对各种颜色光的反射比例。如上述理想的红色物体对应的参数为R=1,G=0,B=0。一般地,如果光源和材料的参数分别为(Rl,Gl,Bl)和(Rm,Gm,Bm),假设不考虑其它影响因素,那么观察到的光线的参数为〔Rl*Rm,Gl*Gm,Bl*Bm〕。与光线的情况相似,材料也具有辐射色、环境色、漫反射色和镜面反射色。为了模拟场景中的发光体,可以设定材料的辐射光特性;而环境色、漫反射色和镜面反射色那么反映材料对环境光、漫反射光和镜面反射光的反射系数。材料的泛光与每个入射光源的泛光组分相结合;漫反射与入射光源的漫反射光组分相结合;镜面反射与入射光源的镜面反射光组分相结合。2.光照步骤的处理以下程序绘制一个有光照的球体:#include<windows.h>#include<GL/gl.h>#include<GL/glu.h>#include<GL/glaux.h>voidmyinit(void);voidCALLBACKmyReshape(intw,inth);voidCALLBACKdisplay(void);voidmyinit(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);}voidCALLBACKdisplay(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();//强制绘图,不驻留缓存}voidCALLBACKmyReshape(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();}/*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);}从上面的程序可以看出,对物体光照处理的步骤是:•定义物体各顶点的法向量,由此确定物体与光源的相对方向。OpenGL通过法向量来确定指定顶点从每个光源所得到的受光量,并用于像素点颜色的计算中。•光源的创立、定位和启用。由glLight〔〕函数创立光源,指定光源的位置。可创立8个。必须用命令glEnable(GL_LIGHTING)启用所定义的光源。用glEnable(GL_LIGHTi)翻开第i个光源。•选择光照模型。光照模型由glModel〔〕函数进行选择。OpenGL的光照模型由三局部组成:全景泛光强度、观察点的位置、对前、后面光照计算的处理。•定义场景中物体的材料属性。通过函数glMaterial〔〕指定材料的环境色、漫反射色、镜面反射色及其光亮度。3.光照计算在RGBA模式下,在光照条件下屏幕上某一像素点的颜色计算公式为:顶点颜色=像素点处的材料辐射+经顶点处材料环境光属性缩放后的全场环境光+来自各光源经衰减处理后的各种成分〔环境光、漫反射光和镜面反射光〕其中emission表示物体发射光,如果物体本身不是光源,那么这一项为0;ambient,diffuse,specular分别表示泛光、漫反射光、镜面反射光,其中每一项都是物体与光源的组合〔相乘〕;shininess表示物体的光洁度;符号n表示顶点的法线方向,l表示视线方向,s表示入射光方向。上述计算对R、G、B分量分别进行,计算所得的结果被调整到0~1的范围之内。实验1。在微机环境下,在VC++运行环境中调试并运行例10.1,10.2与10.3程序,以初步了解OpenGL程序的根本结构和编程方法。DirectX开展历史功能简介编程入门开展历史
DirectX是微软单独开发的API。DirectX的效劳范围涵盖图形、输入/输出、音频、显示、多媒体等等许多领域,组件包括DirectGraphics(Direct3D+DirectDraw)、DirectInput、DirectPlay、DirectSound、DirectShow、DirectSetup、DirectMediaObjects等等。开展历史
1995年,微软的第一个API——DirectX1发布。它仅提供了对2D图形和根本音频功能的支持,主要是为了弥补Windows95对图形管理的缺乏。
1996年,DirectX的第二个版本DirectX2推出。它引入了Direct3D技术、DirectX2采用平滑模拟和RGB模拟两种方式来加速3D图像生成;同时,原有的2D局部得到了有效增强、参加了2D动态效果,并更正了原有的一些bug。整个DirectX的设计架构根本确定,它也是如今的DirectX的雏形。Trident、S3公司开始支持DirectX2,代表游戏是?红色警报?。开展历史
同年,DirectX3发布,不过它只是DirectX2的简单改进而已,对DirectSound和DirectPlay等功能作了些变动,总体来说还属于功能简单的DirectX2技术体系。nVIDIARiva128和Intel的i740都支持它,代表游戏?极品飞车3?。
1997年,微软发布DirectX5,对Direct3D作了彻底修改:参加雾化效果、Alpha混合等特效,大大增强3D游戏的真实感;DirectX5在音频、游戏控制方面均做了大量的改进,游戏开放商的移植工作也变得更简单,DirectX5可以说是DirectXAPI技术成熟的标志。代表游戏就是?古墓丽影3?。OpenGL已经在?Quake2?之类的3D游戏中发挥威力,在纯3D领域,OpenGL的影响力远甚于DirectX5。开展历史1998年,DirectX6推出。这个时候,DirectX已被许多厂商认可并成为2D游戏和局部3D游戏的标准API。实现了多纹理、顶点缓冲和凸凹映射等功能。nVIDIA的TNT2继续对它提供支持,代表游戏那么是?极品飞车5?和?CS?。这个时候,OpenGL还被广泛认为优于DirectX。
1999年,DirectX7发布——DirectXAPI开展史上的转折点。nVIDIA开创了GPU概念。微软及时在DirectX7中对其提供了支持:参加硬件几何转换与光源处理技术〔即所谓的“硬件T&L〞〕以及贴图的矩阵混合,自然,它获得更广的支持度。开展历史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游戏都对它提供支持。开展历史
DirectX9是当前无可争议的新一代图形API标准,nVIDIA、ATI、XGI等图形厂商都以它作为产品开发的指导方向,新一代游戏也积极提供支持。DirectX9构建于DirectX8.0/8.1,但它并不是功能上的小修小补,而是带来了许多革命性的新特性。主要包括:将顶点着色引擎、像素着色引擎升级至2.0版本;浮点色彩处理的精度提高到128位〔DirectX8.0/8.1为32位〕;引入硬件位移贴图的概念;支持40位真彩色;简介DirectX由显示局部、声音局部、输入局部和网络局部四大局部组成。显示局部又分为DirectDraw〔DDraw〕和Direct3D〔D3D〕前者主要负责2D加速。
后者负责3D加速,比方极品飞车3-6的车身与烟雾,CS中的场景和人物,古墓丽影中劳拉等等。简介声音局部包括声效和MIDI音乐,不同的声卡表现的效果不同,目前的声卡根本上都支持DirectSound。输入局部:DirectInput不仅支持更多的游戏输入设备,而且对这些设备的识别与驱动上更加细致,充分发挥设备的最正确状态和全部功能。除了键盘和鼠标之外还可以连接手柄、摇杆、模拟器等。
简介网络局部:DirectPlay,它为游戏而来。通过它可以让计算机之间互联无障碍,提供多种连接方式,TPC/IP,IPX,Modem,串口等等。编程入门为了创立Direct3D程序,需要安装DirectXSDK,下载网址:DirectX9SDK为VC用户提供了一个程序向导,可以很方便地生成“空〞的Direct3D程序。编程入门DirectX的功能都是以COM组件的形式提供的。COM----组件对象模型〔ComponentObjectModel〕,一种协议,用来实现软件模块间的二进制连接。当COM连接建立后,两个模块之间就可以通过称为“接口〔Interface〕〞的机制来通信。所谓接口,其实就是一组特殊的C++对象,应用程序通过调用这些对象的成员函数,来访问COM组件,实现组件的功能。在COM术语中,这些成员函数被称作方法〔Method〕。编程入门根本步骤:调用适当的函数获取接口指针;调用接口的方法〔成员函数〕来完成所需功能;用完接口后,调用Release方法进行“释放〞,注意释放顺序应该和获取它们的顺序相反。编程入门创立应用程序框架初始化Direct3D创立Direct3D对象,然后用该对象创立设备对象。设备对象可以说是Direct3D中最重要的部件,几乎所有的3D绘图功能都要通过它实现。3。渲染4。释放实验2利用Direct3D实现初级教程中三角形和圆锥程序的功能。以了解Direct3D的根本编程方法。OpenInventorOpenInventor是一套面向对象的3D工具。整套工具基于OpenGL,用C++语言写成。对三维虚拟场景中的各种要素都进行了对象化的封装。使得用户对三维场景的构造和图形编程变成了对各种对象的操作,而场景渲染、刷新等繁琐工作那么留给OpenInventor自动完成,大大简化了图形应用程序的开发,加快了开发速度。支持虚拟现实设备,这为CAD系统中使用虚拟现实设备提供了便利。Openinventor根本库场景数据库:场景数据库由Openinventor管理。数据库元素是最根本的一系列的对象,它们是用来创立三维场景数据库的根本要素。每个数据库元素包含一系列的重要信息如:形状描述,材料种类,几何变换和光源等。数据库元素主要包括以下几种:形状元(如:球、圆锥、圆柱、长方体、Nubs曲面等)、特性元(如光照环境、光源种类、材料种类等)。图形引擎(用来联系对象和有关的场景并对场景产生动画),传感器(用来对场景数据库中的数据改变做出响应,以调用相关的操作和实现时间进程管理)。数据库元素按照一定的规那么组合起来就得到了复杂的三维场景图。场景图储存在场景数据库中。一旦用户生成了一幅场景图,用户就可以对场景图的对象进行操作,这些操作对象的管理也是由场景数据库来实现的。Openinventor根本库操作库操作库主要响应用户的交互操作事件,这种响应是非常直观并且可以编辑的。一个很明显的例子是鼠标的点取和操作盒显示。用户可以点取Openinventor三维场景中的任一对象,此对象将被高
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 11-1《谏逐客书》教学设计 2023-2024学年统编版高中语文必修下册
- 吉林省四平市普通高中2023-2024学年高二上学期期中考试地理试题(解析版)
- 2024业务员的个人工作计划(34篇)
- 2025至2030年中国提花摇粒布数据监测研究报告
- 2025届高考生物备考教学设计:第三章 细胞代谢之光合作用与呼吸作用的关系
- 太阳能热电联产经济效益分析
- 商务英语阅读第一单元
- 陕西食品保健食品
- MiniLED与传统LED技术对比
- Module 12 Save our world Unit 1 教学设计 2024-2025学年外研版九年级英语上册
- 起重装卸机械操作工国家职业技能标准(2018年版)
- 叉车装卸区域安全风险告知牌
- 五年级下册美术课件-第2课 新街古韵丨赣美版
- 《普通生物学教案》word版
- 秦荻辉科技英语写作教程练习答案(共42页)
- GB∕T 41168-2021 食品包装用塑料与铝箔蒸煮复合膜、袋
- 部编版语文一年级下册绘本阅读课-优质课件.pptx
- 新人教版九年级全一册物理知识点填空题汇编
- 人教版五年级数学下册每个单元教材分析(共九个单元)
- 办好高水平民办高中的哲学思考-教育文档
- 小学生如何理解句子的含义(课堂PPT)
评论
0/150
提交评论