OpenGL游戏程序设计

上传人:野鹰 文档编号:1131271 上传时间:2017-05-29 格式:PPT 页数:144 大小:301.50KB
返回 下载 相关 举报
OpenGL游戏程序设计_第1页
第1页 / 共144页
OpenGL游戏程序设计_第2页
第2页 / 共144页
OpenGL游戏程序设计_第3页
第3页 / 共144页
OpenGL游戏程序设计_第4页
第4页 / 共144页
OpenGL游戏程序设计_第5页
第5页 / 共144页
点击查看更多>>
资源描述

《OpenGL游戏程序设计》由会员分享,可在线阅读,更多相关《OpenGL游戏程序设计(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的步骤:

3、1、将下载的压缩包解开,将得到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 Appli

4、cation,选择一个名字,然后按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);(四)glV

6、ertex4f(1.0f, 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,则两个点将被认为是

7、直线的两个端点,OpenGL将会画出一条直线。,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();,三个课堂练

8、习,见三个相关文本文件,第三章 图元绘制的深入,1、关于点点的大小默认为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.0

9、f); glVertex2f(0.5f, 0.5f); glEnd(); glFlush();,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的序列,从

10、最低位开始看,如果为1,则直线上接下来应该画的factor个点将被画为实的;如果为0,则直线上接下来应该画的factor个点将被画为虚的。,void myDisplay(void) glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_LINE_STIPPLE); glLineStipple(2, 0x0F0F); 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方向为“正面”,

13、CCW即CounterClockWise,逆时针glFrontFace(GL_CW); / 设置CW方向为“正面”,CW即 ClockWise,顺时针,void myDisplay(void) glClear(GL_COLOR_BUFFER_BIT); glPolygonMode(GL_FRONT, GL_FILL); / 设置正面为填充模式 glPolygonMode(GL_BACK, GL_LINE); / 设置反面为线形模式 glFrontFace(GL_CCW); / 设置逆时针方向为正面 glBegin(GL_POLYGON); / 按逆时针绘制一个正方形,在左下方 glVertex

14、2f(-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.0f); glVertex2f(0.0f, 0.5f); glVertex2f(0.5f, 0.5f); glVertex2f(0.5f, 0.0f); glEnd(); glFlush();,(3)剔除多边形表面在三维空间中,一个多边形虽然有两个面,但我们无法看见背面的那些多边

15、形,而一些多边形虽然是正面的,但被其他多边形所遮挡。如果将无法看见的多边形和可见的多边形同等对待,无疑会降低我们处理图形的效率。在这种时候,可以将不必要的面剔除。首先,使用glEnable(GL_CULL_FACE);来启动剔除功能(使用glDisable(GL_CULL_FACE)可以关闭之)然后,使用glCullFace来进行剔除。glCullFace的参数可以是GL_FRONT,GL_BACK或者GL_FRONT_AND_BACK,分别表示剔除正面、剔除反面、剔除正反两面的多边形。注意:剔除功能只影响多边形,而对点和直线无影响。例如,使用glCullFace(GL_FRONT_AND_BACK)后,所有的多边形都将被剔除,所以看见的就只有点和直线。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 研究报告 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号