




已阅读5页,还剩67页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020 1 27 山东大学HCI VRLab 1 第二章图形学 OpenGL 编程 2020 1 27 山东大学HCI VRLab 2 一 基本内容 OpenGLAPI的发展历史OpenGL体现结构OpenGL作为一个状态机 statemachine 函数Functions类型Types格式Formats简单程序 2020 1 27 山东大学HCI VRLab 3 API的早期历史 IFIPS 1973 组织了两个委员会建立图形API标准图形核心系统 GraphicalKernelSystemGKS 二维 但包含很好的工作站模型Core 同时应用于二维和三维GKS成为IS0标准 后来成为ANSI标准 1980s GKS很难推广到3D GKS 3D 远远落后于硬件的发展 2020 1 27 山东大学HCI VRLab 4 PHIGSandX 程序员层次交互式图形系统PHIGS ProgrammersHierarchicalGraphicsSystem 来自于CAD业界保存图形的数据库模型XWindow系统DEC MIT的成果提出了应用图形系统的客户 服务器体现 Client server PEX把两者结合在一起不易应用 也是两者的缺陷 2020 1 27 山东大学HCI VRLab 5 SGI和GL SiliconGraphics SGI 通过实现流水线体系改良了图形工作站 1982 源程序通过一个图形库 GL 与系统通讯借助于GL 可以非常简单地设计出三维交互图形应用程序 2020 1 27 山东大学HCI VRLab 6 OpenGL GL的成功导致了OpenGL的出现 1992 这是一个与平台无关的图形API 使用方便与硬件非常贴近 从而能充分发挥其功能注重渲染和绘制 rendering 没有提供窗口和输入接口 从而避免依赖与窗口系统 2020 1 27 山东大学HCI VRLab 7 OpenGL的演化 由ArchitecturalReviewBoard ARB 控制成员包括SGI Microsoft Nvidia HP 3DLabs IBM 相对稳定 目前版本version2 0 演化反映了新的硬件能力3D纹理映射和纹理对象基于顶点的编程通过扩展可以指定具体平台相应的功能 2020 1 27 山东大学HCI VRLab 8 OpenGL库 OpenGL核心库Windows OpenGL32大多数unix linux系统 GL库OpenGL实用库 GLU 利用OpenGL核心库提供一些功能 从而避免重复编写代码与窗口系统的连接GLXforXwindowsystemsWGLforWindowsAGLforMacintosh 2020 1 27 山东大学HCI VRLab 9 GLUT OpenGL实用工具库 GLUT OpenGLUtilityToolkitLibrary 提供所有窗口系统的共同功能打开窗口Openawindow从鼠标和键盘获得输入Getinputfrommouseandkeyboard菜单Menus事件驱动Event driven代码可以在平台之间移植 但是GLUT缺乏在确定平台上优秀工具包所具有的功能没有滚动条 2020 1 27 山东大学HCI VRLab 10 软件组织 GLUT GLU GL GLX AGLorWGL X Win32 MacO S 软件or硬件 应用程序 OpenGL图形工具条等 2020 1 27 山东大学HCI VRLab 11 OpenGL体系结构 快速模式 显示列表 多项式求值器 逐顶点操作 基本图元集成 光栅化 逐片操作 纹理内存 CPU 像素操作 帧缓存 geometrypipeline 2020 1 27 山东大学HCI VRLab 12 OpenGL函数类型 基本图形元素 Primitives 定义图形系统可以显示的低级对象或原子实体 典型的如 点Points线段LineSegments多边形Polygons像素Pixel字符Character属性函数 Attributes 线段颜色的设置多边形内部团填充图形标题文字的字体选择变换 Transformations 视图Viewing 定义了各种不同的视域建模Modeling 虚拟照相机模型等控制 GLUT 多窗口环境下的多进程之间的通信输入 GLUT 处理键盘 鼠标等设备的输入响应查询Query 获得诸如照相机参数 帧缓存里的数据等内在信息 2020 1 27 山东大学HCI VRLab 13 OpenGL状态 OpenGL是一个状态机 statemachine OpenGL函数有两种基本类型基本图元的生成 Primitivegenerating 如果图元可见 可以得到输出顶点如何处理 基本形状的外观由状态控制改变状态 Statechanging 变换函数属性函数 2020 1 27 山东大学HCI VRLab 14 面向对象方面的缺憾 OpenGL不是面向对象的 因此逻辑上的一个函数却对应着多个OpenGL函数glVertex3fglVertex2iglVertex3dv内在存储模式是相同的在C 可以很容易地创建重载函数 但是效率却成为主要问题 2020 1 27 山东大学HCI VRLab 15 OpenGL接口 核心库GL OpenGL中所有函数的名字都以gl开头Windows OpenGL32大多数unix linux系统 GL库实用库GLU只引用OpenGL核心库GL中的函数 但还包括了球体等这些常用对象的建模代码以及其他的一些功能 从而避免重复编写代码实用工具性GLUT提供了任何窗口操作系统所需要的最小功能集GLX 把 OpenGL与XWindow操作系统 粘合 起来 2020 1 27 山东大学HCI VRLab 16 OpenGL函数名称格式 glVertex3f x y z 属于GL库 函数名 x y z为float数据类型 glVertex3fv p p为指向float的指针 维数 参数个数 注意每一部分的大小写 2020 1 27 山东大学HCI VRLab 17 OpenGL中的 defines 大多数常数采用预定义方式 defines在头文件gl h glu h和glut h定义注意 include会自动包含另外两个头文件例如 glBegin GL POLYGON glClear GL COLOR BUFFER BIT 包含文件也定义OpenGL的数据类型 GLfloat GLdouble 常数 2020 1 27 山东大学HCI VRLab 18 一个简单的程序 在黑色背景上画一个矩形 2020 1 27 山东大学HCI VRLab 19 simple c include 包含GL头文件voidmydisplay glClear GL COLOR BUFFER BIT 清除屏幕及深度缓存设置glBegin GL POLYGON 设置画多边形glVertex2f 0 5 0 5 glVertex2f 0 5 0 5 glVertex2f 0 5 0 5 glVertex2f 0 5 0 5 glEnd glFlush 强制系统立刻在屏幕上显示输出图形 intmain intargc char argv 主函数glutInit 主函数循环 2020 1 27 山东大学HCI VRLab 20 事件循环 在程序中定义了一个显示回调函数 displaycallbackfunction mydisplay每个glut程序必须有一个显示回调函数只要OpenGL确定显示内容要被刷新时 显示回调函数就会被调用 例如 当窗口被打开的时候main 函数以程序进入事件循环作为结束 2020 1 27 山东大学HCI VRLab 21 默认值 simple c是个很简单的程序大量使用了状态变量的默认值视图模式Viewing色彩设置Colors窗口参数Windowparameters后续的程序将改变一下默认值 2020 1 27 山东大学HCI VRLab 22 如何在VC 6 0环境下使用进行OPENGL环境设置 下载有关的GLUT软件库 如glutdlls37beta压缩包 1 将下载的压缩包解开 将得到5个文件 glut h glut lib glut32 lib glut dll和glut32 dll 并按如下要求进行设置 1 找到盘符 d ProgramFiles MicrosoftVisualStudio VC98 include GL文件夹 把解压得到的glut h放到这个GL文件夹里 没有GL文件夹可以自己建一个 一般都有的 2 把解压得到的glut lib和glut32 lib放到静态函数库所在文件夹 即lib文件夹 如 盘符 d ProgramFiles MicrosoftVisualStudio VC98 lib文件夹 3 把解压得到的glut dll和glut32 dll放到操作系统目录下面的system32文件夹内 典型的位置为 C Windows System32 这是非常重要的动态链接库设置 2020 1 27 山东大学HCI VRLab 23 如何在VC 6 0环境编辑和运行OpenGL程序 WINDOWS环境设置创建一个Win32consoleapplication类型的workspace文件创建一个C C 文件 包含simple c的代码 并把这个文件插入到创建好的workspace文件中直接进行编译CTRL F7 进行函数库的链接F7执行编译好的可执行文件F5 080311讲完 2020 1 27 山东大学HCI VRLab 24 图元与属性 OpenGL基本库 很小的基本图元集在GLU中包含从基本库里推导而来的其他类型的基本对象OpenGL支持两类基本图元几何型图元在问题 用户 域里定义 具有空间和几何属性 点 线段 多边形 曲线 曲面等经过几何处理流水线 经过光栅化后变成帧缓存里的像素几何处理处理 决定图元是否可见 计算在屏幕上的显示位置等在问题域进行几何对象的建模和几何变换 旋转 平移等光栅型图元把对象看作是像素的集合 缺少几何属性 不能在问题空间中对其进行处理 经过另一条平行流水线到达帧缓存 2020 1 27 山东大学HCI VRLab 25 图元和属性的定义与设置 OpenGL中的基本图元都是用空间中的点或顶点定义的 采用glBigin glEnd 之间来定义glBing type type参数决定定义的几何对象类型glVertex glVertex glEnd 2020 1 27 山东大学HCI VRLab 26 OpenGL基本图元 点 线段 P33 点 GL POINT 每个顶点至少是一个像素大小线段 GL LINE 线段类型把两个相邻的顶点当作线段的两个端点多段线 GL LINE STRIP GL LINE LOOP 封闭和不封闭 2020 1 27 山东大学HCI VRLab 27 OpenGL基本图形元素 GL QUAD STRIP GL POLYGON GL TRIANGLE STRIP GL TRIANGLE FAN 扇面 GL POINTS GL LINES GL LINE LOOP GL LINE STRIP 缺口 GL TRIANGLES 2020 1 27 山东大学HCI VRLab 28 OpenGL基本图元 多边形 多边形 带边界的 封闭的 具有内部区域的对象 GL POLYGON 多边形的边界与采用GL LINE LOOP的类型一样 相邻两个顶点定义边界线 其中那个一条线段连接最后一个顶点和第一个顶点三角形和四边形是多边形的特例 P35 图2 13 GL TRIANGLES GL QUADS 带状和扇形 由一组三角形或四边形组成 共享部分顶点和边界线 P35 图2 14 GL TRIANGLE STRIP GL QUAD STRIP GL TRIANGLE FAN 2020 1 27 山东大学HCI VRLab 29 多边形的限制条件 OpenGL只能显示满足下述条件的多边形简单多边形 边除顶点外不相交凸多边形 对于多边形中的任意两点 连接这两点的线段完全在多边形中平面多边形 所有顶点都在同一个平面内用户自己确保上述条件的满足OpenGL将报错 如果上述条件不满足三角形满足上述所有限制条件 nonsimplepolygon nonconvexpolygon 2020 1 27 山东大学HCI VRLab 30 曲线和曲面 用图元来逼近曲线或曲面可以用一个正N多边形来逼近一个圆弧可以用正多面体来逼近球体用数学的方法来定义曲线和曲面 推导出这些对象的图形函数 再利用这些函数来创建对象四次曲面参数多项式曲线和曲面 2020 1 27 山东大学HCI VRLab 31 属性 属性是OpenGL状态的一部分确定对象的外观颜色 点 线 多边形 大小和宽度 points lines 宽度和虚实形式 lines polygons 多边形填充显示 颜色和模式显示边界显示顶点 2020 1 27 山东大学HCI VRLab 32 RGB色彩 每个颜色组件分别存储在帧缓存中一般在帧缓存中每个组件为8位注意在glColor3f中 颜色值的范围从0 0到1 0 而在glColor3ub中 值的范围在0 255 2020 1 27 山东大学HCI VRLab 33 索引颜色 颜色查找表 颜色值指向颜色查找表需要更少的存储量一般为8位现在不是很重要了存储器很便宜了需要更多的颜色做渲染 2020 1 27 山东大学HCI VRLab 34 颜色和状态 颜色通过glColor来设置 成为状态机的一部分 直到被改变为止 一直保持这种状态颜色与其他属性不是对象的一部分 但是在渲染时要把这些属性赋给对象可以按下述方法创建顶点的颜色glColorglVertexglColorglVertex 2020 1 27 山东大学HCI VRLab 35 颜色的光滑过渡 默认状态是光滑过渡OpenGL根据多边形顶点的颜色插值出来内部的颜色函数 glShadeModel GL SMOOTH 2020 1 27 山东大学HCI VRLab 36 颜色的平坦过渡 另外一种状态是平坦过渡第一个顶点的颜色确定填充颜色函数 glShadeModel GL FLAT 2020 1 27 山东大学HCI VRLab 37 OpenGL编程第二节完整的程序 080318 2020 1 27 山东大学HCI VRLab 38 主要内容 修改第一个程序改变默认值定义标准程序结构简单视图二维视图 作为三维视图的特例基本的OpenGL图形元素属性 2020 1 27 山东大学HCI VRLab 39 程序结构 大多数OpenGL程序有类似的结构 包含以下函数 main 主函数定义回调函数打开一个或多个具有指定属性的窗口进入事件循环 最后一条可执行语句 init 设置状态变量视图 Viewing属性 AttributesCallbacks回调函数显示函数输入和窗口函数 2020 1 27 山东大学HCI VRLab 40 对simple c的修改 在这一版本的程序中 会得到同样的输出 但是所有具有默认值的相应状态值都通过函数调用显式指定特别地 设置了颜色Colors视图条件Viewingconditions窗口属性Windowproperties 2020 1 27 山东大学HCI VRLab 41 main c includeintmain intargc char argv glutInit includesgl h definewindowproperties setOpenGLstate entereventloop displaycallback 自动包含了gl h 定义窗口属性 显示回调函数 设置OpenGL状态 进入事件循环 500 500 像素大小 2020 1 27 山东大学HCI VRLab 42 GLUT函数 glutInit使得应用程序可以获得命令行参数并初始化系统gluInitDisplayMode设置窗口的属性 渲染上下文therenderingcontext RGB颜色单缓冲区Singlebuffering属性按逻辑 或 组合在一起glutWindowSize以像素为单位定义窗口的尺寸glutWindowPosition定义窗口左上角在显示器的位置glutCreateWindow创建窗口 标题为 simple 来自参数glutDisplayFunc定义显示回调函数glutMainLoop进入无穷的事件循环 2020 1 27 山东大学HCI VRLab 43 Init voidinit glClearColor 0 0 0 0 0 0 1 0 glColor3f 1 0 1 0 1 0 glMatrixMode GL PROJECTION glLoadIdentity glOrtho 1 0 1 0 1 0 1 0 1 0 1 0 清除色 背景色 为黑色 不透明窗口 矩形填充色彩值设置白色 矩阵模式设置为投影模式 视景体设置 物体各个顶点的坐标值经过坐标变换后必须介于调用glOrtho 函数中提供参数的范围内 将当前的矩阵清零 不可再恢复 2020 1 27 山东大学HCI VRLab 44 坐标系 在glVertex中的单位是由应用程序确定的 称为世界坐标系 也叫对象或问题坐标系objectorproblemcoordinates 视景体 viewingvolume 也是相对于世界坐标系指定的 视景体确定出现在图像空间中的对象在OpenGL内部 会把世界坐标系转化为照相机坐标系 camera eye coordinates 稍后再转化为屏幕坐标系 screencoordinates OpenGL也常用某些内部表示法 这些内部表示法对应用程序并不可见 2020 1 27 山东大学HCI VRLab 45 OpenGL照相机 OpenGL照相机被放置在坐标原点 指向Z轴负方向默认的视景体是一个中心在原点 边长为2的立方体 2020 1 27 山东大学HCI VRLab 46 正交视图 OrthographicViewing 在默认的正交视图中 点沿着Z轴投影到Z 0的平面上planez 0 2020 1 27 山东大学HCI VRLab 47 变换与视图 在OpenGL中 投影是利用投影矩阵乘法进行的由于只存在一个变换函数系列 因此必须先设置矩阵模式glMatrixMode GL PROJECTION 变换函数是累加在一起的所以需要从单位矩阵开始 然后把它改变为一个投影矩阵以定义视景体glLoadIdentity 2020 1 27 山东大学HCI VRLab 48 二维与三维视图 在glOrtho left right bottom top near far 中 近与远是相对于与照相机的距离而言的glOrtho 1 0 1 0 1 0 1 0 1 0 1 0 二维顶点命令把所有的顶点放在z 0的盘面上如果应用程序处于二维状态 那么可以使用下述函数设置正交视景体 gluOrtho2D left right bottom top 对二维情形 视景体或裁剪体退化为裁剪窗口 clippingwindow 2020 1 27 山东大学HCI VRLab 49 mydisplay c voidmydisplay glClear GL COLOR BUFFER BIT glBegin GL POLYGON glVertex2f 0 5 0 5 glVertex2f 0 5 0 5 glVertex2f 0 5 0 5 glVertex2f 0 5 0 5 glEnd glFlush 2020 1 27 山东大学HCI VRLab 50 视窗 并不需要把整个当前窗口用来显示图像 可以在窗口中设置视窗 函数为 glViewport x y w h x y w h的含义见下图参数值以像素为单位 屏幕坐标系 2020 1 27 山东大学HCI VRLab 51 OpenGL编程Part3 三维图形 2020 1 27 山东大学HCI VRLab 52 主要内容 提供一个更复杂的三维图形实例分形 Sierpinski鏤垫l隐藏面消除 2020 1 27 山东大学HCI VRLab 53 三维图形应用程序 在OpenGL中 二维应用程序是三维应用程序的特殊情形要得到三维图形应用程序只对前面程序做很小的修改使用glVertex3 必须考虑多边形绘制的顺序或者启用隐藏面消除功能只考虑平面的简单图多边形 2020 1 27 山东大学HCI VRLab 54 SierpinskiGasket 2D 从一个三角形开始连接三边的中点并去掉中间的三角形Repeat 2020 1 27 山东大学HCI VRLab 55 示例 五次细分后的结果 2020 1 27 山东大学HCI VRLab 56 作为分形的鏤垫 考虑黑色填充区域的面积与周长 即包含填充区域的所有线段总长 当持续细分时面积趋向于零但周长趋向于无穷因此无穷细分后的结果不是通常的几何形状它的维数既不是一维的 也不是二维的称之为分形 fractionaldimension 对象 2020 1 27 山东大学HCI VRLab 57 GasketProgram include initialtriangletypedefGLfloatpoint2 2 initialtrianglepoint2v 1 0 0 58 1 0 0 58 0 0 1 15 intn 递归步数 2020 1 27 山东大学HCI VRLab 58 绘制三角形 voidtriangle point2a point2b point2c displayonetriangle glBegin GL TRIANGLES glVertex2fv a glVertex2fv b glVertex2fv c glEnd 2020 1 27 山东大学HCI VRLab 59 三角形细分 voiddivide triangle point2a point2b point2c intm trianglesubdivisionusingvertexnumbers point2v0 v1 v2 intj if m 0 for j 0 j 2 j v0 j a j b j 2 for j 0 j 2 j v1 j a j c j 2 for j 0 j 2 j v2 j b j c j 2 divide triangle a v0 v1 m 1 divide triangle c v1 v2 m 1 divide triangle b v2 v0 m 1 else triangle a b c drawtriangleatendofrecursion 2020 1 27 山东大学HCI VRLab 60 显示和初始化函数 voiddisplay void glClear GL COLOR BUFFER BIT glBegin GL TRIANGLES divide triangle v 0 v 1 v 2 n glEnd glFlush voidmyinit glMatrixMode GL PROJECTION glLoadIdentity gluOrtho2D 2 0 2 0 2 0 2 0 glMatrixMode GL MODELVIEW glClearColor 1 0 1 0 1 0 1 0 glColor3f 0 0 0 0 0 0 2020 1 27 山东大学HCI VRLab 61 Main 函数 Voidmain intargc char argv n 4 glutInit 2020 1 27 山东大学HCI VRLab 62 三维的情形 通过下述修改 可以很容易地把程序生成三维图形typedefGLfloatpoint3 3 glVertex3fglOrtho但这并不没有多大实质性改变下面从四面体开始迭代 2020 1 27 山东大学HCI VRLab 63 3DGasket 细分四面体的四个面好像我们从这个达到四面体中抠去了四个小一点的四面体 2020 1 27 山东大学HCI VRLab 64 示例 5次迭代后的结果 2020 1 27 山东大学HCI VRLab 65 生成三角形的代码 voidtriangle pointa pointb pointc glBegin GL POLYGON glVertex3fv a glVertex3fv b glVertex3fv c glEnd 2020 1 27 山东大学HCI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全国甘肃版信息技术六年级下册新授课 第11课聆听你的声音 教学设计
- 六、有教无类教学设计-2025-2026学年高中语文人教版选修先秦诸子选读-人教版
- 人教版高中化学选修3导学案第一章第1、2、3三课时第一节原子结构教学设计
- 2025年中考化学试题分类汇编:溶液(第2期)原卷版
- 蓄电池相关知识培训内容课件
- 2.1 计算机解决问题的过程 教学设计 2023-2024学年高中信息技术教科版(2019)必修1
- 2025年标准礼仪试题及答案
- 2025年北京市高考物理试卷(附答案)
- Unit 5 Wonders of Our Body教学设计-2025-2026学年高中英语高二下册重庆大学版
- 2025-2026学年地质版(2024)小学体育与健康二年级全一册《关注眼睛健康》教学设计
- 2025-2026学年北师大版(2024)小学数学三年级上册教学计划及进度表
- 2025-2026学年第一学期德育处工作计划:立德润心启新程行稳致远育未来
- 室内花卉基础知识培训课件
- 国有企业招聘面试经典题目
- 保障农民工权益的课件
- 电磁频谱管控策略-洞察及研究
- 2025年excel基础操作测试题及答案
- 房屋维护管理办法细则
- ECM在组织修复中功能-洞察及研究
- 2025年中国远洋渔业行业发展运行现状及投资潜力预测报告
- 信息资源管理课件版
评论
0/150
提交评论