OpenGL游戏程序设计ppt.ppt
![资源得分’ 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)
《OpenGL游戏程序设计ppt.ppt》由会员分享,可在线阅读,更多相关《OpenGL游戏程序设计ppt.ppt(144页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、OpenGL游戏程序设计第一章OpenGL概述一、OpenGL的特点1、与C语言紧密结合。OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。2、强大的可移植性微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL的基本命
2、令都做到了硬件无关,甚至是平台无关。3、高性能的图形渲染。OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先OpenGL程序准备工作第一步,选择一个编译环境现在Windows系统的主流编译环境有VisualStudio,BrolandC+Builder等都是支持OpenGL的。但这里我们选择VisualC+作为学习OpenGL的环境。第二步,安装GLUT工具包GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。Windows环境下安装GLUT的步骤:1、将下载的压缩包解开,将得到5个
3、文件2、在“我的电脑”中搜索“gl.h”,并找到其所在文件夹。把解压得到的glut.h放到这个文件夹。3、把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹(如果是VisualC+,则应该是其安装目录下面的“VClib”文件夹)。4、把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。(典型的位置为:C:WindowsSystem32)第三步,建立一个OpenGL工程这里以VisualC+6.0为例。选择File-New-Project,然后选择Win32ConsoleApplication,选择一个名字,然后按OK。在谈出
4、的对话框左边点ApplicationSettings,找到Emptyproject并勾上,选择Finish。然后向该工程添加一个代码文件。第一个OpenGL程序见文本文件“第一个OpenGL文本文件”第二章基本图元绘制OpenGL函数形式OpenGL函数通常以gl开头,中间是函数相关功能单词,后面跟一个数字和12个字母。例如:glVertex2dglVertex2fglVertex3fglVertex3fv数字表示参数的个数,2表示有两个参数,3表示三个,4表示四个字母表示参数的类型:s表示16位整数(OpenGL中将这个类型定义为GLshort);i表示32位整数(OpenGL中将这个类型定
5、义为GLint和GLsizei);f表示32位浮点数(OpenGL中将这个类型定义为GLfloat和GLclampf);d表示64位浮点数(OpenGL中将这个类型定义为GLdouble和GLclampd)。v表示传递的几个参数将使用指针的方式,见下面的例子。这些函数除了参数的类型和个数不同以外,功能是相同的。例如,以下五个代码段的功能是等效的:(一)glVertex2i(1,3);(二)glVertex2f(1.0f,3.0f);(三)glVertex3f(1.0f,3.0f,0.0f);(四)glVertex4f(1.0f,3.0f,0.0f,1.0f);(五)GLfloatVertexA
6、rr3=1.0f,3.0f,0.0f;glVertex3fv(VertexArr3);OpenGL要求:指定顶点的命令必须包含在glBegin函数之后,glEnd函数之前(否则指定的顶点将被忽略)。并由glBegin来指明如何使用这些点。例如:glBegin(GL_POINTS);glVertex2f(0.0f,0.0f);glVertex2f(0.5f,0.0f);glEnd();则这两个点将分别被画出来。如果将GL_POINTS替换成GL_LINES,则两个点将被认为是直线的两个端点,OpenGL将会画出一条直线。glBegin支持的方式除了GL_POINTS和GL_LINES,还有GL_
7、LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN等,每种方式的大致效果见下图:程序代码:voidmyDisplay(void)glClear(GL_COLOR_BUFFER_BIT);glBegin(/*在这里填上你所希望的模式*/);/*在这里使用glVertex*系列函数*/*指定你所希望的顶点位置*/glEnd();glFlush();三个课堂练习,见三个相关文本文件第三章图元绘制的深入1、关于点点的大小默认为1个像素,但也可以改变之。改变的命令为glPointSize,其函数原型如下:voidg
8、lPointSize(GLfloatsize);size必须大于0.0f,默认值为1.0f,单位为“像素”。注意:对于具体的OpenGL实现,点的大小都有个限度的,如果设置的size超过最大值,则设置可能会有问题。voidmyDisplay(void)glClear(GL_COLOR_BUFFER_BIT);glPointSize(5.0f);glBegin(GL_POINTS);glVertex2f(0.0f,0.0f);glVertex2f(0.5f,0.5f);glEnd();glFlush();2、关于直线(1)直线可以指定宽度:voidglLineWidth(GLfloatwidth
9、);其用法跟glPointSize类似。(2)画虚线。首先,使用glEnable(GL_LINE_STIPPLE);来启动虚线模式(使用glDisable(GL_LINE_STIPPLE)可以关闭之)。然后,使用glLineStipple来设置虚线的样式。voidglLineStipple(GLintfactor,GLushortpattern);pattern是由1和0组成的长度为16的序列,从最低位开始看,如果为1,则直线上接下来应该画的factor个点将被画为实的;如果为0,则直线上接下来应该画的factor个点将被画为虚的。voidmyDisplay(void)glClear(GL_C
10、OLOR_BUFFER_BIT);glEnable(GL_LINE_STIPPLE);glLineStipple(2,0 x0F0F);glLineWidth(10.0f);glBegin(GL_LINES);glVertex2f(0.0f,0.0f);glVertex2f(0.5f,0.5f);glEnd();glFlush();3、关于多边形(1)多边形的两面以及绘制方式。虽然我们目前还没有真正的使用三维坐标来画图,但是建立一些三维的概念还是必要的。从三维的角度来看,一个多边形具有两个面。每一个面都可以设置不同的绘制方式:填充、只绘制边缘轮廓线、只绘制顶点,其中“填充”是默认的方式。可以为
11、两个面分别设置不同的方式。glPolygonMode(GL_FRONT,GL_FILL);/设置正面为填充方式glPolygonMode(GL_BACK,GL_LINE);/设置反面为边缘绘制方式glPolygonMode(GL_FRONT_AND_BACK,GL_POINT);/设置两面均为顶点绘制方式(2)反转一般约定为“顶点以逆时针顺序出现在屏幕上的面”为“正面”,另一个面即成为“反面”。生活中常见的物体表面,通常都可以用这样的“正面”和“反面”,“合理的”被表现出来(请找一个比较透明的矿泉水瓶子,在正对你的一面沿逆时针画一个圆,并标明画的方向,然后将背面转为正面,画一个类似的圆,体会一
12、下“正面”和“反面”。你会发现正对你的方向,瓶的外侧是正面,而背对你的方向,瓶的内侧才是正面。正对你的内侧和背对你的外侧则是反面。这样一来,同样属于“瓶的外侧”这个表面,但某些地方算是正面,某些地方却算是反面了)。可以通过glFrontFace函数来交换“正面”和“反面”的概念。glFrontFace(GL_CCW);/设置CCW方向为“正面”,CCW即CounterClockWise,逆时针glFrontFace(GL_CW);/设置CW方向为“正面”,CW即ClockWise,顺时针voidmyDisplay(void)glClear(GL_COLOR_BUFFER_BIT);glPoly
13、gonMode(GL_FRONT,GL_FILL);/设置正面为填充模式glPolygonMode(GL_BACK,GL_LINE);/设置反面为线形模式glFrontFace(GL_CCW);/设置逆时针方向为正面glBegin(GL_POLYGON);/按逆时针绘制一个正方形,在左下方glVertex2f(-0.5f,-0.5f);glVertex2f(0.0f,-0.5f);glVertex2f(0.0f,0.0f);glVertex2f(-0.5f,0.0f);glEnd();glBegin(GL_POLYGON);/按顺时针绘制一个正方形,在右上方glVertex2f(0.0f,0.
14、0f);glVertex2f(0.0f,0.5f);glVertex2f(0.5f,0.5f);glVertex2f(0.5f,0.0f);glEnd();glFlush();(3)剔除多边形表面在三维空间中,一个多边形虽然有两个面,但我们无法看见背面的那些多边形,而一些多边形虽然是正面的,但被其他多边形所遮挡。如果将无法看见的多边形和可见的多边形同等对待,无疑会降低我们处理图形的效率。在这种时候,可以将不必要的面剔除。首先,使用glEnable(GL_CULL_FACE);来启动剔除功能(使用glDisable(GL_CULL_FACE)可以关闭之)然后,使用glCullFace来进行剔除。
15、glCullFace的参数可以是GL_FRONT,GL_BACK或者GL_FRONT_AND_BACK,分别表示剔除正面、剔除反面、剔除正反两面的多边形。注意:剔除功能只影响多边形,而对点和直线无影响。例如,使用glCullFace(GL_FRONT_AND_BACK)后,所有的多边形都将被剔除,所以看见的就只有点和直线。(4)镂空多边形直线可以被画成虚线,而多边形则可以进行镂空。首先,使用glEnable(GL_POLYGON_STIPPLE);来启动镂空模式(使用glDisable(GL_POLYGON_STIPPLE)可以关闭之)。然后,使用glPolygonStipple来设置镂空的样
16、式。voidglPolygonStipple(constGLubyte*mask);其中的参数mask指向一个长度为128字节的空间,它表示了一个32*32的矩形应该如何镂空。其中:第一个字节表示了最左下方的从左到右(也可以是从右到左,这个可以修改)8个像素是否镂空(1表示不镂空,显示该像素;0表示镂空,显示其后面的颜色),最后一个字节表示了最右上方的8个像素是否镂空。第四章颜色模型OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式。无论哪种颜色模式,计算机都必须为每一个像素保存一些数据。不同的是,RGBA模式中,数据直接就代表了颜色;而颜色索引模式中,数据代表的是一个索引,要得
17、到真正的颜色,还必须去查索引表。1.RGBA颜色RGBA模式中,每一个像素会保存以下数据:R值(红色分量)、G值(绿色分量)、B值(蓝色分量)和A值(alpha分量)。其中红、绿、蓝三种颜色相组合,就可以得到我们所需要的各种颜色,而alpha不直接影响颜色,它将留待以后介绍。在RGBA模式下选择颜色是十分简单的事情,只需要一个函数就可以搞定。glColor*系列函数可以用于设置颜色,其中三个参数的版本可以指定R、G、B的值,而A值采用默认;四个参数的版本可以分别指定R、G、B、A的值。例如:voidglColor3f(GLfloatred,GLfloatgreen,GLfloatblue);v
18、oidglColor4f(GLfloatred,GLfloatgreen,GLfloatblue,GLfloatalpha);将浮点数作为参数,其中0.0表示不使用该种颜色,而1.0表示将该种颜色用到最多。例如:glColor3f(1.0f,0.0f,0.0f);表示不使用绿、蓝色,而将红色使用最多,于是得到最纯净的红色。glColor3f(0.0f,1.0f,1.0f);表示使用绿、蓝色到最多,而不使用红色。混合的效果就是浅蓝色。glColor3f(0.5f,0.5f,0.5f);表示各种颜色使用一半,效果为灰色。注意:浮点数可以精确到小数点后若干位,这并不表示计算机就可以显示如此多种颜色。
19、实际上,计算机可以显示的颜色种数将由硬件决定。如果OpenGL找不到精确的颜色,会进行类似“四舍五入”的处理。voidmyDisplay(void)glClear(GL_COLOR_BUFFER_BIT);glColor3f(0.0f,1.0f,1.0f);glRectf(-0.5f,-0.5f,0.5f,0.5f);glFlush();注意:glColor系列函数,在参数类型不同时,表示“最大”颜色的值也不同。采用f和d做后缀的函数,以1.0表示最大的使用。采用b做后缀的函数,以127表示最大的使用。采用ub做后缀的函数,以255表示最大的使用。采用s做后缀的函数,以32767表示最大的使用
20、。采用us做后缀的函数,以65535表示最大的使用。2、索引颜色在索引颜色模式中,OpenGL需要一个颜色表。这个表就相当于画家的调色板:虽然可以调出很多种颜色,但同时存在于调色板上的颜色种数将不会超过调色板的格数。试将颜色表的每一项想象成调色板上的一个格子:它保存了一种颜色。在使用索引颜色模式画图时,我说“我把第i种颜色设置为某某”,其实就相当于将调色板的第i格调为某某颜色。“我需要第k种颜色来画图”,那么就用画笔去蘸一下第k格调色板。颜色表的大小是很有限的,一般在2564096之间,且总是2的整数次幂。在使用索引颜色方式进行绘图时,总是先设置颜色表,然后选择颜色。2.1、选择颜色使用glI
21、ndex*系列函数可以在颜色表中选择颜色。其中最常用的可能是glIndexi,它的参数是一个整形。voidglIndexi(GLintc);3、指定清除屏幕用的颜色glClear(GL_COLOR_BUFFER_BIT);意思是把屏幕上的颜色清空。使用glClearColor来指定“空”的颜色,它需要四个参数,其参数的意义跟glColor4f相似。在索引颜色模式下,使用glClearIndex来指定“空”的颜色所在的索引,它需要一个参数,其意义跟glIndexi相似。voidmyDisplay(void)glClearColor(1.0f,0.0f,0.0f,0.0f);glClear(GL_
22、COLOR_BUFFER_BIT);glFlush();4、指定着色模型OpenGL允许为同一多边形的不同顶点指定不同的颜色。例如:#includeconstGLdoublePi=3.1415926536;voidmyDisplay(void)inti;/glShadeModel(GL_FLAT);glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_TRIANGLE_FAN);glColor3f(1.0f,1.0f,1.0f);glVertex2f(0.0f,0.0f);for(i=0;i=8;+i)glColor3f(i&0 x04,i&0 x02,i&0 x01
23、);glVertex2f(cos(i*Pi/4),sin(i*Pi/4);glEnd();glFlush();使用glShadeModel函数可以关闭这种计算,如果顶点的颜色不同,则将顶点之间的其它点全部设置为与某一个点相同。(直线以后指定的点的颜色为准,而多边形将以任意顶点的颜色为准,由实现决定。)为了避免这个不确定性,尽量在多边形中使用同一种颜色。glShadeModel的使用方法:glShadeModel(GL_SMOOTH);/平滑方式,这也是默认方式glShadeModel(GL_FLAT);/单色方式第五章变换我们生活在一个三维的世界如果要观察一个物体,我们可以:1、从不同的位置去
24、观察它。(视图变换)2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它。(模型变换)3、如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。另外,我们可能只希望看到物体的一部分,而不是全部(剪裁)。(投影变换)4、我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部。(视口变换)OpenGL变换实际上是通过矩阵乘法来实现。无论是移动、旋转还是缩放大小,都是通过在当前矩阵的基础上乘以一个新的矩阵来达到目的。OpenGL可以在最底层直接操作矩阵,不过作为初学,这样做的意义并不大。1、模型变换和视图变换从“相对移动”的观点来看,改变观察点
25、的位置与方向和改变物体本身的位置与方向具有等效性。在OpenGL中,实现这两种功能甚至使用的是同样的函数。由于模型和视图的变换都通过矩阵运算来实现,在进行变换前,应先设置当前操作的矩阵为“模型视图矩阵”。设置的方法是以GL_MODELVIEW为参数调用glMatrixMode函数,像这样:glMatrixMode(GL_MODELVIEW);通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。这也只需要一行代码:glLoadIdentity();进行模型和视图变换,主要涉及到三个函数:glTranslate*,把当前矩阵和一个表示移动物体的矩阵相乘。三个参数分别表示了在三个坐标上的位移值。gl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenGL 游戏 程序设计 ppt
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内