OpenGL编程基础.ppt

上传人:1595****071 文档编号:86289574 上传时间:2023-04-14 格式:PPT 页数:63 大小:546KB
返回 下载 相关 举报
OpenGL编程基础.ppt_第1页
第1页 / 共63页
OpenGL编程基础.ppt_第2页
第2页 / 共63页
点击查看更多>>
资源描述

《OpenGL编程基础.ppt》由会员分享,可在线阅读,更多相关《OpenGL编程基础.ppt(63页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、2023/3/23华中科技大学计算机学院 李国宽11、OpenGL简介简介 OpenGL(Open Graphics Library,开放图形库),是一个二维/三维的计算机图形和模型库,它源于SGI(Silicon Graphics inc.)公司为其图形工作站开发的IRIS GL,在跨平台移植过程中发展成为OpenGL。目前,OpenGL已成为开放的国际图形标准。一、一、OpenGL框架框架2023/3/232OpenGL的功能:的功能:模型绘制模型绘制 绘制点、线和多边形,构造三维模型。绘制点、线和多边形,构造三维模型。模型观察模型观察 建立变换建立变换(坐标变换,投影变换,视窗变换坐标变

2、换,投影变换,视窗变换)。颜色模式的指定:颜色模式的指定:RGBA模式和颜色索引模式 光照应用光照应用 图象效果增强:图象效果增强:反走样、混合和雾化 位图和图象处理位图和图象处理 纹理映射纹理映射 实时动画:实时动画:双缓存技术(double buffer)交互技术交互技术 提供人机交互的接口。提供人机交互的接口。OpenGL的特点的特点从程序开发人员的角度来看,从程序开发人员的角度来看,OpenGL是一组是一组绘图命令的绘图命令的API集合。集合。利用这些利用这些API能够方便地能够方便地描述二维和三维几何物体,并控制这些物体按描述二维和三维几何物体,并控制这些物体按某种方式绘制到显示缓冲

3、区中。某种方式绘制到显示缓冲区中。OpenGL的的API集提供了物体描述、平移、旋转、缩放、光照、集提供了物体描述、平移、旋转、缩放、光照、纹理、材质、像素、位图、文字、交互以及提纹理、材质、像素、位图、文字、交互以及提高显示性能等方面的功能,基本涵盖了开发二、高显示性能等方面的功能,基本涵盖了开发二、三维图形程序所需的各个方面。与一般的图形三维图形程序所需的各个方面。与一般的图形开发工具相比,开发工具相比,OpenGL具有以下几个突出特具有以下几个突出特点点:(1 1)跨平台特性跨平台特性 OpenGL与硬件、窗口和操作系统是相互独立的。与硬件、窗口和操作系统是相互独立的。为了构成一个完整功

4、能的图形处理系统,其设计实现为了构成一个完整功能的图形处理系统,其设计实现共分共分 5 5 层:图形硬件、操作系统、窗口系统、层:图形硬件、操作系统、窗口系统、OpenGL和和应用软件。应用软件。因而,因而,OpenGL可以集成到各种标准窗口和操作系可以集成到各种标准窗口和操作系统中。例如,操作系统包括统中。例如,操作系统包括UNIX,WindowsNT,Windows95/98,DOS等;窗口系统包括等;窗口系统包括XWindows,MicrosoftWindows等。等。OpenGL图形函数定义独立于任何程序设计语言,在图形函数定义独立于任何程序设计语言,在各种编程语言中,如各种编程语言中

5、,如C,C+,FORTRAIN,Ada和和Java等,都可以调用等,都可以调用OpenGL的库函数。的库函数。(2)应用的广泛性应用的广泛性OpenGL是目前最主要的二、三维交互式图形应用程是目前最主要的二、三维交互式图形应用程序开发环境,已成为业界最受推荐的图形应用编程接序开发环境,已成为业界最受推荐的图形应用编程接口。自从口。自从1992年发表以来,年发表以来,OpenGL已被广泛地应用已被广泛地应用于于CAD/CAM、三维动画、数字图像处理以及虚拟现三维动画、数字图像处理以及虚拟现实等领域,实等领域,Kinetix公司的公司的3DStudioMax就是突出的就是突出的代表。无论是在代表。

6、无论是在PC机上,还是在工作站甚至是大型机上,还是在工作站甚至是大型机和超级计算机上,机和超级计算机上,OpenGL都能表现出它的高性能都能表现出它的高性能和强大威力。和强大威力。(3)网络透明性网络透明性 建立在客户建立在客户/服务器模型上的网络透明性是服务器模型上的网络透明性是OpenGL的固有特性,它允许一个运行在工作站上的的固有特性,它允许一个运行在工作站上的进程在本机或通过网络在远程工作站上显示图形。利进程在本机或通过网络在远程工作站上显示图形。利用这种性质能够均衡各工作站的工作负荷用这种性质能够均衡各工作站的工作负荷,共同承担共同承担图形应用任务。图形应用任务。(4)高质量和高性能

7、高质量和高性能 无论是在无论是在CAD/CAM、三维动画还是可视化仿真三维动画还是可视化仿真等领域,等领域,OpenGL高质量和高效率的图形生成能力都高质量和高效率的图形生成能力都能得到充分的体现。在这些领域中,开发人员可以利能得到充分的体现。在这些领域中,开发人员可以利用用OpenGL制作出效果逼真的二、三维图像来。制作出效果逼真的二、三维图像来。(5)出色的编程特性出色的编程特性OpenGL在各种平台上已有多年的应用在各种平台上已有多年的应用实践,加上严格的规范控制,因此实践,加上严格的规范控制,因此OpenGL具具有良好的稳定性。有良好的稳定性。OpenGL具有充分的独立性与易使用性等。

8、具有充分的独立性与易使用性等。2023/3/2382、OpenGL的工作方式的工作方式 (1)体系结构 一个完整的窗口系统的OpenGL图形处理系统的结构如右图所示:最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,最上面的层为应用软件。2023/3/239(2)OpenGL的流水线的流水线 当应用程序进行OpenGL API函数调用时,OpenGL命令将被放在一个命令缓冲区中,这样,命令缓冲区中包含了大量的命令、顶点数据和纹理数据。当这个缓冲区被清空时,缓冲区中的命令和数据都将传递给流水线的下一个阶段。2023/3/2310(3)OpenGL状态机制状态机制 Ope

9、nGL的工作方式是一种状态机制,它可以进行各种状态或模式设置,这些状态或模式在重新改变它们之前一直有效。状态变量可以通过glEnable()、glDisable()这两个函数来设置成有效或无效状态。另外可以用下列四个函数来获取某个状态变量的值:glGetBooleanv()、glGetDoublev()、glGetFloatv()和glGetIntegerv()。2023/3/23113、OpenGL的组成的组成 OpenGL是一种API,包括了多个图形函数,主要由以下函数库组成。(1)OpenGL核心库:gl(2)OpenGL实用程序库:glu(3)OpenGL编程辅助库:aux(4)Ope

10、nGL实用程序工具包(OpenGL utility toolkit,GLUT):glut(5)Windows专用库:wgl(6)Win32 API函数库2023/3/23124、OpenGL中的数据类型中的数据类型 数据类型 内部表示法 定义为C类型 GLbyte 8位整数 signed char GLshort 16位整数 short GLint,GLsizei 32位整数 long GLfloat,GLclampf 32位浮点数 float GLdouble,GLclampd 64位浮点数 double GLubyte,GLboolean 8位无符号整数 unsigned char GLs

11、hort 16位无符号整数 unsigned short GLuint,GLenum,GLbitfield 32位无符号整数 unsigned long 2023/3/23135、函数命名约定、函数命名约定OpenGL函数都遵循一个命名约定,即采用以下格式:例如函数glColor3f(),gl表示这个函数来自库gl.h,color表示该函数用于颜色设定,3f表示这个函数采用了三个浮点数参数。2023/3/23146、OpenGL中的颜色中的颜色在OpenGL中,一种颜色用红、绿、蓝成分的混合来表示,每种成分的值范围是0.0到1.0。数据类型 红色成分 绿色成分蓝色成分黑 0.0 0.00.0红

12、 1.00.00.0绿 0.0 1.00.0黄 1.0 1.00.0紫 1.0 0.01.0青 0.0 1.01.0深灰 0.25 0.250.25OpenGL初步编程在在WindowsWindows下开发和创建一个下开发和创建一个OpenGLOpenGL程程序的基本步骤:序的基本步骤:第一步,选择一个编译环境,如第一步,选择一个编译环境,如第一步,选择一个编译环境,如第一步,选择一个编译环境,如VC+VC+第二步,安装第二步,安装第二步,安装第二步,安装GLUTGLUT工具包工具包工具包工具包 第三步,建立一个第三步,建立一个第三步,建立一个第三步,建立一个OpenGLOpenGL工程工程工

13、程工程 第四步,编译连接第四步,编译连接第四步,编译连接第四步,编译连接 第五步,执行程序第五步,执行程序第五步,执行程序第五步,执行程序 OpenGL初步编程OpenGL库和头文件:库和头文件:动态库:动态库:动态库:动态库:opengl32.dll glu32.dll glut32.dll opengl32.dll glu32.dll glut32.dll 放入放入windowssystem32windowssystem32目录下目录下静态库:静态库:静态库:静态库:opengl32.lib glu32.lib glut32.libopengl32.lib glu32.lib glut32

14、.lib放入放入VCVC安装安装目录的目录的LIBLIB目录下目录下头文件:头文件:头文件:头文件:gl.hgl.h glu.hglu.h glut.hglut.h放入放入VCVC安装目录的安装目录的IncludeGLIncludeGL文件夹下文件夹下程序清单程序清单1.11.1:在窗口内绘制一个矩形:在窗口内绘制一个矩形/GLRect.cGLRect.c#include#include#include#include#include#include#include#include/函数函数RenderSceneRenderScene用于在窗口中绘制需要的图形用于在窗口中绘制需要的图形void

15、 void RenderScene(voidRenderScene(void)/用当前清除色清除颜色缓冲区,即设定窗口的背景色用当前清除色清除颜色缓冲区,即设定窗口的背景色glClear(GL_COLOR_BUFFER_BITglClear(GL_COLOR_BUFFER_BIT););/设置当前绘图使用的设置当前绘图使用的RGBRGB颜色颜色 glColor3f(1.0f,0.0f,0.0f);glColor3f(1.0f,0.0f,0.0f);/使用当前颜色绘制一个填充的矩形使用当前颜色绘制一个填充的矩形glRectf(100.0f,150.0f,150.0f,100.0f);glRect

16、f(100.0f,150.0f,150.0f,100.0f);/刷新刷新OpenGLOpenGL命令队列命令队列glFlushglFlush();();/函数函数ChangeSizeChangeSize是窗口大小改变时调用的登记函数是窗口大小改变时调用的登记函数void void ChangeSize(GLsizeiChangeSize(GLsizei w,w,GLsizeiGLsizei h)h)if(hif(h=0)h=1;=0)h=1;/设置视区尺寸设置视区尺寸glViewport(0,0,w,h);glViewport(0,0,w,h);/重置坐标系统,使投影变换复位重置坐标系统,使投

17、影变换复位glMatrixMode(GL_PROJECTIONglMatrixMode(GL_PROJECTION););glLoadIdentityglLoadIdentity();();/建立修剪空间的范围建立修剪空间的范围 if(w=h)if(w=h)glOrthoglOrtho(0.0f,250.0f,0.0f,250.0f*(0.0f,250.0f,0.0f,250.0f*h/wh/w,1.0f,-,1.0f,-1.0f);1.0f);else else glOrthoglOrtho(0.0f,250.0f*(0.0f,250.0f*w/hw/h,0.0f,250.0f,1.0f,-

18、1.0f);,0.0f,250.0f,1.0f,-1.0f);glMatrixMode(GL_MODELVIEWglMatrixMode(GL_MODELVIEW););glLoadIdentityglLoadIdentity();();/函数函数SetupRCSetupRC用于初始化,常用来设置场景渲染状态用于初始化,常用来设置场景渲染状态void void SetupRC(voidSetupRC(void)/设置窗口的清除色为白色设置窗口的清除色为白色 glClearColor(1.0f,1.0f,1.0f,1.0f);glClearColor(1.0f,1.0f,1.0f,1.0f);v

19、oid void main(voidmain(void)/初始化初始化GLUTGLUT库库OpenGLOpenGL窗口的显示模式窗口的显示模式glutInitDisplayMode(GLUT_SINGLEglutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);|GLUT_RGB);/创建一个名为创建一个名为GLRectGLRect的窗口的窗口glutCreateWindow(GLRectglutCreateWindow(GLRect););/设置当前窗口的显示回调函数和窗口再整形回调函数设置当前窗口的显示回调函数和窗口再整形回调函数glutDisplayFunc(R

20、enderSceneglutDisplayFunc(RenderScene););glutReshapeFunc(ChangeSizeglutReshapeFunc(ChangeSize););SetupRCSetupRC();();/启动主启动主GLUTGLUT事件处理循环事件处理循环glutMainLoopglutMainLoop();();GLRectGLRect程序运行结果程序运行结果 2023/3/23211、画点、线和面、画点、线和面 glBegin(GL_POINTS);glVertex3f(0.0f,0.0f,0.0f);glVertex3f(10.0f,10.0f,10.0f

21、);glEnd();计算机中的图元只是把一组顶点或顶点列表解释为屏幕上绘制的某些形状,而顶点是用函数glVertex3f来定义,该函数中的参数指明定义点的x、y和z坐标。二、用二、用OpenGL绘图绘图2023/3/2322模式图元类型GL_POINTSGL_POINTS将指定的各个顶点用于创建单个的点GL_LINESGL_LINES将指定的顶点用于创建线段。每两个顶点指定一条单独的线段。如果顶点个数是奇数,则忽略最后一个GL_LINE_STRIPGL_LINE_STRIP将指定的顶点用于创建线条。第一个顶点之后的每个顶点指定的是线条延伸到的下一个点GL_LINE_LOOPGL_LINE_LO

22、OP特性和GL_LINE_STRIP相似,只不过最后一条线段是在指定的最后一个和第一个顶点之间绘制。典型情况下,这用于绘制那些可能违反了GL_POLYGON用法规则的封闭区域GL_TRIANGLESGL_TRIANGLES将指定的顶点用于构造三角形。每三个顶点指定一个新三角形。如果顶点个数不是三的倍数,多余的顶点将被忽略GL_TRIANGLE_SGL_TRIANGLE_STRIPTRIP将指定的顶点用于创建三角条。指定前三个顶点之后,后继的每个顶点与它前面两个顶点一起用来构造下一个三角形。每个顶点三元组(在最初的组之后)会自动重新排列以确保三角形绕法的一致性。GL_TRIANGLE_FGL_T

23、RIANGLE_FANAN将指定的顶点用于构造三角扇形。第一个顶点充当原点,第三个顶点之后的每个顶点与它的前一个顶点还有原点一起组合。GL_QUADSGL_QUADS每四个顶点一组用于构造一个四边形。如果顶点个数不是四的倍数,多余的顶点将被忽略GL_QUADS_STRGL_QUADS_STRIPIP将指定的顶点用于构造四条形边。在第一对顶点之后,每对顶点定义一个四边形。和GL_QUADS的顶点顺序不一样,每对顶点以指定顺序的逆序使用,以便保证绕法的一致GL_POLYGONGL_POLYGON将指定的顶点用于构造一个凸多边形。多边形的边缘决不能相交。最后一个顶点会自动连接到第一个顶点以确保多边形

24、是封闭的2023/3/2323(1)点的大小void glPointSize(GLfloat size);GLfloat sizes2;/保存绘制点的尺寸范围GLfloat step;/保存绘制点尺寸的步长glGetFloarv(GL_POINT_SIZE_RANGE,sizes);glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);(2)线宽void glLineWidth(GLfloat width)GLfloat sizes2;/保存线宽的尺寸范围GLfloat step;/保存线宽尺寸的最小间隔glGetFloarv(GL_LINE_WIDTH_R

25、ANGE,sizes);glGetFloatv(GL_LINE_WIDTH_GRANULARITY,&step);2023/3/2324(3)线型glEnable(GL_LINE_STIPPLE);glLineStipple(GLintfactor,GLushortpattern);pattern是一个16位值,他指定了画线时所用的模式。每一位代表线段的一部分是开还是关。默认情况下,每一位对应一个象素,但factor参数充当倍数可以增加模式的宽度。在应用模式时,pattern是逆向使用的,即模式的最低有效位最先作用于指点线段。2023/3/23252、绕法与多边形模式、绕法与多边形模式 在绘制

26、三角形的过程中,三个顶点将三角形封闭的过程是有序的,即三角形的构成路径具有方向性,我们把指定顶点时顺序和方向的组合称为“绕法”。绕法是任何多边形图元的一个重要特性。一般默认情况下,OpenGL认为逆时针绕法的多边形是正对着的。glFrontFace(GL_CW);glFrontFace(GL_CCW);2023/3/2326函数glPolygonMode用于设定多边形模式:glPolygonMode(GLenumface,GLenummode);其中,参数face用于指定多边形的哪一个面受到模式改变的影响(GL_FRONT,GL_BACK或GL_FRONT_AND_BACK)。参数mode用于

27、指定新的绘图模式。GL_FILL是默认值,生成填充的多边形;GL_LINE生成多边形的轮廓;而GL_POINT只画出顶点。2023/3/23273、多边形颜色的设置、多边形颜色的设置 在OpenGL中,颜色实际上是对各个顶点而不是对各个多边形指定的。(1)glShadeModel(GL_FLAT)告诉OpenGL用指定多边形最后一个顶点时的当前颜色作为填充多边形的纯色,唯一例外是GL_POLYGON图元,它采用的是第一个顶点的颜色。(2)glShadeModel(GL_SMOOTH)告诉OpenGL从各个顶点给三角形投上光滑的阴影,试图在为各个顶点指定的颜色之间进行插值。Gouraud明暗处理

28、通常算法为:先用多边形顶点的光强线性插值出当前扫描线与多边形边交点处的光强,然后再用交点的光强线插值处扫描线位于多边形内区段上每一象素处的光强值。采用Gouraud明暗处理不但可以使用多边形表示的曲面光强连续,而且计算量很小。2023/3/23294、深度测试深度测试 深度测试是一种移除被挡住表面的有效技术。为了启用深度测试,只要调用:glEnable(GL_DEPTH_TEST);glDisable(GL_DEPTH_TEST);另外为了使深度缓冲区正常完成深度测试功能,在每次渲染场景时,必须先清除深度缓冲区:glClear(GL_DEPTH_BUFFER_BIT);2023/3/23305

29、、多边形构造规则、多边形构造规则(1)所有多边形都必须是平面的。(2)第二条规则是多边形的边缘决不能相交,而且多边形必须是凸的。解解决决:对于非凸多边形,可以把它分割成几个凸多边形(通常是三角形),再将它绘制出来。问问题题:轮廓图形状态会看到组成大表面的所有小三角形。处理OpenGL提供了一个特殊标记来处理这些边缘,称为边缘标记。glEdgeFlag(True)glEdgeFlag(False)1、OpenGLOpenGL中的变换中的变换 (1)视图变换:指定观察者或摄影机的位置;(2)模型变换:在场景中移动对象;(3)模型视图变换:描述视图变换与模型变换的对偶性;(4)投影变换:对视见空间进

30、行修剪和改变大小;(5)视见区变换:对窗口的最终输出进行缩放;三、三、图形的变换图形的变换2、模型视图矩阵、模型视图矩阵(1)平移 void glTranslated(f)(GLdouble x,GLdouble y,GLdoublez);(2)旋转voidglRotated(f)(GLdoubleangle,GLdoublex,GLdoubley,GLdoublez);(3)比例 void glScaled(f)(GLdouble x,GLdouble y,GLdoublez);矩阵的操作矩阵的操作glMatrixMode(GLenummode);参数mode用于确定将哪个矩阵堆栈用于矩阵操

31、作。GL_MODELVIEW:模型视图矩阵堆栈GL_PROJECTION:投影矩阵堆栈GL_TEXTURE:纹理矩阵堆栈 3、单位矩阵单位矩阵 glTranslatef(10.0f,0.0f,0.0f);glutSolidSphere(1.0f,15,15);glTranslatef(0.0f,10.0f,0.0f);glutSolidSphere(1.0f,15,15);glMatrixMode(GL_MODELVIEW);glLoadIdentity();4、矩阵堆栈矩阵堆栈 OpenGL为模型视图矩阵和投影矩阵各维护着一个“矩阵堆栈”,可以把当前矩阵压到堆栈中保存它,然后对当前矩阵进行修

32、改。把矩阵弹出堆栈即可恢复。使用的函数如下:voidglPushMatrix(void);voidglPopMatrix(void);5、投影变换投影变换 OpenGL中只提供了两种投影方式,一种是平行投影(正射投影),另一种是透视投影。在投影变换之前必须指定当前处理的是投影变换矩阵:glMAtrixMode(GL_PROJECTION);glLoadIdentity();(1)平行投影)平行投影 平行投影,它的视景体是一个矩形的平行管道,也就是一个长方体,其特点是无论物体距离相机多远,投影后的物体大小尺寸不变。voidglOrtho(GLdoubleleft,GLdoubleright,GL

33、doublebottom,GLdoubletop,GLdoublenear,GLdoublefar);这个函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。voidgluOrtho2D(GLdoubleleft,GLdoubleright,GLdoublebottom,GLdoubletop);它是一个特殊的正射投影函数,主要用于二维图像到二维屏幕上的投影。它的near和far缺省值分别为-1.0和1.0,所有二维物体的Z坐标都为0.0。因此它的裁剪面是一个左下角点为(left,bottom)、右上角点为(right,top)的矩形。(2)透视投影)透视投影 voidglFrust

