OpenGL游戏编程.ppt

上传人:牧羊曲112 文档编号:6513272 上传时间:2023-11-08 格式:PPT 页数:47 大小:1.18MB
返回 下载 相关 举报
OpenGL游戏编程.ppt_第1页
第1页 / 共47页
OpenGL游戏编程.ppt_第2页
第2页 / 共47页
OpenGL游戏编程.ppt_第3页
第3页 / 共47页
OpenGL游戏编程.ppt_第4页
第4页 / 共47页
OpenGL游戏编程.ppt_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《OpenGL游戏编程.ppt》由会员分享,可在线阅读,更多相关《OpenGL游戏编程.ppt(47页珍藏版)》请在三一办公上搜索。

1、嵌入式课程设计介绍,课程内容授课方式技术储备考核方法最终目标,课程内容,用C/C+语言实现跨平台的水果忍者游戏,授课方式,理论授课和实际操作相结合一节理论课程一节操作课程把项目分解到每节课程中以项目推动课程根据课程进展进行分组讨论,考核方法,行为考核(30分)+项目成绩考核(70分)=100,最终目标,熟悉C/C+语言能够用C/C+语言解决一个实际问题掌握编程思路,6,OpenGL(Open Graphics Library,开放图形库),是一个二维/三维的计算机图形和模型库,它源于SGI(Silicon Graphics inc.)公司为其图形工作站开发的IRIS GL,在跨平台移植过程中发

2、展成为OpenGL。目前,OpenGL已成为开放的国际图形标准。,OpenGL简介,技术储备,C语言基础包括常见的函数、指针、数组、字符串、结构体等C+语言基础包括面向对象编程思想、类、对象、继承、多态常见的数据结构包括链表、队列、哈希表OPENGL API函数的使用跨平台QtCreator开发环境的使用,OpenGL概述,从程序开发人员的角度来看,OpenGL是一组绘图命令的API集合。利用这些API能够方便地描述二维和三维几何物体,并控制这些物体按某种方式绘制到显示缓冲区中。OpenGL的API集提供了物体描述、平移、旋转、缩放、光照、纹理、材质、像素、位图、文字、交互以及提高显示性能等方

3、面的功能,基本涵盖了开发二、三维图形程序所需的各个方面。,跨平台特性 OpenGL与硬件、窗口和操作系统是相互独立的。为了构成一个完整功能的图形处理系统,其设计实现共分 5 层:图形硬件、操作系统、窗口系统、OpenGL和应用软件。因而,OpenGL可以集成到各种标准窗口和操作系统中。例如,操作系统包括UNIX,Windows NT,Windows 95/98,DOS等;窗口系统包括X Windows,Microsoft Windows等。OpenGL图形函数定义独立于任何程序设计语言,在各种编程语言中,如C,C+,FORTRAIN,Ada和Java等,都可以调用OpenGL的库函数。,Ope

4、nGL组成,OpenGL是一种API,包括了多个图形函数,主要由以下函数库组成。(1)OpenGL核心库:gl(2)OpenGL实用程序库:glu(3)OpenGL编程辅助库:aux(4)OpenGL实用程序工具包(OpenGL utility toolkit,GLUT):glut(5)Windows专用库:wgl(6)Win32 API函数库,2023/11/8,11,OpenGL中的数据类型,函数命名约定,OpenGL函数都遵循一个命名约定,即采用以下格式:例如函数glColor3f(),gl表示这个函数来自库gl.h,color表示该函数用于颜色设定,3f表示这个函数采用了三个浮点数参数

5、。,OpenGL中的颜色,在OpenGL中,一种颜色用红、绿、蓝成分的混合来表示,每种成分的值范围是0.0到1.0。,OpenGL初步编程,在Windows下开发和创建一个OpenGL程序的基本步骤:第一步,选择一个编译环境,如QtCreator 第二步,安装GLUT工具包 第三步,建立一个OpenGL工程 第四步,编译连接 第五步,执行程序,OpenGL初步编程,OpenGL库和头文件:动态库:opengl32.dll glu32.dll glut32.dll 放入windowssystem32目录下静态库:opengl32.lib glu32.lib glut32.lib放入qt安装目录的

