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