版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2021-12-101OpenGL的功能:的功能: 模型绘制模型绘制 绘制点、线和多边形,构造三维模型。绘制点、线和多边形,构造三维模型。 模型观察模型观察 建立建立(jinl)变换变换(坐标变换,投影变换,坐标变换,投影变换,视窗变换视窗变换)。 颜色模式的指定:颜色模式的指定:RGBA模式和颜色索引模式模式和颜色索引模式 光照应用光照应用 图象效果增强:反走样、混合和雾化图象效果增强:反走样、混合和雾化 位图和图象处理位图和图象处理 纹理映射纹理映射 实时动画:双缓存技术实时动画:双缓存技术(double buffer) 交互技术交互技术 提供人机交互的接口。提供人机交互的接口。第1页/共
2、63页第一页,共64页。OpenGL的特点从程序开发人员的角度来看,OpenGL是一组绘图命令的API集合。利用这些API能够方便地描述二维和三维几何物体,并控制这些物体按某种方式绘制到显示缓冲区中。OpenGL的API集提供了物体描述、平移、旋转、缩放、光照、纹理、材质、像素、位图、文字、交互以及提高显示性能等方面的功能,基本涵盖了开发二、三维图形程序所需的各个方面。与一般的图形开发工具相比(xin b),OpenGL具有以下几个突出特点:第2页/共63页第二页,共64页。(1)跨平台特性 OpenGL与硬件、窗口和操作系统是相互独立的。为了构成一个完整功能的图形处理系统,其设计实现共分 5
3、 层:图形硬件、操作系统、窗口系统、 OpenGL和应用软件。 因而, OpenGL可以集成到各种标准窗口和操作系统中。例如,操作系统包括UNIX,Windows NT, Windows 95/98, DOS等;窗口系统包括X Windows, Microsoft Windows等。OpenGL图形函数定义独立于任何程序设计语言(yyn),在各种编程语言(yyn)中,如C,C+,FORTRAIN,Ada和Java等,都可以调用OpenGL的库函数。第3页/共63页第三页,共64页。(2)应用(yngyng)的广泛性OpenGL是目前最主要的二、三维交互式图形应用(yngyng)程序开发环境,已
4、成为业界最受推荐的图形应用(yngyng)编程接口。自从1992年发表以来,OpenGL已被广泛地应用(yngyng)于CAD/CAM、三维动画、数字图像处理以及虚拟现实等领域,Kinetix公司的3D Studio Max就是突出的代表。无论是在PC机上,还是在工作站甚至是大型机和超级计算机上,OpenGL都能表现出它的高性能和强大威力。第4页/共63页第四页,共64页。(3)网络透明性 建立在客户/服务器模型上的网络透明性是OpenGL的固有特性,它允许一个运行在工作站上的进程在本机或通过网络在远程工作站上显示图形。利用这种性质能够均衡各工作站的工作负荷(fh),共同承担图形应用任务。(4
5、)高质量和高性能 无论是在CAD/CAM、三维动画还是可视化仿真等领域,OpenGL高质量和高效率的图形生成能力都能得到充分的体现。在这些领域中,开发人员可以利用OpenGL制作出效果逼真的二、三维图像来。第5页/共63页第五页,共64页。(5)出色的编程特性 OpenGL在各种平台上已有多年的应用实践,加上严格的规范控制(kngzh),因此OpenGL具有良好的稳定性。 OpenGL具有充分的独立性与易使用性等。第6页/共63页第六页,共64页。2021-12-1072、OpenGL的工作方式 (1)体系结构 一个完整的窗口(chungku)系统的OpenGL图形处理系统的结构如右图所示:最
6、底层为图形硬件,第二层为操作系统,第三层为窗口(chungku)系统,第四层为OpenGL,最上面的层为应用软件。 应用软件OpenGL窗口系统操作系统图形硬件第7页/共63页第七页,共64页。2021-12-108(2)OpenGL的流水线 当应用程序进行OpenGL API函数调用时,OpenGL命令将被放在一个命令缓冲区中,这样,命令缓冲区中包含了大量的命令、顶点数据和纹理数据。当这个缓冲区被清空时,缓冲区中的命令和数据都将传递(chund)给流水线的下一个阶段。OpenGL Command BufferRasterizationT&LFrame bufferOpenGL API
7、 Calls第8页/共63页第八页,共64页。2021-12-109(3)OpenGL状态机制状态机制 OpenGL的工作方式是一种的工作方式是一种(y zhn)状态机制,状态机制,它可以进行各种状态或模式设置,这些状态或模式它可以进行各种状态或模式设置,这些状态或模式在重新改变它们之前一直有效。在重新改变它们之前一直有效。 状态变量可以通过状态变量可以通过glEnable()、glDisable()这两这两个函数来设置成有效或无效状态个函数来设置成有效或无效状态 。 另外可以用下列四个函数来获取某个状态变量另外可以用下列四个函数来获取某个状态变量的值:的值:glGetBooleanv()、g
8、lGetDoublev()、glGetFloatv()和和glGetIntegerv()。 第9页/共63页第九页,共64页。2021-12-10103、OpenGL的组成的组成 OpenGL是一种是一种API,包括了多个图形,包括了多个图形(txng)函数,函数,主要由以下函数库组成。主要由以下函数库组成。(1)OpenGL核心库:核心库:gl(2)OpenGL实用程序库:实用程序库: glu(3)OpenGL编程辅助库:编程辅助库:aux(4)OpenGL实用程序工具包(实用程序工具包(OpenGL utility toolkit,GLUT):):glut(5)Windows专用库:专用库
9、:wgl(6)Win32 API函数库函数库第10页/共63页第十页,共64页。2021-12-10114、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 GLshort 16位无符号整数 unsigned short GLuint
10、,GLenum,GLbitfield 32位无符号整数 unsigned long 第11页/共63页第十一页,共64页。2021-12-10125、函数命名约定OpenGL函数都遵循一个命名约定,即采用以下格式:例如函数glColor3f(),gl表示这个函数来自库gl.h,color表示该函数用于颜色设定,3f表示这个函数采用了三个浮点数参数。 第12页/共63页第十二页,共64页。2021-12-10136、OpenGL中的颜色在OpenGL中,一种颜色用红、绿、蓝成分的混合来表示(biosh),每种成分的值范围是0.0到1.0 。数据类型 红色成分 绿色成分蓝色成分黑 0.0 0.00
11、.0红 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.25第13页/共63页第十三页,共64页。OpenGL初步(chb)编程在在WindowsWindows下开发和创建一个下开发和创建一个OpenGLOpenGL程序的基本程序的基本(jbn)(jbn)步骤:步骤: 第一步,选择一个编译环境,如第一步,选择一个编译环境,如VC+VC+ 第二步,安装第二步,安装GLUTGLUT工具包工具包 第三步,建立一个第三步,建立一个OpenGLOpenGL工程工程 第四步,编译连接第四步,编译连接 第五步,执行
12、程序第五步,执行程序 第14页/共63页第十四页,共64页。OpenGL初步(chb)编程OpenGL库和头文件:动态(dngti)库:opengl32.dll glu32.dll glut32.dll 放入windowssystem32目录下静态库:opengl32.lib glu32.lib glut32.lib放入VC安装目录的LIB目录下头文件:gl.h glu.h glut.h放入VC安装目录的IncludeGL文件夹下第15页/共63页第十五页,共64页。程序清单1.1:在窗口内绘制一个矩形/GLRect.c#include #include #include#include/ 函
13、数RenderScene用于在窗口中绘制需要(xyo)的图形void RenderScene(void)/用当前清除色清除颜色缓冲区,即设定窗口的背景色glClear(GL_COLOR_BUFFER_BIT); /设置当前绘图使用的RGB颜色 glColor3f(1.0f, 0.0f, 0.0f); /使用当前颜色绘制一个填充的矩形glRectf(100.0f, 150.0f, 150.0f, 100.0f); /刷新OpenGL命令队列glFlush();第16页/共63页第十六页,共64页。/ 函数ChangeSize是窗口大小改变时调用的登记函数void ChangeSize(GLsiz
14、ei w, GLsizei h)if(h = 0) h = 1;/设置视区尺寸glViewport(0, 0, w, h); / 重置坐标(zubio)系统,使投影变换复位glMatrixMode(GL_PROJECTION);glLoadIdentity();/ 建立修剪空间的范围 if (w = h) glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0f, -1.0f); else glOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0f, -1.0f);glMatrixMode(GL_MODELVIEW);glLoa
15、dIdentity();/函数SetupRC用于初始化,常用来设置场景渲染状态void SetupRC(void)/ 设置窗口的清除色为白色 glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 第17页/共63页第十七页,共64页。void main(void) /初始化GLUT库OpenGL窗口的显示模式glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); / 创建一个名为GLRect的窗口glutCreateWindow(GLRect); / 设置当前窗口的显示回调函数和窗口再整形(zhng xng)回调函数glutDisplay
16、Func(RenderScene); glutReshapeFunc(ChangeSize); SetupRC();/启动主GLUT事件处理循环glutMainLoop();第18页/共63页第十八页,共64页。GLRect程序运行结果(ji gu) 第19页/共63页第十九页,共64页。2021-12-10201、画点、线和面、画点、线和面glBegin(GL_POINTS);glVertex3f(0.0f,0.0f,0.0f);glVertex3f(10.0f,10.0f,10.0f);glEnd(); 计算机中的图元只是把一组顶点计算机中的图元只是把一组顶点(dngdin)或顶点或顶点(
17、dngdin)列表解释为屏幕上绘制的某些形状,而顶列表解释为屏幕上绘制的某些形状,而顶点点(dngdin)是用函数是用函数glVertex3f来定义,该函数中来定义,该函数中的参数指明定义点的的参数指明定义点的x、y和和z坐标。坐标。 二、用二、用OpenGL绘图绘图(hu t)第20页/共63页第二十页,共64页。2021-12-1021模式图元类型GL_POINTS将指定的各个顶点用于创建单个的点GL_LINES将指定的顶点用于创建线段。每两个顶点指定一条单独的线段。如果顶点个数是奇数,则忽略最后一个GL_LINE_STRIP将指定的顶点用于创建线条。第一个顶点之后的每个顶点指定的是线条延
18、伸到的下一个点GL_LINE_LOOP特性和GL_LINE_STRIP相似,只不过最后一条线段是在指定的最后一个和第一个顶点之间绘制。典型情况下,这用于绘制那些可能违反了GL_POLYGON用法规则的封闭区域GL_TRIANGLES将指定的顶点用于构造三角形。每三个顶点指定一个新三角形。如果顶点个数不是三的倍数,多余的顶点将被忽略GL_TRIANGLE_STRIP将指定的顶点用于创建三角条。指定前三个顶点之后,后继的每个顶点与它前面两个顶点一起用来构造下一个三角形。每个顶点三元组(在最初的组之后)会自动重新排列以确保三角形绕法的一致性。GL_TRIANGLE_FAN将指定的顶点用于构造三角扇形
19、。第一个顶点充当原点,第三个顶点之后的每个顶点与它的前一个顶点还有原点一起组合。GL_QUADS每四个顶点一组用于构造一个四边形。如果顶点个数不是四的倍数,多余的顶点将被忽略GL_QUADS_STRIP将指定的顶点用于构造四条形边。在第一对顶点之后,每对顶点定义一个四边形。和GL_QUADS的顶点顺序不一样,每对顶点以指定顺序的逆序使用,以便保证绕法的一致GL_POLYGON将指定的顶点用于构造一个凸多边形。多边形的边缘决不能相交。最后一个顶点会自动连接到第一个顶点以确保多边形是封闭的第21页/共63页第二十一页,共64页。2021-12-1022(1)点的大小void glPointSize
20、(GLfloat size);GLfloat sizes2; /保存绘制点的尺寸范围(fnwi)GLfloat step; /保存绘制点尺寸的步长glGetFloarv(GL_POINT_SIZE_RANGE,sizes);glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step); (2)线宽void glLineWidth(GLfloat width) GLfloat sizes2; /保存线宽的尺寸范围(fnwi)GLfloat step; /保存线宽尺寸的最小间隔glGetFloarv(GL_LINE_WIDTH_RANGE,sizes);glGe
21、tFloatv(GL_LINE_WIDTH_GRANULARITY,&step); 第22页/共63页第二十二页,共64页。2021-12-1023(3)线型glEnable(GL_LINE_STIPPLE);glLineStipple(GLint factor,GLushort pattern); pattern是一个16位值,他指定了画线时所用的模式。每一位代表线段的一部分是开还是关。默认情况下,每一位对应一个象素,但factor参数充当倍数可以增加(zngji)模式的宽度。 在应用模式时,pattern是逆向使用的,即模式的最低有效位最先作用于指点线段。 patternfacto
22、r00FF1200FF第23页/共63页第二十三页,共64页。2021-12-10242、绕法与多边形模式、绕法与多边形模式 在绘制三角形的过程中,三个顶点将三角形封闭在绘制三角形的过程中,三个顶点将三角形封闭(fngb)的过程是有序的,即三角形的构成路径具有方的过程是有序的,即三角形的构成路径具有方向性,我们把指定顶点时顺序和方向的组合称为向性,我们把指定顶点时顺序和方向的组合称为“绕绕法法”。绕法是任何多边形图元的一个重要特性。一般默绕法是任何多边形图元的一个重要特性。一般默认情况下,认情况下,OpenGL认为逆时针绕法的多边形是正对着认为逆时针绕法的多边形是正对着的。的。 glFront
23、Face(GL_CW);glFrontFace(GL_CCW);第24页/共63页第二十四页,共64页。2021-12-1025函数glPolygonMode用于设定多边形模式: glPolygonMode(GLenum face,GLenum mode); 其中,参数face用于指定多边形的哪一个面受到模式改变的影响(GL_FRONT,GL_BACK或GL_FRONT_AND_BACK)。 参数mode用于指定新的绘图模式。GL_FILL是默认值,生成填充的多边形;GL_LINE生成多边形的轮廓(lnku);而GL_POINT只画出顶点。第25页/共63页第二十五页,共64页。2021-12
24、-10263、多边形颜色的设置、多边形颜色的设置 在在OpenGL中,颜色实际上是对各个顶点中,颜色实际上是对各个顶点(dngdin)而不是对各个多边形指定的。而不是对各个多边形指定的。(1)glShadeModel(GL_FLAT)告诉告诉OpenGL用指定多边用指定多边形最后一个顶点形最后一个顶点(dngdin)时的当前颜色作为填充多边时的当前颜色作为填充多边形的纯色,唯一例外是形的纯色,唯一例外是GL_POLYGON图元,它采用的图元,它采用的是第一个顶点是第一个顶点(dngdin)的颜色。的颜色。(2)glShadeModel(GL_SMOOTH)告诉告诉OpenGL从各个顶从各个顶点
25、点(dngdin)给三角形投上光滑的阴影,试图在为各个给三角形投上光滑的阴影,试图在为各个顶点顶点(dngdin)指定的颜色之间进行插值。指定的颜色之间进行插值。第26页/共63页第二十六页,共64页。 Gouraud Gouraud明暗处理通常算法明暗处理通常算法为:先用多边形顶点的光强线性为:先用多边形顶点的光强线性插值出当前扫描线与多边形边交插值出当前扫描线与多边形边交点处的光强,然后再用交点的光点处的光强,然后再用交点的光强线插值处扫描线位于多边形内强线插值处扫描线位于多边形内区段上每一象素处的光强值。采区段上每一象素处的光强值。采用用(ciyng)Gouraud(ciyng)Gour
26、aud明暗处理不明暗处理不但可以使用多边形表示的曲面光但可以使用多边形表示的曲面光强连续,而且计算量很小。强连续,而且计算量很小。第27页/共63页第二十七页,共64页。2021-12-10284、深度测试、深度测试 深度测试是一种移除被挡住表面的有效技术。深度测试是一种移除被挡住表面的有效技术。为了启用深度测试,只要调用:为了启用深度测试,只要调用:glEnable(GL_DEPTH_TEST);glDisable(GL_DEPTH_TEST);另外为了使深度缓冲区正常完成深度测试功能,另外为了使深度缓冲区正常完成深度测试功能,在每次渲染场景时,必须在每次渲染场景时,必须(bx)先清除深度缓
27、冲区:先清除深度缓冲区:glClear(GL_DEPTH_BUFFER_BIT);第28页/共63页第二十八页,共64页。2021-12-10295、多边形构造规则、多边形构造规则(1)所有多边形都必须是平面的。)所有多边形都必须是平面的。(2)第二条规则是多边形的边缘)第二条规则是多边形的边缘(binyun)决不能相决不能相交,而且多边形必须是凸的。交,而且多边形必须是凸的。解决:对于非凸多边形,可以把它分割成几个凸多边解决:对于非凸多边形,可以把它分割成几个凸多边形(通常是三角形),再将它绘制出来。形(通常是三角形),再将它绘制出来。问题:轮廓图形状态会看到组成大表面的所有小三角问题:轮廓
28、图形状态会看到组成大表面的所有小三角形。处理形。处理OpenGL提供了一个特殊标记来处理这些边提供了一个特殊标记来处理这些边缘缘(binyun),称为边缘,称为边缘(binyun)标记。标记。glEdgeFlag(True)glEdgeFlag(False)第29页/共63页第二十九页,共64页。1、 OpenGL中的变换中的变换 (1)视图变换:指定观察者或摄影机的位置;视图变换:指定观察者或摄影机的位置; (2)模型变换:在场景中移动对象;模型变换:在场景中移动对象; (3)模型视图变换:描述视图变换与模型变换的对偶性;模型视图变换:描述视图变换与模型变换的对偶性; (4)投影变换:对视见
29、空间投影变换:对视见空间(kngjin)进行修剪和改变大进行修剪和改变大小;小; (5)视见区变换:对窗口的最终输出进行缩放;视见区变换:对窗口的最终输出进行缩放;三、图形三、图形(txng)的变换的变换 第30页/共63页第三十页,共64页。 2、模型视图、模型视图(sht)矩阵矩阵(1)平移)平移 void glTranslated(f)(GLdouble x,GLdouble y,GLdouble z); (2)旋转)旋转void glRotated(f)(GLdouble angle,GLdouble x,GLdouble y,GLdouble z ); (3)比例)比例 void g
30、lScaled(f)(GLdouble x,GLdouble y,GLdouble z);第31页/共63页第三十一页,共64页。矩阵矩阵(j zhn)(j zhn)的操作的操作glMatrixMode(GLenum mode)glMatrixMode(GLenum mode);参数参数modemode用于确定将哪个矩阵用于确定将哪个矩阵(j zhn)(j zhn)堆栈用于矩阵堆栈用于矩阵(j zhn)(j zhn)操作。操作。GL_MODELVIEWGL_MODELVIEW:模型视图矩阵:模型视图矩阵(j zhn)(j zhn)堆栈堆栈GL_PROJECTIONGL_PROJECTION:投
31、影矩阵:投影矩阵(j zhn)(j zhn)堆栈堆栈GL_TEXTUREGL_TEXTURE:纹理矩阵:纹理矩阵(j zhn)(j zhn)堆栈堆栈 第32页/共63页第三十二页,共64页。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();第33页/共63页第三十三页,共64页。4、矩阵
32、堆栈、矩阵堆栈 OpenGL为模型为模型(mxng)视图矩阵和投影矩阵各视图矩阵和投影矩阵各维护着一个维护着一个“矩阵堆栈矩阵堆栈”,可以把当前矩阵压到堆,可以把当前矩阵压到堆栈中保存它,然后对当前矩阵进行修改。把矩阵弹栈中保存它,然后对当前矩阵进行修改。把矩阵弹出堆栈即可恢复。使用的函数如下:出堆栈即可恢复。使用的函数如下:void glPushMatrix(void);void glPopMatrix(void);第34页/共63页第三十四页,共64页。5、投影变换、投影变换 OpenGL中只提供中只提供(tgng)了两种投影方式,一了两种投影方式,一种是平行投影(正射投影),另一种是透视
33、投影。在种是平行投影(正射投影),另一种是透视投影。在投影变换之前必须指定当前处理的是投影变换矩阵:投影变换之前必须指定当前处理的是投影变换矩阵:glMAtrixMode(GL_PROJECTION); glLoadIdentity();第35页/共63页第三十五页,共64页。(1)平行投影)平行投影 平行投影,它的视景体是一个矩形的平行管道,也平行投影,它的视景体是一个矩形的平行管道,也就是一个长方体,其特点是无论物体距离相机多远,投影就是一个长方体,其特点是无论物体距离相机多远,投影后的物体大小尺寸不变。后的物体大小尺寸不变。void glOrtho (GLdouble left,GLdo
34、uble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);这个函数的操作是创建这个函数的操作是创建(chungjin)一个正射投影矩阵,一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。并且用这个矩阵乘以当前矩阵。第36页/共63页第三十六页,共64页。void gluOrtho2D (GLdouble left,GLdouble right,GLdouble bottom,GLdouble top); 它是一个特殊的正射投影函数,主要用于二维它是一个特殊的正射投影函数,主要用于二维图像图像(t xin)到二维屏幕上的投
35、影。它的到二维屏幕上的投影。它的near和和far缺省值分别为缺省值分别为-1.0和和1.0,所有二维物体的,所有二维物体的Z坐标都为坐标都为0.0。因此它的裁剪面是一个左下角点为(。因此它的裁剪面是一个左下角点为(left,bottom)、右上角点为()、右上角点为(right,top)的矩形。)的矩形。 第37页/共63页第三十七页,共64页。(2)透视投影)透视投影 void glFrustum (GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);此函数创建一个透视投
36、影矩阵,并且用这个矩阵乘此函数创建一个透视投影矩阵,并且用这个矩阵乘以当前矩阵。它的参数只定义近裁剪平面的左下角点和以当前矩阵。它的参数只定义近裁剪平面的左下角点和右上角点的三维空间坐标,即(右上角点的三维空间坐标,即(left,bottom,-near)和(和(right,top,-near);最后一个参数);最后一个参数far是远裁剪平是远裁剪平面的面的Z负值负值(f zh),其左下角点和右上角点空间坐标由,其左下角点和右上角点空间坐标由函数根据透视投影原理自动生成。函数根据透视投影原理自动生成。第38页/共63页第三十八页,共64页。void gluPerspective (GLdoub
37、le fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar);它也创建它也创建(chungjin)一个对称透视视景体,但它一个对称透视视景体,但它的参数定义于前面的不同,其操作是创建的参数定义于前面的不同,其操作是创建(chungjin)一个对称的透视投影矩阵,并且用这个矩阵乘以当前一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵。参数矩阵。参数fovy定义视野在定义视野在X-Z平面(垂直方向上的可平面(垂直方向上的可见区域)的角度,范围是见区域)的角度,范围是0.0, 180.0;参数;参数aspect是投是投影平面的纵横比(宽度与高度的比值
38、);参数影平面的纵横比(宽度与高度的比值);参数zNear和和Far分别是远近裁剪面沿分别是远近裁剪面沿Z负轴到视点的距离。负轴到视点的距离。 第39页/共63页第三十九页,共64页。第40页/共63页第四十页,共64页。6、高级矩阵、高级矩阵(j zhn)处理处理 glfloat m = 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);glLoadMatrixf(m);第41页/共63页第四十一
39、页,共64页。 当光照射到一个物体表面上时,会出现三种情形。首先,光可以通过物体表面向空间反射(fnsh),产生反射(fnsh)光。其次,对于透明体,光可以穿透该物体并从另一端射出,产生透射光。最后,部分光将被物体表面吸收而转换成热。在上述三部分光中,仅仅是透射光和反射(fnsh)光能够进入人眼产生视觉效果。 四、四、光照处理光照处理第42页/共63页第四十二页,共64页。(1)环境光()环境光(Ambient Light) 环境光不来自于任何特殊的方向环境光不来自于任何特殊的方向(fngxing),他有,他有光源,但是被周围的房间或场景多次反射,以致于变光源,但是被周围的房间或场景多次反射,
40、以致于变得没有方向得没有方向(fngxing)。被环境光照射的物体表面的。被环境光照射的物体表面的各个方向各个方向(fngxing)都均等受光。都均等受光。(2)散射光()散射光(Diffuse Light) 光来自某个方向光来自某个方向(fngxing),被物体表面均匀地反,被物体表面均匀地反射。光是被均匀反射回去的,它直射的物体表面比从射。光是被均匀反射回去的,它直射的物体表面比从某个角度照射过来时要亮。某个角度照射过来时要亮。第43页/共63页第四十三页,共64页。(3 3)镜面光()镜面光( Specular Light Specular Light ) 镜面光也有方向性,但被强烈地反
41、射到另一特定的镜面光也有方向性,但被强烈地反射到另一特定的方向。高亮度的镜面光能够在被照射的物体表面上产生方向。高亮度的镜面光能够在被照射的物体表面上产生(chnshng)(chnshng)称之为亮斑的亮点。称之为亮斑的亮点。 任何一个光源都是由环境光、散射光和镜面光三种任何一个光源都是由环境光、散射光和镜面光三种光照成分组成,各成分的定义是由光照成分组成,各成分的定义是由RGBARGBA值定义的。值定义的。第44页/共63页第四十四页,共64页。5. 5. 材质材质 OpenGL OpenGL用材料对光的红、绿、蓝三原色的反射率用材料对光的红、绿、蓝三原色的反射率来近似定义材料的颜色。象光源
42、一样来近似定义材料的颜色。象光源一样(yyng)(yyng),材料,材料颜色也分成环境、漫反射和镜面反射成分,它们决定颜色也分成环境、漫反射和镜面反射成分,它们决定了材料对环境光、漫反射光和镜面反射光的反射程度。了材料对环境光、漫反射光和镜面反射光的反射程度。 在进行光照计算时,材料对环境光的反射率与每个在进行光照计算时,材料对环境光的反射率与每个进入光源的环境光结合,对漫反射光的反射率与每个进入光源的环境光结合,对漫反射光的反射率与每个进入光源的漫反射光结合,对镜面光的反射率与每个进入光源的漫反射光结合,对镜面光的反射率与每个进入光源的镜面反射光结合。进入光源的镜面反射光结合。 第45页/共
43、63页第四十五页,共64页。 材质的颜色实际决定了反射光与入射光的百分比率:若OpenGL的光源颜色为(LR、LG、LB),材质颜色属性(shxng)为(MR、MG、MB)。那么,最终到达眼睛的光的颜色为 (LR*MR、LG*MG、LB*MB) 三种光照成分的RGBA值叠加就形成了物体最终的颜色。当任何一种颜色成分大于1.0,就用1.0计算。第46页/共63页第四十六页,共64页。6. 加入光照(1)glEnable(GL_LIGHTING) 指定OpenGL可以利用(lyng)材质属性和光照参数决定场景中每个顶点的颜色。第47页/共63页第四十七页,共64页。(2)glLightModelf
44、v(f,i,iv)(Glenum pname, const GLfloat *param) 指定光照模型GL_LIGHT_MODEL_AMBIENT:设置环境光GL_LIGHT_MODEL_LOCAL_VIEWER:定义视点,0表示镜面反射角度认为视线方向平行于z轴负向,否则镜面反射从视点坐标系的原点来计算(j sun)。GL_LIGHT_MODEL_TWO_SIDE:启用双面关照,0.0时表示只有多边形表面的正面进行光照计算(j sun),否则正反两面都进行光照计算(j sun)。第48页/共63页第四十八页,共64页。(3)glMaterialfv(GLenum face, GLenum
45、pname, const GLfloat *params) Face参数:GL_FRONT;GL_BACK;GL_FRONT_AND_BACK。Pname参数:GL_AMBIENT:材质(ci zh)环境反射RGBA值。GL_DIFFUSE:材质(ci zh)漫反射RGBA值。GL_SPECULAR:材质(ci zh)镜面反射RGBA值。GL_SHININESS:材质(ci zh)的RGBA镜面指数。第49页/共63页第四十九页,共64页。(4)glEnable(GL_COLOR_MATERIAL) 启用颜色跟踪法,此时可以通过(tnggu)glColor设置材质属性。(5)glColorMa
46、terial(Glenum face,Glenum mode)mode:指定哪个材质属性能够遵循当前的颜色。GL_EMISSION;GL_AMBIENT;GL_DIFFUSE;GL_SPECULAR;GL_AMBIENT_AND_DIFFUSE。第50页/共63页第五十页,共64页。7. 7. 使用点光源使用点光源 OpenGL OpenGL支持支持8 8种独立光源,它们可以放置种独立光源,它们可以放置(fngzh)(fngzh)在场景中的任意位置,也可放在视见空间之外。当将在场景中的任意位置,也可放在视见空间之外。当将光源放在无穷远处就可以得到平行的光线。光源放在无穷远处就可以得到平行的光线
47、。 光源发射光线射到多边形的表面,与平面成角度光源发射光线射到多边形的表面,与平面成角度A A,在以角度在以角度B B反射进入观察者,通过这些角度可以计算反射进入观察者,通过这些角度可以计算光线照射的多边形表面的颜色。光线照射的多边形表面的颜色。 OpenGL OpenGL有意让计算的位置就是多边形的顶点。通有意让计算的位置就是多边形的顶点。通过计算各个顶点的颜色,再在各个顶点间进行光滑着过计算各个顶点的颜色,再在各个顶点间进行光滑着色。色。第51页/共63页第五十一页,共64页。(1 1)法线矢量)法线矢量 从假想从假想(jixing)(jixing)的平面(或者是多边形)上的一个的平面(或
48、者是多边形)上的一个顶点引出来的一条垂直向上的线称为法线矢量。顶点引出来的一条垂直向上的线称为法线矢量。 glNormal3f(GLfloat x, GLfloat y, GLfloat z) glNormal3f(GLfloat x, GLfloat y, GLfloat z) 指定法指定法线矢量。线矢量。 OpenGL OpenGL最后都将表面法线转化成单位法线,对于最后都将表面法线转化成单位法线,对于光照计算,所有的法线矢量都必须归一化。光照计算,所有的法线矢量都必须归一化。glEnable(GL_NORMALIZE)glEnable(GL_NORMALIZE)glEnable(GL_R
49、ESCALE_NORMALS)glEnable(GL_RESCALE_NORMALS) 法线矢量的计算法线矢量的计算第52页/共63页第五十二页,共64页。(2 2)设置)设置(shzh)(shzh)光源参数光源参数glLightf(GLenum light,GLenum pname,GLenum param)glLightf(GLenum light,GLenum pname,GLenum param) light: light:光源编号光源编号 pname:指定光源(gungyun)参数类型GL_AMBIENT:光照的环境RGBA浓度。GL_DIFFUSE:光照的漫射RGBA浓度。GL_S
50、PECULAR:光照的镜面RGBA浓度。第53页/共63页第五十三页,共64页。(3 3) 镜面光处理镜面光处理 使用使用glLightfvglLightfv函数在光源中加入镜面光成分,为了出现函数在光源中加入镜面光成分,为了出现镜面光效果,还要在材质属性中增加镜面成分。镜面光效果,还要在材质属性中增加镜面成分。镜面指数:镜面指数: glMateriali(GL_FRONT,GL_SHININESS,128) glMateriali(GL_FRONT,GL_SHININESS,128);GL_SHININESSGL_SHININESS属性设置材质的镜面指数,它说明如何属性设置材质的镜面指数,它
51、说明如何确定镜面关亮斑的大小和聚焦确定镜面关亮斑的大小和聚焦(jjio)(jjio)程度。程度。第54页/共63页第五十四页,共64页。(4 4)光的衰减)光的衰减 真实的光,离光源真实的光,离光源(gungyun)(gungyun)越远则光强越小。越远则光强越小。OpenGLOpenGL的光衰减是通过光源的光衰减是通过光源(gungyun)(gungyun)的发光量乘以衰的发光量乘以衰减因子计算出来的。缺省状态下,常数衰减因子是(减因子计算出来的。缺省状态下,常数衰减因子是(1.01.0,0.00.0,0.00.0)。用户也可以自己定义这些值,如:)。用户也可以自己定义这些值,如:glLig
52、htf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,2.0);glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,2.0);glLightf(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); 注意:环境光、漫反射光和镜面光的强度
53、都衰减,只注意:环境光、漫反射光和镜面光的强度都衰减,只有辐射光和全局环境光的强度不衰减。有辐射光和全局环境光的强度不衰减。第55页/共63页第五十五页,共64页。(5)聚光和多光源 定位(dngwi)光源可以定义成聚光灯形式,即将光的形状限制在一个圆锥内。OpenGL中聚光的定义有以下几步: a)定义聚光源位置。因为聚光源也是定向光源,所以他的位置同一般定向光一样。如: GLfloat light_pos =1.0,1.0,1.0,1.0; glLightfv(GL_LIGHT0,LIGHT_POSITION,light_pos); light_pos参数的最后一个分量为0,则光源为方向光源,分量为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理教师教学研究方法
- 护理职业规划与职业发展
- 护理科研中的数据分析
- 护理沟通中的患者满意度
- 卧床患者皮肤护理预防压疮
- 基于生物技术的药物研发进展报告
- 快递物流部门经理面试技巧
- 急诊科急救技术及流程优化研究
- 护理不良事件沟通机制
- 快消品企业销售部经理面试指南
- 2025年公务员多省联考《申论》(云南县乡卷)题及参考答案(网友回忆版)
- (完整)24个专业105个病种中医临床路径
- 高职院校学生学业规划模板
- 机械制造技术题库含参考答案
- 中央空调故障应急预案
- (2025修订版)CAAC无人机理论考试题库资料及参考答案
- 配料机pld1200YT1200c使用说明书
- 医学美容科室介绍
- 水电消防安装培训课件
- 大学动漫制作技术专业介绍
- 事业单位面试考官考试试题及答案
评论
0/150
提交评论