34、um(GLdoubleleft,GLdoubleRight,GLdoublebottom,GLdoubletop,GLdoublenear,GLdoublefar);此函数创建一个透视投影矩阵,并且用这个矩阵乘以当前矩阵。它的参数只定义近裁剪平面的左下角点和右上角点的三维空间坐标,即(left,bottom,-near)和(right,top,-near);最后一个参数far是远裁剪平面的Z负值,其左下角点和右上角点空间坐标由函数根据透视投影原理自动生成。voidgluPerspective(GLdoublefovy,GLdoubleaspect,GLdoublezNear,GLdoublez

35、Far);它也创建一个对称透视视景体,但它的参数定义于前面的不同,其操作是创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵。参数fovy定义视野在X-Z平面(垂直方向上的可见区域)的角度,范围是0.0,180.0;参数aspect是投影平面的纵横比(宽度与高度的比值);参数zNear和Far分别是远近裁剪面沿Z负轴到视点的距离。6、高级矩阵处理高级矩阵处理 glfloatm=1.0f,0.0f,3.0f,0.0f,0.0f,1.0f,0.0f,1.0f,0.0f,0.0f,1.0f,1.0f,0.0f,0.0f,0.0f,1.0f,;glMatrixMode(GL_MODELVIEW);

36、glLoadMatrixf(m);当光照射到一个物体表面上时,会出现三种情形。首先,光可以通过物体表面向空间反射,产生反射光。其次,对于透明体,光可以穿透该物体并从另一端射出,产生透射光。最后,部分光将被物体表面吸收而转换成热。在上述三部分光中,仅仅是透射光和反射光能够进入人眼产生视觉效果。四、四、光照处理光照处理(1)环境光(环境光(AmbientLight)环境光不来自于任何特殊的方向,他有光源,但是被周围的房间或场景多次反射,以致于变得没有方向。被环境光照射的物体表面的各个方向都均等受光。(2)散射光(散射光(DiffuseLight)光来自某个方向,被物体表面均匀地反射。光是被均匀反射

37、回去的,它直射的物体表面比从某个角度照射过来时要亮。(3 3)镜面光(镜面光(SpecularLight )镜面光也有方向性,但被强烈地反射到另一特定的方向。高亮度的镜面光能够在被照射的物体表面上产生称之为亮斑的亮点。任何一个光源都是由环境光、散射光和镜面光三种光照成分组成,各成分的定义是由RGBA值定义的。5.5.材质材质 OpenGL用材料对光的红、绿、蓝三原色的反射率来近似定义材料的颜色。象光源一样,材料颜色也分成环境、漫反射和镜面反射成分,它们决定了材料对环境光、漫反射光和镜面反射光的反射程度。在进行光照计算时,材料对环境光的反射率与每个进入光源的环境光结合,对漫反射光的反射率与每个进

38、入光源的漫反射光结合,对镜面光的反射率与每个进入光源的镜面反射光结合。材质的颜色实际决定了反射光与入射光的百分比率:若OpenGL的光源颜色为(LR、LG、LB),材质颜色属性为(MR、MG、MB)。那么,最终到达眼睛的光的颜色为 (LR*MR、LG*MG、LB*MB)三种光照成分的RGBA值叠加就形成了物体最终的颜色。当任何一种颜色成分大于1.0,就用1.0计算。6.加入光照光照(1)glEnableglEnable(GL_LIGHTINGGL_LIGHTING)指定OpenGL可以利用材质属性和光照参数决定场景中每个顶点的颜色。(2)glLightModelfv(f,i,iv)(Glenu

39、mpname,constGLfloat*param)指定光照模型GL_LIGHT_MODEL_AMBIENT:设置环境光GL_LIGHT_MODEL_LOCAL_VIEWER:定义视点,0表示镜面反射角度认为视线方向平行于z轴负向,否则镜面反射从视点坐标系的原点来计算。GL_LIGHT_MODEL_TWO_SIDE:启用双面关照,0.0时表示只有多边形表面的正面进行光照计算,否则正反两面都进行光照计算。(3)glMaterialfv(GLenumface,GLenumpname,constGLfloat*params)Face参数参数:GL_FRONT;GL_BACK;GL_FRONT_AND

40、_BACK。Pname参数:GL_AMBIENT:材质环境反射RGBA值。GL_DIFFUSE:材质漫反射RGBA值。GL_SPECULAR:材质镜面反射RGBA值。GL_SHININESS:材质的RGBA镜面指数。(4)glEnable(GL_COLOR_MATERIAL)启用颜色跟踪法,此时可以通过glColor设置材质属性。(5)glColorMaterial(Glenumface,Glenummode)mode:指定哪个材质属性能够遵循当前的颜色。GL_EMISSION;GL_AMBIENT;GL_DIFFUSE;GL_SPECULAR;GL_AMBIENT_AND_DIFFUSE。7

41、.7.使用点光源使用点光源 OpenGL支持8种独立光源,它们可以放置在场景中的任意位置,也可放在视见空间之外。当将光源放在无穷远处就可以得到平行的光线。光源发射光线射到多边形的表面,与平面成角度A,在以角度B反射进入观察者,通过这些角度可以计算光线照射的多边形表面的颜色。OpenGL有意让计算的位置就是多边形的顶点。通过计算各个顶点的颜色,再在各个顶点间进行光滑着色。(1 1)法线矢量法线矢量 从假想的平面(或者是多边形)上的一个顶点引出来的一条垂直向上的线称为法线矢量。glNormal3f(GLfloatx,GLfloaty,GLfloatz)指定法线矢量。OpenGL最后都将表面法线转化

42、成单位法线,对于光照计算,所有的法线矢量都必须归一化。glEnable(GL_NORMALIZE)glEnable(GL_RESCALE_NORMALS)法线矢量的计算(2 2)设置光源参数设置光源参数glLightf(GLenumlight,GLenumpname,GLenumparam)light:光源编号 pname:指定光源参数类型GL_AMBIENT:光照的环境RGBA浓度。GL_DIFFUSE:光照的漫射RGBA浓度。GL_SPECULAR:光照的镜面RGBA浓度。(3 3)镜面光处理镜面光处理 使用glLightfv函数在光源中加入镜面光成分,为了出现镜面光效果,还要在材质属性中

43、增加镜面成分。镜面指数:glMateriali(GL_FRONT,GL_SHININESS,128);GL_SHININESS属性设置材质的镜面指数,它说明如何确定镜面关亮斑的大小和聚焦程度。(4 4)光的衰减)光的衰减 真实的光,离光源越远则光强越小。OpenGL的光衰减是通过光源的发光量乘以衰减因子计算出来的。缺省状态下,常数衰减因子是(1.0,0.0,0.0)。用户也可以自己定义这些值,如:glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,2.0);glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,2.0);glLi