6、LIB目录下头文件:gl.h glu.h glut.h放入qt安装目录的IncludeQtOpengGL文件夹下,gult库常用函数,glutInit函数Void glutInit(int*argc,char*argv)功能:初始化glut库函数,从main函数中接收argc和argv参数glutInitDisplayModeglutInitDisplayMode(unsigned int mode)功能:用于设置窗口的缓冲区和颜色模式的选择参数:mode一般可以选择单缓冲和双缓冲GLUT_SIGNAL或者GLUT_DOUBLE颜色选择GLUT_RGBA,glut常用函数2,glutWindo

7、wPositionvoid glutInitWindowPosition(int x,int y);功能:定义要创建窗口出现在屏幕中的位置参数:x窗口出现的x轴坐标。glutInitWindowSizevoid glutInitWindowSize(int width,int height);功能:创建窗口的大小glutDisplayFunglutDisplayFunc(void(*func)(void);功能:glutDisplayFunc函数用于注册一个绘图函数,这样操作系统在必要时刻就会对窗体进行重新绘制操作。类似于windows程序设计中处理WM_PAINT消息。具体来说呢,就是设置一

8、个函数当需要进行画图时就调用这个函数,glut常用函数3,glutReshapeFunglutReshapeFunc(void(*func)(int width,int height);功能:窗口重绘函数,单窗口大小发生变化时必须重新绘制窗口,func函数指针就是重绘的函数glutMainLoopglutMainLoop(void);功能:进入GLUT事件处理循环,让所有的与“事件”有关的函数调用无限循环glutPostRedisplayglutPostRedisplay(void);功能:功能类似于直接调用显示回调函数display(),但该函数允许实现在对何时真正需要调用显示回调函数而作出

9、决策时,变得更加“智能化”。在GLUT遍历整个事件循环时,必然会检索到许多要求窗口重绘的事件。如果每次都去直接调用显示回调函数,窗口必然会被多次绘制。而使用glutPostRedisplay()之后,就使得在遍历消息队列的整个过程中,只对窗口重绘一次,#include#include#include/函数RenderScene用于在窗口中绘制需要的图形void RenderScene(void)/用当前清除色清除颜色缓冲区,即设定窗口的背景色glClear(GL_COLOR_BUFFER_BIT);/设置当前绘图使用的RGB颜色 glColor3f(1.0f,0.0f,0.0f);/使用当前颜

10、色绘制一个填充的矩形glRectf(100.0f,150.0f,150.0f,100.0f);/刷新OpenGL命令队列glFlush();,/函数ChangeSize是窗口大小改变时调用的登记函数void ChangeSize(GLsizei w,GLsizei h)if(h=0)h=1;/设置视区尺寸glViewport(0,0,w,h);/重置坐标系统,使投影变换复位glMatrixMode(GL_PROJECTION);glLoadIdentity();/建立修剪空间的范围 if(w=h)glOrtho(0.0f,250.0f,0.0f,250.0f*h/w,1.0f,-1.0f);e

11、lse glOrtho(0.0f,250.0f*w/h,0.0f,250.0f,1.0f,-1.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();/函数SetupRC用于初始化,常用来设置场景渲染状态void SetupRC(void)/设置窗口的清除色为白色 glClearColor(1.0f,1.0f,1.0f,1.0f);,void main(void)/初始化GLUT库OpenGL窗口的显示模式glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);/创建一个名为GLRect的窗口glutCreateWindow

12、(GLRect);/设置当前窗口的显示回调函数和窗口再整形回调函数glutDisplayFunc(RenderScene);glutReshapeFunc(ChangeSize);SetupRC();/启动主GLUT事件处理循环glutMainLoop();,22,画点、线和面glBegin(GL_POINTS);glVertex3f(0.0f,0.0f,0.0f);glVertex3f(10.0f,10.0f,10.0f);glEnd();计算机中的图元只是把一组顶点或顶点列表解释为屏幕上绘制的某些形状,而顶点是用函数glVertex3f来定义,该函数中的参数指明定义点的x、y和z坐标。,用

13、OpenGL绘图,2023/11/8,23,2023/11/8,24,在绘制三角形的过程中,三个顶点将三角形封闭的过程是有序的,即三角形的构成路径具有方向性,我们把指定顶点时顺序和方向的组合称为“绕法”。在一个全部由不透明封闭表面组成的场景中,背面多边形是永远看不见的。剔除这些不可见的多边形对于加速图形的渲染有很大的益处。开启和关闭剔除功能 可以调用带GL_CULL_FACE参数的glEnable和glDisable函数。默认剔除功能是关闭的。如果一个虚构的对象的顶点是按照多边形内部 顺时针的方向进行绘制的,那么可以称这个多边形基于窗口坐标的投影是顺时针的。反之,则为逆时针。glFrontFa

14、ce就是用来指定多边形在窗口坐标中的方向是逆时针还是顺时针的。GL_CCW说明逆时针多边形为正面,而GL_CW说明顺时针多边形为正面。默认是逆时针多边形为正面glFrontFace(GL_CW);glFrontFace(GL_CCW);,(1)视图变换:指定观察者或摄影机的位置;(2)模型变换:在场景中移动对象;(3)模型视图变换:描述视图变换与模型变换结合(4)投影变换:对视见空间进行修剪和改变大小;(5)视见区变换:对窗口的最终输出进行缩放;,OpenGL中的变换,模型坐标变换,1)平移变换:void glTranslatefd(TYPE x,TYPE y,TYPE z);2)旋转变换:v

