《计算机图形学》PPT课件.ppt
《《计算机图形学》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《计算机图形学》PPT课件.ppt(167页珍藏版)》请在三一办公上搜索。
1、OpenGL,OpenGL,什么是OpenGL?OpenGL是一个功能强大的开放图形库(Open Graphics Library)。其前身是SGI公司为其图形工作站开发的IRIS GL。为使其能够更加容易地移植到不同的硬件和操作系统,SGI开发了OpenGL。OpenGL被打造为开放性标准,任何软硬件厂商均可自由使用,这让它受到广泛的欢迎。,2,背景1992年7月,SGI正式发布OpenGL 1.0标准。OpenGL 1.0完全实现了SGI的预期设计目标:功能强大、移植性良好并能自由使用。SGI和微软进行首次合作、联手将OpenGL 1.0移植到Windows NT平台。OpenGL规范由A
2、RB(Architecture Review Broad)管理,成员为SGI、MS、intel、IBM、Sun等公司。2003年的7月,ARB公布OpenGL 1.5规范迄今为止最新的OpenGL版本。支持各种操作系统和编程环境。,3,从程序开发人员的角度来看,OpenGL是一组绘图命令的API集合。利用这些API能够方便地描述二维和三维几何物体,并控制这些物体按某种方式绘制到显示缓冲区中。主要功能:绘制模型:点线多边形、球、锥、多面体、茶壶、贝塞尔曲线各种变换:基本变换(平移、缩放、旋转、镜像)、平行投影、透视投影着色模式:RGBA(alpha),颜色索引,4,主要功能:光照处理:材质,辐射
3、光、环境光、漫反射光等,5,主要功能:纹理映射:纹理数据包括颜色、亮度和alpha,真实感纹理,6,主要功能:位图和图像制作动画:双缓存,后台缓存用于计算场景和生成画面,前台缓存用于显示画面,产生平滑动画选择和反馈,7,OpenGL的绘制流程和原理:,评价器:顶点转换、光照设置基片:一系列图像的帧缓存描述值,演示程序,8,OpenGL能做什么?,OpenGL怎样学?,函数很多,先以模仿为主,熟能生巧,1顶点坐标 OpenGL采用有序排列的顶点集合来构造几何图元。如:glVertex2s(2,5);/整数定义的二维坐标 glVertex3f(2,5,7);/浮点定义的三维坐标 顶点关系在Open
4、GL中,同一个几何图元的所有被定义的顶点一起放在glBegin()和glEnd()函数之间,同时定义这些顶点之间的关系。如:glBegin(GL_POLYGON);glVertex2s(0,0);glVertex2s(0,11);glVertex2s(11,14);glVertex2s(14,7);glEnd();,11,GL_POINTS 单个顶点集GL_LINES 多组双顶点线段GL_POLYGON 单个简单填充凸多边形GL_TRAINGLES 多组独立填充三角形GL_QUADS 多组独立填充四边形GL_LINE_STRIP 不闭合折线GL_LINE_LOOP 闭合折线GL_TRAINGL
5、E_STRIP 线型连续填充三角形串GL_TRAINGLE_FAN 扇形连续填充三角形串GL_QUAD_STRIP连续填充四边形串,12,1、用OpenGL生成点 glPointSize(2.0f);glBegin(GL_POINTS);glVertex2f(0.0,0.0);glVertex3f(0.0f,0.0f,0.3f);glEnd();,13,2、用OpenGL生成直线glLineWidth(2.0f)glLineStipple,线形用16位二进制描述,如表示点线,编程时转为十六进制 glEnable(GL_LINE_STIPPLE);glLineStipple(2,0 x00FF)
6、;,14,3、用OpenGL生成区域填充区域图形绘制GL_POLYGON实模式填充点画模式(图案32*32)填充glEnable(GL_POLYGON_STIPPLE);glPolygonStipple(fly);glRectf(-0.3,-0.6,0.0,0.0);glDisable(GL_POLYGON_STIPPLE);,15,3、用OpenGL生成区域填充多边形面的绘制多边形是三维的,被认为由正反两个面组成多边形面的控制 void glPolygonMode(GLenum face,GLenum mode)face控制是否绘制正反面:GL_FRONT_AND_BACKGL_FRONT;
7、GL_BACKmode控制绘制方式:GL_POINT用一定间隔的点填充;GL_LINE只画多边形的边框;GL_FILL填充多边形例:glPolygonMode(GL_FRONT,GL_FILL)glPolygonMode(GL_BACK,GL_LINE),16,3、用OpenGL生成区域填充多边形面的绘制多边形面的定义 void glFrontFace(GLenum mode)mode:GL_CW;GL_CCW(逆时针,默认)多边形面的剔除void glCullFace(GLenum mode)mode:GL_FRONT,剔除正面GL_BACK,剔除背面GL_FRONT_AND_BACK,剔除
8、全部需要glEnable(GL_CULL_FACE)激活和glDisable(GL_CULL_FACE)去活,17,3、用OpenGL生成区域填充多边形面的绘制多边形面的法向量 面在空间中的方向,决定可以接收多少光照glNormal*()设置当前法向量。void glNormal3bsidf(TYPE nx,TYPE ny,TYPE nz);void glNormal3bsidfv(const TYPE*v);法向量需要由用户计算并显式指定。,18,4、用OpenGL生成字符英文字体位图字体速度快定位glRasterPos()轮廓字体多边形填充有利于拉伸、缩放等变换纹理映射字体街道、墙面的标记
9、wglUseFontBitmaps(wglGetCurrentDC(),0,256,1000);glListBase(1000);glRasterPos3f(-0.5f,0.0f,0.0f);glCallLists(20,GL_UNSIGNED_BYTE,”Draw with List Text.”),19,4、用OpenGL生成字符中文字体(1)用wglUseFontBitmaps或wglUseOutlines为每个字生成一个List。(2)为每个字调用glCallList或为每个字串调用glCallLists问题一:汉字字体个数太多,不能一次全部读入建立清单,相当于字体缓存,用到的字体才加
10、进来问题二:汉字为双字节组合为DWORD传给wglUseFont*(),20,OpenGL的缓存(Buffer)1 颜色缓存(Color Buffer):颜色索引或者RGBA数据,前、后缓存;2 深度缓存(Depth Buffer):保存象素Z方向的数值,深度大的被深度小的代替,用以实现消隐;3 模板缓存(Stencil Buffer):用以保持屏幕上某些位置图形不变,而其他部分重绘。例如大家熟悉的开飞机和赛车的游戏的驾驶舱视角,只有挡风外面的景物变化,舱内仪表等等并不变化。4 累计缓存(Accumulation Buffer)只保存RGBA数据,用于合成图象,例如有某缓存中的位图调入这里合成
11、一幅新图。,21,安装GLUT工具包GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。Windows环境下安装GLUT的步骤:1、将下载的压缩包解开,将得到5个文件2、在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是VisualStudio6.0,则应该是其安装目录下面的“VC98IncludeGL文件夹”)。把解压得到的glut.h放到这个文件夹。3、把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹(如果是VisualStudio6.0,则应该是其安装目录下面的“VC98Lib”文件夹)。4、把解压得到的glut.dll和gl
12、ut32.dll放到操作系统目录下面的system32文件夹内。(典型的位置为:C:WindowsSystem32),使用VC开发OpenGL程序的基本方法,22,建立一个OpenGL工程这里以VisualStudio为例。选择File-New-Project,然后选择Win32 Console Application,选择一个名字,然后按OK。在谈出的对话框左边点Application Settings,找到A Hello,World!application并勾上,选择Finish。,23,第一个OpenGL程序#include void myDisplay(void)glClear(GL_
13、COLOR_BUFFER_BIT);glRectf(-0.5f,-0.5f,0.5f,0.5f);glFlush();int main(int argc,char*argv)glutInit(该程序的作用是在一个黑色的窗口中央画一个白色的矩形。,24,首先,需要包含头文件#include,这是GLUT的头文件。本来OpenGL程序一般还要包含和,但GLUT的头文件中已经自动将这两个文件包含了,不必再次包含。int main(int argc,char*argv),是带命令行参数的main函数注意main函数中的各语句,除了最后的return之外,其余全部以glut开头。这种以glut开头的函数
14、都是GLUT工具包所提供的函数,下面对用到的几个函数进行介绍。1、glutInit,对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。其格式比较死板,一般照抄这句glutInit(&argc,argv)就可以了。2、glutInitDisplayMode,设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。更多信息,请Google一下。3、glutInitWindowPosition,设置窗口在屏幕中的位置。4、glutInitW
15、indowSize,设置窗口的大小。,25,5、glutCreateWindow,根据前面设置的信息创建窗口。参数将被作为窗口的标题。注意:窗口被创建后,并不立即显示到屏幕上。需要调用glutMainLoop才能看到窗口。6、glutDisplayFunc,设置一个函数,当需要进行画图时,这个函数就会被调用。7、glutMainLoop,进行一个消息循环。这个函数可以显示窗口,并且等待窗口关闭后才会返回。在glutDisplayFunc函数中,设置了“当需要画图时,请调用myDisplay函数”。于是myDisplay函数就用来画图。观察myDisplay中的三个函数调用,发现它们都以gl开头
16、。这种以gl开头的函数都是OpenGL的标准函数:1、glClear,清除。GL_COLOR_BUFFER_BIT表示清除颜色,glClear函数还可以清除其它的东西。2、glRectf,画一个矩形。四个参数分别表示了位于对角线上的两个点的横、纵坐标。3、glFlush,保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待)。,26,点、直线和多边形数学中有点、直线和多边形的概念,但这些概念在计算机中会有所不同。数学上的点,只有位置,没有大小。但在计算机中,无论计算精度如何提高,始终不能表示一个无穷小的点。另一方面,无论图形输出设备(例如显示器)如何精确,始终不能输出一个无穷小的点。
17、一般情况下,OpenGL中的点将被画成单个的像素,虽然它可能足够小,但并不会是无穷 小。同一像素上,OpenGL可以绘制许多坐标只有稍微不同的点,但该像素的具体颜色将取决于OpenGL的实现。同样的,数学上的直线没有宽度,但OpenGL的直线则是有宽度的。同时,OpenGL的直线必须是有限长度,而不是像数学概念那样是无限的。可以认为,OpenGL的“直线”概念与数学上的“线段”接近,它可以由两个端点来确定。,27,多边形是由多条线段首尾相连而形成的闭合区域。OpenGL规定,一个多边形必须是一个“凸多边形”(其定义为:多边形内任意两点所确定的线段都在多边形内)。多边形可以由其边的端点(这里可称
18、为顶点)来确定。(注意:如果使用的多边形不是凸多边形,则最后输出的 效果是未定义的OpenGL为了效率,放宽了检查,这可能导致显示错误。要避免这个错误,尽量使用三角形,因为三角形都是凸多边形)可以想象,通过点、直线和多边形,就可以组合成各种几何图形。甚至于,可以把一段弧看成是很多短的直线段相连,这些直线段足够短,以至于其长度小于一个像素的宽度。这样一来弧和圆也可以表示出来了。通过位于不同平面的相连的小多边形,还可以组成一个“曲面”。,在OpenGL中指定顶点由以上的讨论可以知道,“点”是一切的基础。如何指定一个点呢?OpenGL提供了一系列函数。它们都以glVertex开头,后面跟一个数字和1
19、2个字母。例如:glVertex2d glVertex2f glVertex3f glVertex3fv数字表示参数的个数,2表示有两个参数,3表示三个字母表示参数的类型s表示16位整数(OpenGL中将这个类型定义为GLshort)i表示32位整数(OpenGL中将这个类型定义为GLint和GLsize)f表示32位浮点数(OpenGL中将这个类型定义为GLfloat和GLclampf)d表示64位浮点数(OpenGL中将这个类型定义为GLdouble和GLclampd)v表示传递的几个参数将使用指针的方式,29,这些函数除了参数的类型和个数不同以外,功能是相同的。例如,以下五个代码段的功能
20、是等效的:(一)glVertex2i(1,3);(二)glVertex2f(1.0f,3.0f);(三)glVertex3f(1.0f,3.0f,0.0f);(四)glVertex4f(1.0f,3.0f,0.0f,1.0f);(五)GLfloat VertexArr3=1.0f,3.0f,0.0f;glVertex3fv(VertexArr3);注意:OpenGL的很多函数都是采用这样的形式,一个相同的前缀再加上参数说明标记,这一点会随着学习的深入而有更多的体会。,假设现在已经指定了若干顶点,那么OpenGL是如何知道拿这些顶点来干什么呢?是一个一个的画出来,还是连成线?或者构成一个多边形?
21、或者做其它什么事情?为了解决这一问题,OpenGL要求:指定顶点的命令必须包含在glBegin函数之后,glEnd函数之前(否则指定的顶点将被忽略)。并由glBegin来指明如何使用这些点。例如:glBegin(GL_POINTS);glVertex2f(0.0f,0.0f);glVertex2f(0.5f,0.0f);glEnd();则这两个点将分别被画出来。如果将GL_POINTS替换成GL_LINES,则两个点将被认为是直线的两个端点,OpenGL将会画出一条直线。我们还可以指定更多的顶点,然后画出更复杂的图形。,31,另一方面,glBegin支持的方式除了GL_POINTS和GL_LI
22、NES,还有GL_LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN等,每种方式的大致效果:,程序代码:void myDisplay(void)glClear(GL_COLOR_BUFFER_BIT);glBegin(/*在这里填上你所希望的模式*/);/*在这里使用glVertex*系列函数*/*指定你所希望的顶点位置*/glEnd();glFlush();,32,例一、画一个圆正四边形,正五边形,正六边形,直到正n边形,当n越大时,这个图形就越接近圆,当n大到一定程度后,人眼将无法把它跟真正的圆相区别
23、,这时我们已经成功的画出了一个“圆”#include const int n=20;const GLfloat R=0.5f;const GLfloat Pi=3.1415926536f;void myDisplay(void)int i;glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_POLYGON);for(i=0;in;+i)glVertex2f(R*cos(2*Pi/n*i),R*sin(2*Pi/n*i);glEnd();glFlush();试修改下面的const int n的值,观察当n=3,4,5,8,10,15,20,30,50等不同数值时输出的
24、变化情况,将GL_POLYGON改为GL_LINE_LOOP、GL_POINTS等其它方式,观察输出的变化情况,33,例二、画一个五角星#include const GLfloat Pi=3.1415926536f;void myDisplay(void)GLfloat a=1/(2-2*cos(72*Pi/180);GLfloat bx=a*cos(18*Pi/180);GLfloat by=a*sin(18*Pi/180);GLfloat cy=-a*cos(18*Pi/180);GLfloat PointA2=0,a,PointB2=bx,by,PointC2=0.5,cy,PointD
25、2=-0.5,cy,PointE2=-bx,by;,34,glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_LINE_LOOP);glVertex2fv(PointA);glVertex2fv(PointC);glVertex2fv(PointE);glVertex2fv(PointB);glVertex2fv(PointD);glEnd();glFlush();,例三、画出正弦函数的图形#include const GLfloat factor=0.1f;void myDisplay(void)GLfloat x;glClear(GL_COLOR_BUFFER_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机图形学 计算机 图形学 PPT 课件
链接地址:https://www.31ppt.com/p-5604219.html