44、ghtf(GL_LIGHT0,GL_LINEAR_ATTENUATION,1.0);glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,1.0);glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,0.5)glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,0.5);注意注意:环境光、漫反射光和镜面光的强度都衰减,只有辐射光和全局环境光的强度不衰减。(5)聚光和多光源聚光和多光源定位光源可以定义成聚光灯形式,即将光的形状限制在一个圆锥内。OpenGL中聚光的定义有以下几步:a)定义聚光源位置定

45、义聚光源位置。因为聚光源也是定向光源,所以他的位置同一般定向光一样。如:GLfloatlight_pos=1.0,1.0,1.0,1.0;glLightfv(GL_LIGHT0,LIGHT_POSITION,light_pos);light_pos参数的最后一个分量为0,则光源为方向光源,分量为1,则光源为平行于负z轴的方向光源。b)定义聚光截止角定义聚光截止角。参数GL_SPOT_CUTOFF给定光锥的轴与中心线的夹角,也可说成是光锥顶角的一半。缺省时,这个参数为180.0,即顶角为360度,光向所有的方向发射,因此聚光关闭。一般在聚光启动情况下,聚光截止角限制在0.0,90.0 之间,如下

46、面一行代码设置截止角为45度:glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,45.0);如果光照方向与光照到所照射的顶点方向之间的角度大于聚光截止角,那么光照完全被屏蔽。c)定义聚光方向定义聚光方向。聚光方向决定光锥的轴,其缺省值为(0.0,0.0,-1.0),即指向Z负轴。聚光方向也要进行几何变换,其结果保存在视点坐标系中。它的定义如下:GLfloatGLfloat spot_dirspot_dir=-1.0,-1.0,0.0;=-1.0,-1.0,0.0;glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,spot_dir);glLightfv