15、oid glRotatefd(TYPE angle,TYPE x,TYPE y,TYPE z);3)比例变换:void glScalefd(TYPE x,TYPE y,TYPE z);以上变换既可用于模型变换也可用于视点变换,所有变换在视点坐标中进行。,投影变换,1)平行投影:void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);前4个参数是坐标,后两个是距离。2)透视投影:void glFrustum(GLdouble left,GLdouble R

16、ight,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar);,平行投影,void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);参数:left表示视景体左面的坐标,right表示右面的坐标,bottom表示下面的,top表示上面的,n

17、ear表示功能:平行投影,它的视景体是一个矩形的平行管道,也就是一个长方体,其特点是无论物体距离相机多远,投影后的物体大小尺寸不变。,平行投影,透视投影,void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar);它也创建一个对称透视视景体,但它的参数定义于前面的不同,其操作是创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵。参数fovy定义视野在X-Z平面(垂直方向上的可见区域)的角度,范围是0.0,180.0;参数aspect是投影平面的纵横比(宽度与高度的比值);参数zNear和Fa

18、r分别是远近裁剪面沿Z负轴到视点的距离。,透视投影,屏幕映射,glViewport(GLint x,GLint y,GLsizei width,GLsizei height);由投影变换产生的规范立方体,通过屏幕映射被变换到视口(Viewport)中。此函数的参数x和y是视口在窗口坐标系中的左下角点坐标,参数width和height分别是视口的宽度和高度。,摄影机视觉,gluLookAt(GLdouble eyeX,GLdouble eyeY,GLdouble eyeZ,GLdouble centerX,GLdouble centerY,GLdouble centerZ,GLdouble up

19、X,GLdouble upY,GLdouble upZ);参数:eyex,eyey,eyez:视点在世界坐标系中的三维坐标。centerx,centery,centerz:焦点在世界坐标系中的三维坐标upx,upy,upz:定义视点的上方向。功能:在实际的编程应用中,用户在完成场景的建模后,往往需要选择一个合适的视角或者不停地变换视角,以对场景作观察,五、在OpenGL中使用纹理,物体的表面细节称为纹理(Texture)。OpenGL使用图像表示纹理,这也是最常用的表示纹理的方式。二维纹理用得最多,一维和三维纹理也各有其用途。,纹理映射,纹理被“贴到”物体上的过程被称为纹理映射。纹理映射将纹理

