OpenGL游戏程序设计.ppt
《OpenGL游戏程序设计.ppt》由会员分享,可在线阅读,更多相关《OpenGL游戏程序设计.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等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,Ope
2、nGL 的基本命令都做到了硬件无关,甚至是平台无关。,3、高性能的图形渲染。OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先,OpenGL程序准备工作,第一步,选择一个编译环境现在Windows系统的主流编译环境有Visual Studio,Broland C+Builder等都是支持OpenGL的。但这里我们选择Visual C+作为学习OpenGL的环境。,第二步,安装GLUT工具包GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。Windows环境下安装GLUT的步骤:1、
3、将下载的压缩包解开,将得到5个文件2、在“我的电脑”中搜索“gl.h”,并找到其所在文件夹。把解压得到的glut.h放到这个文件夹。3、把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹(如果是Visual C+,则应该是其安装目录下面的“VClib”文件夹)。4、把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。(典型的位置为:C:WindowsSystem32),第三步,建立一个OpenGL工程这里以Visual C+6.0为例。选择File-New-Project,然后选择Win32 Console Applicat
4、ion,选择一个名字,然后按OK。在谈出的对话框左边点Application Settings,找到Empty project并勾上,选择Finish。然后向该工程添加一个代码文件。,第一个OpenGL程序,见文本文件“第一个OpenGL文本文件”,第二章 基本图元绘制,OpenGL函数形式 OpenGL 函数通常以gl开头,中间是函数相关功能单词,后面跟一个数字和12个字母。例如:glVertex2d glVertex2f glVertex3f glVertex3fv数字表示参数的个数,2表示有两个参数,3表示三个,4表示四个,字母表示参数的类型:s表示16位整数(OpenGL中将这个类型定
5、义为GLshort);i表示32位整数(OpenGL中将这个类型定义为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
6、,3.0f,0.0f,1.0f);(五)GLfloat VertexArr3=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将会画出一条直线。,
7、glBegin支持的方式除了GL_POINTS和GL_LINES,还有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();,三个课堂练习,见三个相关文本文件,第三章 图元绘制的深入,1、关于点点的大小默认为
8、1个像素,但也可以改变之。改变的命令为glPointSize,其函数原型如下:void glPointSize(GLfloat size);size必须大于0.0f,默认值为1.0f,单位为“像素”。注意:对于具体的OpenGL实现,点的大小都有个限度的,如果设置的size超过最大值,则设置可能会有问题。,void myDisplay(void)glClear(GL_COLOR_BUFFER_BIT);glPointSize(5.0f);glBegin(GL_POINTS);glVertex2f(0.0f,0.0f);glVertex2f(0.5f,0.5f);glEnd();glFlush(
9、);,2、关于直线(1)直线可以指定宽度:void glLineWidth(GLfloat width);其用法跟glPointSize类似。(2)画虚线。首先,使用glEnable(GL_LINE_STIPPLE);来启动虚线模式(使用glDisable(GL_LINE_STIPPLE)可以关闭之)。然后,使用glLineStipple来设置虚线的样式。void glLineStipple(GLint factor,GLushort pattern);pattern是由1和0组成的长度为16的序列,从最低位开始看,如果为1,则直线上接下来应该画的factor个点将被画为实的;如果为0,则直线
10、上接下来应该画的factor个点将被画为虚的。,void myDisplay(void)glClear(GL_COLOR_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即 ClockWis
13、e,顺时针,void myDisplay(void)glClear(GL_COLOR_BUFFER_BIT);glPolygonMode(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
14、);glEnd();glBegin(GL_POLYGON);/按顺时针绘制一个正方形,在右上方 glVertex2f(0.0f,0.0f);glVertex2f(0.0f,0.5f);glVertex2f(0.5f,0.5f);glVertex2f(0.5f,0.0f);glEnd();glFlush();,(3)剔除多边形表面在三维空间中,一个多边形虽然有两个面,但我们无法看见背面的那些多边形,而一些多边形虽然是正面的,但被其他多边形所遮挡。如果将无法看见的多边形和可见的多边形同等对待,无疑会降低我们处理图形的效率。在这种时候,可以将不必要的面剔除。首先,使用glEnable(GL_CULL
15、_FACE);来启动剔除功能(使用glDisable(GL_CULL_FACE)可以关闭之)然后,使用glCullFace来进行剔除。glCullFace的参数可以是GL_FRONT,GL_BACK或者GL_FRONT_AND_BACK,分别表示剔除正面、剔除反面、剔除正反两面的多边形。注意:剔除功能只影响多边形,而对点和直线无影响。例如,使用glCullFace(GL_FRONT_AND_BACK)后,所有的多边形都将被剔除,所以看见的就只有点和直线。,(4)镂空多边形直线可以被画成虚线,而多边形则可以进行镂空。首先,使用glEnable(GL_POLYGON_STIPPLE);来启动镂空模
16、式(使用glDisable(GL_POLYGON_STIPPLE)可以关闭之)。然后,使用glPolygonStipple来设置镂空的样式。void glPolygonStipple(const GLubyte*mask);其中的参数mask指向一个长度为128字节的空间,它表示了一个32*32的矩形应该如何镂空。其中:第一个字节表示了最左下方的从左到右(也可以是从右到左,这个可以修改)8个像素是否镂空(1表示不镂空,显示该像素;0表示镂空,显示其后面的颜色),最后一个字节表示了最右上方的8个像素是否镂空。,第四章 颜色模型,OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式。无
17、论哪种颜色模式,计算机都必须为每一个像素保存一些数据。不同的是,RGBA模式中,数据直接就代表了颜色;而颜色索引模式中,数据代表的是一个索引,要得到真正的颜色,还必须去查索引表。,1.RGBA颜色RGBA模式中,每一个像素会保存以下数据:R值(红色分量)、G值(绿色分量)、B值(蓝色分量)和A值(alpha分量)。其中红、绿、蓝三种颜色相组合,就可以得到我们所需要的各种颜色,而alpha不直接影响颜色,它将留待以后介绍。在RGBA模式下选择颜色是十分简单的事情,只需要一个函数就可以搞定。glColor*系列函数可以用于设置颜色,其中三个参数的版本可以指定R、G、B的值,而A值采用默认;四个参数
18、的版本可以分别指定R、G、B、A的值。例如:void glColor3f(GLfloat red,GLfloat green,GLfloat blue);void glColor4f(GLfloat red,GLfloat green,GLfloat blue,GLfloat alpha);,将浮点数作为参数,其中0.0表示不使用该种颜色,而1.0表示将该种颜色用到最多。例如:glColor3f(1.0f,0.0f,0.0f);表示不使用绿、蓝色,而将红色使用最多,于是得到最纯净的红色。glColor3f(0.0f,1.0f,1.0f);表示使用绿、蓝色到最多,而不使用红色。混合的效果就是浅蓝
19、色。glColor3f(0.5f,0.5f,0.5f);表示各种颜色使用一半,效果为灰色。注意:浮点数可以精确到小数点后若干位,这并不表示计算机就可以显示如此多种颜色。实际上,计算机可以显示的颜色种数将由硬件决定。如果OpenGL找不到精确的颜色,会进行类似“四舍五入”的处理。,void myDisplay(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
20、做后缀的函数,以1.0表示最大的使用。采用b做后缀的函数,以127表示最大的使用。采用ub做后缀的函数,以255表示最大的使用。采用s做后缀的函数,以32767表示最大的使用。采用us做后缀的函数,以65535表示最大的使用。,2、索引颜色在索引颜色模式中,OpenGL需要一个颜色表。这个表就相当于画家的调色板:虽然可以调出很多种颜色,但同时存在于调色板上的颜色种数将不会超过调色板的格数。试将颜色表的每一项想象成调色板上的一个格子:它保存了一种颜色。在使用索引颜色模式画图时,我说“我把第i种颜色设置为某某”,其实就相当于将调色板的第i格调为某某颜色。“我需要第k种颜色来画图”,那么就用画笔去蘸
21、一下第k格调色板。颜色表的大小是很有限的,一般在2564096之间,且总是2的整数次幂。在使用索引颜色方式进行绘图时,总是先设置颜色表,然后选择颜色。,2.1、选择颜色使用glIndex*系列函数可以在颜色表中选择颜色。其中最常用的可能是glIndexi,它的参数是一个整形。void glIndexi(GLint c);,3、指定清除屏幕用的颜色glClear(GL_COLOR_BUFFER_BIT);意思是把屏幕上的颜色清空。使用glClearColor来指定“空”的颜色,它需要四个参数,其参数的意义跟glColor4f相似。在索引颜色模式下,使用glClearIndex来指定“空”的颜色所
22、在的索引,它需要一个参数,其意义跟glIndexi相似。void myDisplay(void)glClearColor(1.0f,0.0f,0.0f,0.0f);glClear(GL_COLOR_BUFFER_BIT);glFlush();,4、指定着色模型OpenGL允许为同一多边形的不同顶点指定不同的颜色。例如:#include const GLdouble Pi=3.1415926536;void myDisplay(void)int i;/glShadeModel(GL_FLAT);glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_TRIANGLE_FA
23、N);glColor3f(1.0f,1.0f,1.0f);glVertex2f(0.0f,0.0f);for(i=0;i=8;+i)glColor3f(i,使用glShadeModel函数可以关闭这种计算,如果顶点的颜色不同,则将顶点之间的其它点全部设置为与某一个点相同。(直线以后指定的点的颜色为准,而多边形将以任意顶点的颜色为准,由实现决定。)为了避免这个不确定性,尽量在多边形中使用同一种颜色。,glShadeModel的使用方法:glShadeModel(GL_SMOOTH);/平滑方式,这也是默认方式glShadeModel(GL_FLAT);/单色方式,第五章 变换,我们生活在一个三维
24、的世界如果要观察一个物体,我们可以:1、从不同的位置去观察它。(视图变换)2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它。(模型变换)3、如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。另外,我们可能只希望看到物体的一部分,而不是全部(剪裁)。(投影变换)4、我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部。(视口变换),OpenGL变换实际上是通过矩阵乘法来实现。无论是移动、旋转还是缩放大小,都是通过在当前矩阵的基础上乘以一个新的矩阵来达到目的。OpenGL可以在最底层直接操作矩阵,不过作为初学,这样做的意义并不大。,
25、1、模型变换和视图变换从“相对移动”的观点来看,改变观察点的位置与方向和改变物体本身的位置与方向具有等效性。在OpenGL中,实现这两种功能甚至使用的是同样的函数。由于模型和视图的变换都通过矩阵运算来实现,在进行变换前,应先设置当前操作的矩阵为“模型视图矩阵”。设置的方法是以GL_MODELVIEW为参数调用glMatrixMode函数,像这样:glMatrixMode(GL_MODELVIEW);,通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。这也只需要一行代码:glLoadIdentity();,进行模型和视图变换,主要涉及到三个函数:glTranslate*,把当前矩阵和一个表示移
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenGL 游戏 程序设计
链接地址:https://www.31ppt.com/p-5575812.html