《OpenGL游戏编程》PPT课件.ppt

上传人:sh****n 文档编号:6615290 上传时间:2020-02-29 格式:PPT 页数:47 大小:1.32MB
返回 下载 相关 举报
《OpenGL游戏编程》PPT课件.ppt_第1页
第1页 / 共47页
《OpenGL游戏编程》PPT课件.ppt_第2页
第2页 / 共47页
《OpenGL游戏编程》PPT课件.ppt_第3页
第3页 / 共47页
点击查看更多>>
资源描述
嵌入式课程设计介绍 课程内容授课方式技术储备考核方法最终目标 课程内容 用C C 语言实现跨平台的 水果忍者 游戏 授课方式 理论授课和实际操作相结合一节理论课程一节操作课程把项目分解到每节课程中以项目推动课程根据课程进展进行分组讨论 考核方法 行为考核 30分 项目成绩考核 70分 100 最终目标 熟悉C C 语言能够用C C 语言解决一个实际问题掌握编程思路 6 OpenGL OpenGraphicsLibrary 开放图形库 是一个二维 三维的计算机图形和模型库 它源于SGI SiliconGraphicsinc 公司为其图形工作站开发的IRISGL 在跨平台移植过程中发展成为OpenGL 目前 OpenGL已成为开放的国际图形标准 OpenGL简介 技术储备 C语言基础包括常见的函数 指针 数组 字符串 结构体等C 语言基础包括面向对象编程思想 类 对象 继承 多态常见的数据结构包括链表 队列 哈希表OPENGLAPI函数的使用跨平台QtCreator开发环境的使用 OpenGL概述 从程序开发人员的角度来看 OpenGL是一组绘图命令的API集合 利用这些API能够方便地描述二维和三维几何物体 并控制这些物体按某种方式绘制到显示缓冲区中 OpenGL的API集提供了物体描述 平移 旋转 缩放 光照 纹理 材质 像素 位图 文字 交互以及提高显示性能等方面的功能 基本涵盖了开发二 三维图形程序所需的各个方面 跨平台特性OpenGL与硬件 窗口和操作系统是相互独立的 为了构成一个完整功能的图形处理系统 其设计实现共分5层 图形硬件 操作系统 窗口系统 OpenGL和应用软件 因而 OpenGL可以集成到各种标准窗口和操作系统中 例如 操作系统包括UNIX WindowsNT Windows95 98 DOS等 窗口系统包括XWindows MicrosoftWindows等 OpenGL图形函数定义独立于任何程序设计语言 在各种编程语言中 如C C FORTRAIN Ada和Java等 都可以调用OpenGL的库函数 OpenGL组成 OpenGL是一种API 包括了多个图形函数 主要由以下函数库组成 1 OpenGL核心库 gl 2 OpenGL实用程序库 glu 3 OpenGL编程辅助库 aux 4 OpenGL实用程序工具包 OpenGLutilitytoolkit GLUT glut 5 Windows专用库 wgl 6 Win32API函数库 2020 2 29 11 OpenGL中的数据类型 函数命名约定 OpenGL函数都遵循一个命名约定 即采用以下格式 例如函数glColor3f gl表示这个函数来自库gl h color表示该函数用于颜色设定 3f表示这个函数采用了三个浮点数参数 OpenGL中的颜色 在OpenGL中 一种颜色用红 绿 蓝成分的混合来表示 每种成分的值范围是0 0到1 0 OpenGL初步编程 在Windows下开发和创建一个OpenGL程序的基本步骤 第一步 选择一个编译环境 如QtCreator第二步 安装GLUT工具包第三步 建立一个OpenGL工程第四步 编译连接第五步 执行程序 OpenGL初步编程 OpenGL库和头文件 动态库 opengl32 dllglu32 dllglut32 dll放入windows system32目录下静态库 opengl32 libglu32 libglut32 lib放入qt安装目录的LIB目录下头文件 gl hglu hglut h放入qt安装目录的Include QtOpengGL文件夹下 gult库常用函数 glutInit函数VoidglutInit int argc char argv 功能 初始化glut库函数 从main函数中接收argc和argv参数glutInitDisplayModeglutInitDisplayMode unsignedintmode 功能 用于设置窗口的缓冲区和颜色模式的选择参数 mode一般可以选择单缓冲和双缓冲GLUT SIGNAL或者GLUT DOUBLE颜色选择GLUT RGBA glut常用函数2 glutWindowPositionvoidglutInitWindowPosition intx inty 功能 定义要创建窗口出现在屏幕中的位置参数 x窗口出现的x轴坐标 glutInitWindowSizevoidglutInitWindowSize intwidth intheight 功能 创建窗口的大小glutDisplayFunglutDisplayFunc void func void 功能 glutDisplayFunc函数用于注册一个绘图函数 这样操作系统在必要时刻就会对窗体进行重新绘制操作 类似于windows程序设计中处理WM PAINT消息 具体来说呢 就是设置一个函数当需要进行画图时就调用这个函数 glut常用函数3 glutReshapeFunglutReshapeFunc void func intwidth intheight 功能 窗口重绘函数 单窗口大小发生变化时必须重新绘制窗口 func函数指针就是重绘的函数glutMainLoopglutMainLoop void 功能 进入GLUT事件处理循环 让所有的与 事件 有关的函数调用无限循环glutPostRedisplayglutPostRedisplay void 功能 功能类似于直接调用显示回调函数display 但该函数允许实现在对何时真正需要调用显示回调函数而作出决策时 变得更加 智能化 在GLUT遍历整个事件循环时 必然会检索到许多要求窗口重绘的事件 如果每次都去直接调用显示回调函数 窗口必然会被多次绘制 而使用glutPostRedisplay 之后 就使得在遍历消息队列的整个过程中 只对窗口重绘一次 include include include 函数RenderScene用于在窗口中绘制需要的图形voidRenderScene void 用当前清除色清除颜色缓冲区 即设定窗口的背景色glClear GL COLOR BUFFER BIT 设置当前绘图使用的RGB颜色glColor3f 1 0f 0 0f 0 0f 使用当前颜色绘制一个填充的矩形glRectf 100 0f 150 0f 150 0f 100 0f 刷新OpenGL命令队列glFlush 函数ChangeSize是窗口大小改变时调用的登记函数voidChangeSize GLsizeiw GLsizeih 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 elseglOrtho 0 0f 250 0f w h 0 0f 250 0f 1 0f 1 0f glMatrixMode GL MODELVIEW glLoadIdentity 函数SetupRC用于初始化 常用来设置场景渲染状态voidSetupRC void 设置窗口的清除色为白色glClearColor 1 0f 1 0f 1 0f 1 0f voidmain void 初始化GLUT库OpenGL窗口的显示模式glutInitDisplayMode GLUT SINGLE GLUT RGB 创建一个名为GLRect的窗口glutCreateWindow 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坐标 用OpenGL绘图 2020 2 29 23 2020 2 29 24 在绘制三角形的过程中 三个顶点将三角形封闭的过程是有序的 即三角形的构成路径具有方向性 我们把指定顶点时顺序和方向的组合称为 绕法 在一个全部由不透明封闭表面组成的场景中 背面多边形是永远看不见的 剔除这些不可见的多边形对于加速图形的渲染有很大的益处 开启和关闭剔除功能可以调用带GL CULL FACE参数的glEnable和glDisable函数 默认剔除功能是关闭的 如果一个虚构的对象的顶点是按照多边形内部顺时针的方向进行绘制的 那么可以称这个多边形基于窗口坐标的投影是顺时针的 反之 则为逆时针 glFrontFace就是用来指定多边形在窗口坐标中的方向是逆时针还是顺时针的 GL CCW说明逆时针多边形为正面 而GL CW说明顺时针多边形为正面 默认是逆时针多边形为正面glFrontFace GL CW glFrontFace GL CCW 1 视图变换 指定观察者或摄影机的位置 2 模型变换 在场景中移动对象 3 模型视图变换 描述视图变换与模型变换结合 4 投影变换 对视见空间进行修剪和改变大小 5 视见区变换 对窗口的最终输出进行缩放 OpenGL中的变换 模型坐标变换 1 平移变换 voidglTranslate fd TYPEx TYPEy TYPEz 2 旋转变换 voidglRotate fd TYPEangle TYPEx TYPEy TYPEz 3 比例变换 voidglScale fd TYPEx TYPEy TYPEz 以上变换既可用于模型变换也可用于视点变换 所有变换在视点坐标中进行 投影变换 1 平行投影 voidglOrtho GLdoubleleft GLdoubleright GLdoublebottom GLdoubletop GLdoublenear GLdoublefar 前4个参数是坐标 后两个是距离 2 透视投影 voidglFrustum GLdoubleleft GLdoubleRight GLdoublebottom GLdoubletop GLdoublenear GLdoublefar voidgluPerspective GLdoublefovy GLdoubleaspect GLdoublezNear GLdoublezFar 平行投影 voidglOrtho GLdoubleleft GLdoubleright GLdoublebottom GLdoubletop GLdoublenear GLdoublefar 参数 left表示视景体左面的坐标 right表示右面的坐标 bottom表示下面的 top表示上面的 near表示功能 平行投影 它的视景体是一个矩形的平行管道 也就是一个长方体 其特点是无论物体距离相机多远 投影后的物体大小尺寸不变 平行投影 透视投影 voidgluPerspective GLdoublefovy GLdoubleaspect GLdoublezNear GLdoublezFar 它也创建一个对称透视视景体 但它的参数定义于前面的不同 其操作是创建一个对称的透视投影矩阵 并且用这个矩阵乘以当前矩阵 参数fovy定义视野在X Z平面 垂直方向上的可见区域 的角度 范围是 0 0 180 0 参数aspect是投影平面的纵横比 宽度与高度的比值 参数zNear和Far分别是远近裁剪面沿Z负轴到视点的距离 透视投影 屏幕映射 glViewport GLintx GLinty GLsizeiwidth GLsizeiheight 由投影变换产生的规范立方体 通过屏幕映射被变换到视口 Viewport 中 此函数的参数x和y是视口在窗口坐标系中的左下角点坐标 参数width和height分别是视口的宽度和高度 摄影机视觉 gluLookAt GLdoubleeyeX GLdoubleeyeY GLdoubleeyeZ GLdoublecenterX GLdoublecenterY GLdoublecenterZ GLdoubleupX GLdoubleupY GLdoubleupZ 参数 eyex eyey eyez 视点在世界坐标系中的三维坐标 centerx centery centerz 焦点在世界坐标系中的三维坐标upx upy upz 定义视点的上方向 功能 在实际的编程应用中 用户在完成场景的建模后 往往需要选择一个合适的视角或者不停地变换视角 以对场景作观察 五 在OpenGL中使用纹理 物体的表面细节称为纹理 Texture OpenGL使用图像表示纹理 这也是最常用的表示纹理的方式 二维纹理用得最多 一维和三维纹理也各有其用途 纹理映射 纹理被 贴到 物体上的过程被称为纹理映射 纹理映射将纹理图案映射到不同大小的景物表面上 当图形象素与对应区域的纹理象素的数目相匹配时 它们之间形成近似一对一的映射 当图形象素的数目大于对应区域的纹理象素时 纹理象素会被放大插值 这时的显示都没有问题 但当图形象素的数目远远小于对应区域的纹理象素时 每个屏幕象素将控制一大片纹理区域并与其中心对应 这时 图形位置的微小变化 将引起象素中心对应的纹理坐标发生较大的变化 表现为运动图形的闪烁 这是一种走样现象 这时 应当取象素对应纹理区域上的平均值作为一个象素对应的纹理属性 纹理操作步骤 1 图像准备 既可以在程序中生成图像 也可以读取图像文件 2 生成纹理号 适用于多个纹理反复切换时 一个纹理时不需要 3 设置当前纹理 切换纹理 又称为纹理绑定 4 定义纹理 指定当前纹理的图象 5 设置纹理参数 指定纹理的重叠方式和插值方式 6 启动纹理功能 绘制场景 给出顶点的纹理坐标和几何坐标注 纹理坐标可以直接指定 也可以启用自动计算纹理坐标功能 7 退出前删除纹理 纹理常用函数 voidglGenTextures GLsizein GLuint textures 功能 根据纹理参数返回n个纹理索引参数 n用来生成纹理的数量 textures用保存纹理的索引voidglBindTexture GLenumtarget GLuinttexture 功能 允许建立一个绑定到目标纹理的有名称的纹理 例如 一幅具有真实感的图像或者照片作为纹理贴到一个矩形上 就可以在定义纹理对象生成纹理对象数组后 通过使用glBindTexture选择纹理对象 来完成该纹理对象的定义 参数 target 纹理被绑定的目标 它只能取值GL TEXTURE 1D GL TEXTURE 2D GL TEXTURE 3D或者GL TEXTURE CUBE MAPtexture 纹理的名称 并且 该纹理的名称在当前的应用中不能被再次使用 设置纹理参数 voidglTexParameter if v GLenumtarget GLenumpname TYPEparam 功能 设置纹理参数 一般来说 纹理图像为正方形或长方形 但当它映射到一个多边形或曲面上并变换到屏幕坐标时 纹理的单个纹素很少对应于屏幕图像上的象素 根据所用变换和所用纹理映射 屏幕上单个象素可以对应于一个纹素的一小部分 即放大 或一大批纹素 即缩小 参数说明 第一个参数可以是GL TEXTURE 1D或GL TEXTURE 2D 即表明所用的纹理是一维的还是二维的 第二个参数指定滤波方法 其中参数值GL TEXTURE MAG FILTER指定为放大滤波方法 GL TEXTURE MIN FILTER指定为缩小滤波方法 第三个参数说明滤波方式 若选择GL NEAREST则采用坐标最靠近象素中心的纹素 这有可能使图像走样 若选择GL LINEAR则采用最靠近象素中心的四个象素的加权平均值 GL NEAREST所需计算比GL LINEAR要少 因而执行得更快 但GL LINEAR提供了比较光滑的效果 设置纹理参数 voidglTexParameter if v GLenumtarget GLenumpname TYPEparam 功能 设置纹理参数 一般来说 纹理图像为正方形或长方形 但当它映射到一个多边形或曲面上并变换到屏幕坐标时 纹理的单个纹素很少对应于屏幕图像上的象素 根据所用变换和所用纹理映射 屏幕上单个象素可以对应于一个纹素的一小部分 即放大 或一大批纹素 即缩小 第一个参数可以是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 GLenumtarget GLintlevel GLenuminternalformat GLsizeiwidth GLsizeiheight GLintborder GLenumformat GLenumtype constvoid pixels 功能 该函数的功能是 根据指定的参数 生成一个2D纹理 Texture 相似的函数还有glTexImage1D glTexImage3D 参数说明 target指定目标纹理 这个值必须是GL TEXTURE 2Dlevel执行细节级别 0是最基本的图像级别 你表示第N级贴图细化级别 internalformat指定纹理中的颜色组件 这个取值和后面的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 GL UNSIGNED SHORT 5 6 5 GL UNSIGNED SHORT 4 4 4 4 GL UNSIGNED SHORT 5 5 5 1 pixels指定内存中指向图像数据的指针 指定纹理坐标函数 glTexCoord2f GLfloats GLfloatt 功能 用于绘制图形时指定纹理的坐标参数说明 第一个参数是X坐标 0 0是纹理的左侧 0 5是纹理的中点 1 0是纹理的右侧 第二个参数是Y坐标 0 0是纹理的底部 0 5是纹理的中点 1 0是纹理的顶部 为了将纹理正确的映射到四边形上 您必须将纹理的右上角映射到四边形的右上角 纹理的左上角映射到四边形的左上角 纹理的右下角映射到四边形的右下角 纹理的左下角映射到四边形的左下角 如果映射错误的话 图像显示时可能上下颠倒 侧向一边或者什么都不是 启动纹理功能 glEnable GL TEXTURE 2D 功能 启动纹理贴图功能 该函数必须首先调用 否则无法实现贴图效果 读取3D模型 OPENGLAPI只提供了对三维场景的渲染工作 并不擅长进行三维建模工作通常的游戏的建模工作都是由专业的建模软件来完成 比如3DSMAX程序通过读取 3DS模型文件获取模型的顶点数量 法向量 面的数量CLoad3DS类就是用来读取3维模型文件 3D模型文件分析 3DS文件使记录了模型的顶点数 面数 材质数量 读取后存放在t3Dmodel这个数据结构中 typedefstruct intnumOfObjects 模型中对象的数目intnumOfMaterials 模型中材质的数目std vectorpMaterials 材质链表信息std vectorpObject 模型中对象链表信息 t3DModel 材质信息结构体 typedefstruct charstrName 255 纹理名称charstrFile 255 如果存在纹理映射 则表示纹理文件名称charcolor 3 对象的RGB颜色inttexureId 纹理IDfloatuTile u重复floatvTile v重复floatuOffset u纹理偏移floatvOffset v纹理偏移 tMaterialInfo 对象信息结构体 typedefstruct intnumOfVerts 模型中顶点的数目intnumOfFaces 模型中面的数目intnumTexVertex 模型中纹理坐标的数目intmaterialID 纹理IDboolbHasTexture 是否具有纹理映射charstrName 255 对象的名称CVector3 pVerts 对象的顶点CVector3 pNormals 对象的法向量CVector2 pTexVerts 纹理UV坐标tFace pFaces 对象的面信息 t3DObject
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!