20、图案映射到不同大小的景物表面上。当图形象素与对应区域的纹理象素的数目相匹配时,它们之间形成近似一对一的映射;当图形象素的数目大于对应区域的纹理象素时,纹理象素会被放大插值。这时的显示都没有问题。但当图形象素的数目远远小于对应区域的纹理象素时,每个屏幕象素将控制一大片纹理区域并与其中心对应。这时,图形位置的微小变化,将引起象素中心对应的纹理坐标发生较大的变化,表现为运动图形的闪烁。这是一种走样现象。这时,应当取象素对应纹理区域上的平均值作为一个象素对应的纹理属性。,纹理操作步骤,(1)图像准备:既可以在程序中生成图像,也可以读取图像文件。(2)生成纹理号:适用于多个纹理反复切换时,一个纹理时不需

21、要。(3)设置当前纹理:切换纹理,又称为纹理绑定。(4)定义纹理:指定当前纹理的图象。(5)设置纹理参数:指定纹理的重叠方式和插值方式。(6)启动纹理功能,绘制场景,给出顶点的纹理坐标和几何坐标注:纹理坐标可以直接指定,也可以启用自动计算纹理坐标功能。(7)退出前删除纹理。,纹理常用函数,void glGenTextures(GLsizei n,GLuint*textures);功能:根据纹理参数返回n个纹理索引参数:n用来生成纹理的数量;textures用保存纹理的索引void glBindTexture(GLenum target,GLuint texture);功能:允许建立一个绑定到目

22、标纹理的有名称的纹理。例如,一幅具有真实感的图像或者照片作为纹理贴到一个矩形上,就可以在定义纹理对象生成纹理对象数组后,通过使用glBindTexture选择纹理对象,来完成该纹理对象的定义。参数:target:纹理被绑定的目标,它只能取值GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D或者GL_TEXTURE_CUBE_MAPtexture:纹理的名称,并且,该纹理的名称在当前的应用中不能被再次使用,设置纹理参数,void glTexParameterifv(GLenum target,GLenum pname,TYPE param);功能:设置纹理参数,一

23、般来说,纹理图像为正方形或长方形。但当它映射到一个多边形或曲面上并变换到屏幕坐标时,纹理的单个纹素很少对应于屏幕 图像上的象素。根据所用变换和所用纹理映射,屏幕上单个象素可以对应于一个纹素的一小部分(即放大)或一大批纹素(即缩小)参数说明:第一个参数可以是GL_TEXTURE_1D或GL_TEXTURE_2D,即表明所用的纹理是一维的还是二维的;第二个参数指定滤波方法,其中参数值GL_TEXTURE_MAG_FILTER指定为放大滤波方法,GL_TEXTURE_MIN_FILTER指定为缩小滤波方法;第三个参数说 明滤波方式,若选择GL_NEAREST则采用坐标最靠近象素中心的纹素,这有可能使

24、图像走样;若选择GL_LINEAR则采用最靠近象素中心的四个象素的加权平均值。GL_NEAREST所需计算比GL_LINEAR要少,因而执行得更快,但 GL_LINEAR提供了比较光滑的效果。,设置纹理参数,void glTexParameterifv(GLenum target,GLenum pname,TYPE param);功能:设置纹理参数,一般来说,纹理图像为正方形或长方形。但当它映射到一个多边形或曲面上并变换到屏幕坐标时,纹理的单个纹素很少对应于屏幕 图像上的象素。根据所用变换和所用纹理映射,屏幕上单个象素可以对应于一个纹素的一小部分(即放大)或一大批纹素(即缩小)。第一个参数可以