47、(GL_LIGHT0,GL_SPOT_DIRECTION,spot_dir);三个参数包含4个整数值或浮点数值,只有当聚光截止角不等于180.0时,此参数值才有效。d)定义聚光指数定义聚光指数。参数GL_SPOT_EXPONENT控制光的集中程度,光锥中心的光强最大,越靠边的光强越小,缺省时为0。glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,2.0);glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,2.0);此函数定义光照的浓度分布。有效的关照浓度是按照光照方向与光照到所照射的顶点方向之间的角度的余弦,并逐渐增加聚光源的指数进行衰减,这样较大的

48、聚光指数会产生有更强聚焦效果的光源。(6)光源光源的移动 OpenGL光源的位置和方向与其它几何图元的位置和方向一样都必须经过变换矩阵的作用。当用glLight()说明光源的位置和方向时,位置和方向都要经过当前变换矩阵的作用并保存在视点坐标系中,注意投影矩阵变换对它们不起作用。OpenGL可通过调整光源函数和视点变换函数在程序中的相对位置来获得三种不同的效果:1)光源位置保持固定、2)光源绕静止物体移动、3)光源随视点移动(7)辐射光辐射光通过给GL_EMISSION定义一个RGBA值,可以使物体看起来象发出这种颜色的光一样,以达到某种特殊效果。实际上,现实生活中的物体除光源外都不发光,但我们

49、可以利用这一特性来模拟灯和其他光源。代码举例如下:GLfloatGLfloat mat_emissionmat_emission=0.3,0.3,0.5,0.0;=0.3,0.3,0.5,0.0;glMaterialfv(GL_FRONT,GL_EMISSION,mat_emissionglMaterialfv(GL_FRONT,GL_EMISSION,mat_emission););这样,物体看起来稍微有点发光。8.8.阴影阴影 当物体阻止光源的光射到它后面的物体或表面时就会产生阴影。通常是通过把原物体压平、平放到平面表面的方法创建阴影。处理时需要压平模型视图投影矩阵,此外需要考虑光源的距离和方向,光源的方向决定阴影的形状、影响阴影的尺寸。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