25、是GL_TEXTURE_1D或GL_TEXTURE_2D,即表明所用的纹理是一维的还是二维的;第二个参数指定滤波方法,其中参数值GL_TEXTURE_MAG_FILTER指定为放大滤波方法,GL_TEXTURE_MIN_FILTER指定为缩小滤波方法;第三个参数说 明滤波方式,若选择GL_NEAREST则采用坐标最靠近象素中心的纹素,这有可能使图像走样;若选择GL_LINEAR则采用最靠近象素中心的四个象素的加权平均值。GL_NEAREST所需计算比GL_LINEAR要少,因而执行得更快,但 GL_LINEAR提供了比较光滑的效果。,纹理参数设置,定义纹理,glTexImage2D(GLenu

26、m target,GLint level,GLenum internalformat,GLsizei width,GLsizei height,GLint border,GLenum format,GLenum type,const void*pixels);功能:该函数的功能是,根据指定的参数,生成一个2D纹理(Texture)。相似的函数还有glTexImage1D、glTexImage3D。参数说明:target 指定目标纹理,这个值必须是GL_TEXTURE_2Dlevel 执行细节级别。0是最基本的图像级别,你表示第N级贴图细化级别。internalformat 指定纹理中的颜色组件

27、,这个取值和后面的format取值必须相同。可选的值有GL_ALPHA,GL_RGB,GL_RGBA,GL_LUMINANCE,GL_LUMINANCE_ALPHA 等几种。width 指定纹理图像的宽度,必须是2的n次方。纹理图片至少要支持64个材质元素的宽度height 指定纹理图像的高度,必须是2的m次方。纹理图片至少要支持64个材质元素的高度border 指定边框的宽度。必须为0。format 像素数据的颜色格式,必须和internalformatt取值必须相同。可选的值参考internalformat。type 指定像素数据的数据类型。可以使用的值有GL_UNSIGNED_BYTE,

28、GL_UNSIGNED_SHORT_5_6_5,GL_UNSIGNED_SHORT_4_4_4_4,GL_UNSIGNED_SHORT_5_5_5_1。pixels 指定内存中指向图像数据的指针,指定纹理坐标函数,glTexCoord2f(GLfloat s,GLfloat t)功能:用于绘制图形时指定纹理的坐标参数说明:第一个参数是X坐标,0.0是纹理的左侧,0.5是纹理的中点,1.0是纹理的右侧。第二个参数是Y坐标,0.0是纹理的底部,0.5是纹理的中点,1.0是纹理的顶部。为了将纹理正确的映射到四边形上,您必须将纹理的右上角映射到四边形的右上角,纹理的左上角映射到四边形的左上角,纹理的右

29、下角映射到四边形的右下角,纹理的左下角映射到四边形的左下角。如果映射错误的话,图像显示时可能上下颠倒,侧向一边或者什么都不是,启动纹理功能,glEnable(GL_TEXTURE_2D);功能:启动纹理贴图功能,该函数必须首先调用。否则无法实现贴图效果,读取3D模型,OPENGL API只提供了对三维场景的渲染工作,并不擅长进行三维建模工作通常的游戏的建模工作都是由专业的建模软件来完成,比如3DSMAX程序通过读取.3DS模型文件获取模型的顶点数量、法向量、面的数量CLoad3DS类就是用来读取3维模型文件,3D模型文件分析,3DS文件使记录了模型的顶点数、面数、材质数量。读取后存放在t3Dm

30、odel这个数据结构中,typedef struct int numOfObjects;/模型中对象的数目 int numOfMaterials;/模型中材质的数目 std:vector pMaterials;/材质链表信息 std:vector pObject;/模型中对象链表信息t3DModel;,材质信息结构体,typedef struct char strName255;/纹理名称 char strFile255;/如果存在纹理映射,则表示纹理文件名称 char color3;/对象的RGB颜色 int texureId;/纹理ID float uTile;/u 重复 float vT

31、ile;/v 重复 float uOffset;/u 纹理偏移 float vOffset;/v 纹理偏移tMaterialInfo;,对象信息结构体,typedef struct int numOfVerts;/模型中顶点的数目 int numOfFaces;/模型中面的数目 int numTexVertex;/模型中纹理坐标的数目 int materialID;/纹理ID bool bHasTexture;/是否具有纹理映射 char strName255;/对象的名称 CVector3*pVerts;/对象的顶点 CVector3*pNormals;/对象的法向量 CVector2*pTexVerts;/纹理UV坐标 tFace*pFaces;/对象的面信息t3DObject;,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号