




已阅读5页,还剩58页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020 4 15 华中科技大学计算机学院李国宽 1 1 OpenGL简介OpenGL OpenGraphicsLibrary 开放图形库 是一个二维 三维的计算机图形和模型库 它源于SGI SiliconGraphicsinc 公司为其图形工作站开发的IRISGL 在跨平台移植过程中发展成为OpenGL 目前 OpenGL已成为开放的国际图形标准 一 OpenGL框架 2020 4 15 2 OpenGL的功能 模型绘制 绘制点 线和多边形 构造三维模型 模型观察 建立变换 坐标变换 投影变换 视窗变换 颜色模式的指定 RGBA模式和颜色索引模式光照应用图象效果增强 反走样 混合和雾化位图和图象处理纹理映射实时动画 双缓存技术 doublebuffer 交互技术 提供人机交互的接口 OpenGL的特点从程序开发人员的角度来看 OpenGL是一组绘图命令的API集合 利用这些API能够方便地描述二维和三维几何物体 并控制这些物体按某种方式绘制到显示缓冲区中 OpenGL的API集提供了物体描述 平移 旋转 缩放 光照 纹理 材质 像素 位图 文字 交互以及提高显示性能等方面的功能 基本涵盖了开发二 三维图形程序所需的各个方面 与一般的图形开发工具相比 OpenGL具有以下几个突出特点 1 跨平台特性OpenGL与硬件 窗口和操作系统是相互独立的 为了构成一个完整功能的图形处理系统 其设计实现共分5层 图形硬件 操作系统 窗口系统 OpenGL和应用软件 因而 OpenGL可以集成到各种标准窗口和操作系统中 例如 操作系统包括UNIX WindowsNT Windows95 98 DOS等 窗口系统包括XWindows MicrosoftWindows等 OpenGL图形函数定义独立于任何程序设计语言 在各种编程语言中 如C C FORTRAIN Ada和Java等 都可以调用OpenGL的库函数 2 应用的广泛性OpenGL是目前最主要的二 三维交互式图形应用程序开发环境 已成为业界最受推荐的图形应用编程接口 自从1992年发表以来 OpenGL已被广泛地应用于CAD CAM 三维动画 数字图像处理以及虚拟现实等领域 Kinetix公司的3DStudioMax就是突出的代表 无论是在PC机上 还是在工作站甚至是大型机和超级计算机上 OpenGL都能表现出它的高性能和强大威力 3 网络透明性建立在客户 服务器模型上的网络透明性是OpenGL的固有特性 它允许一个运行在工作站上的进程在本机或通过网络在远程工作站上显示图形 利用这种性质能够均衡各工作站的工作负荷 共同承担图形应用任务 4 高质量和高性能无论是在CAD CAM 三维动画还是可视化仿真等领域 OpenGL高质量和高效率的图形生成能力都能得到充分的体现 在这些领域中 开发人员可以利用OpenGL制作出效果逼真的二 三维图像来 5 出色的编程特性OpenGL在各种平台上已有多年的应用实践 加上严格的规范控制 因此OpenGL具有良好的稳定性 OpenGL具有充分的独立性与易使用性等 2020 4 15 8 2 OpenGL的工作方式 1 体系结构一个完整的窗口系统的OpenGL图形处理系统的结构如右图所示 最底层为图形硬件 第二层为操作系统 第三层为窗口系统 第四层为OpenGL 最上面的层为应用软件 2020 4 15 9 2 OpenGL的流水线当应用程序进行OpenGLAPI函数调用时 OpenGL命令将被放在一个命令缓冲区中 这样 命令缓冲区中包含了大量的命令 顶点数据和纹理数据 当这个缓冲区被清空时 缓冲区中的命令和数据都将传递给流水线的下一个阶段 2020 4 15 10 3 OpenGL状态机制OpenGL的工作方式是一种状态机制 它可以进行各种状态或模式设置 这些状态或模式在重新改变它们之前一直有效 状态变量可以通过glEnable glDisable 这两个函数来设置成有效或无效状态 另外可以用下列四个函数来获取某个状态变量的值 glGetBooleanv glGetDoublev glGetFloatv 和glGetIntegerv 2020 4 15 11 3 OpenGL的组成OpenGL是一种API 包括了多个图形函数 主要由以下函数库组成 1 OpenGL核心库 gl 2 OpenGL实用程序库 glu 3 OpenGL编程辅助库 aux 4 OpenGL实用程序工具包 OpenGLutilitytoolkit GLUT glut 5 Windows专用库 wgl 6 Win32API函数库 2020 4 15 12 4 OpenGL中的数据类型 2020 4 15 13 5 函数命名约定OpenGL函数都遵循一个命名约定 即采用以下格式 例如函数glColor3f gl表示这个函数来自库gl h color表示该函数用于颜色设定 3f表示这个函数采用了三个浮点数参数 2020 4 15 14 6 OpenGL中的颜色在OpenGL中 一种颜色用红 绿 蓝成分的混合来表示 每种成分的值范围是0 0到1 0 OpenGL初步编程 在Windows下开发和创建一个OpenGL程序的基本步骤 第一步 选择一个编译环境 如VC 第二步 安装GLUT工具包第三步 建立一个OpenGL工程第四步 编译连接第五步 执行程序 OpenGL初步编程 OpenGL库和头文件 动态库 opengl32 dllglu32 dllglut32 dll放入windows system32目录下静态库 opengl32 libglu32 libglut32 lib放入VC安装目录的LIB目录下头文件 gl hglu hglut h放入VC安装目录的Include GL文件夹下 程序清单1 1 在窗口内绘制一个矩形 GLRect c include 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 GLRect程序运行结果 2020 4 15 21 1 画点 线和面glBegin GL POINTS glVertex3f 0 0f 0 0f 0 0f glVertex3f 10 0f 10 0f 10 0f glEnd 计算机中的图元只是把一组顶点或顶点列表解释为屏幕上绘制的某些形状 而顶点是用函数glVertex3f来定义 该函数中的参数指明定义点的x y和z坐标 二 用OpenGL绘图 2020 4 15 22 2020 4 15 23 1 点的大小voidglPointSize GLfloatsize GLfloatsizes 2 保存绘制点的尺寸范围GLfloatstep 保存绘制点尺寸的步长glGetFloarv GL POINT SIZE RANGE sizes glGetFloatv GL POINT SIZE GRANULARITY step 2 线宽voidglLineWidth GLfloatwidth GLfloatsizes 2 保存线宽的尺寸范围GLfloatstep 保存线宽尺寸的最小间隔glGetFloarv GL LINE WIDTH RANGE sizes glGetFloatv GL LINE WIDTH GRANULARITY step 2020 4 15 24 3 线型glEnable GL LINE STIPPLE glLineStipple GLintfactor GLushortpattern pattern是一个16位值 他指定了画线时所用的模式 每一位代表线段的一部分是开还是关 默认情况下 每一位对应一个象素 但factor参数充当倍数可以增加模式的宽度 在应用模式时 pattern是逆向使用的 即模式的最低有效位最先作用于指点线段 2020 4 15 25 2 绕法与多边形模式在绘制三角形的过程中 三个顶点将三角形封闭的过程是有序的 即三角形的构成路径具有方向性 我们把指定顶点时顺序和方向的组合称为 绕法 绕法是任何多边形图元的一个重要特性 一般默认情况下 OpenGL认为逆时针绕法的多边形是正对着的 glFrontFace GL CW glFrontFace GL CCW 2020 4 15 26 函数glPolygonMode用于设定多边形模式 glPolygonMode GLenumface GLenummode 其中 参数face用于指定多边形的哪一个面受到模式改变的影响 GL FRONT GL BACK或GL FRONT AND BACK 参数mode用于指定新的绘图模式 GL FILL是默认值 生成填充的多边形 GL LINE生成多边形的轮廓 而GL POINT只画出顶点 2020 4 15 27 3 多边形颜色的设置在OpenGL中 颜色实际上是对各个顶点而不是对各个多边形指定的 1 glShadeModel GL FLAT 告诉OpenGL用指定多边形最后一个顶点时的当前颜色作为填充多边形的纯色 唯一例外是GL POLYGON图元 它采用的是第一个顶点的颜色 2 glShadeModel GL SMOOTH 告诉OpenGL从各个顶点给三角形投上光滑的阴影 试图在为各个顶点指定的颜色之间进行插值 Gouraud明暗处理通常算法为 先用多边形顶点的光强线性插值出当前扫描线与多边形边交点处的光强 然后再用交点的光强线插值处扫描线位于多边形内区段上每一象素处的光强值 采用Gouraud明暗处理不但可以使用多边形表示的曲面光强连续 而且计算量很小 2020 4 15 29 4 深度测试深度测试是一种移除被挡住表面的有效技术 为了启用深度测试 只要调用 glEnable GL DEPTH TEST glDisable GL DEPTH TEST 另外为了使深度缓冲区正常完成深度测试功能 在每次渲染场景时 必须先清除深度缓冲区 glClear GL DEPTH BUFFER BIT 2020 4 15 30 5 多边形构造规则 1 所有多边形都必须是平面的 2 第二条规则是多边形的边缘决不能相交 而且多边形必须是凸的 解决 对于非凸多边形 可以把它分割成几个凸多边形 通常是三角形 再将它绘制出来 问题 轮廓图形状态会看到组成大表面的所有小三角形 处理OpenGL提供了一个特殊标记来处理这些边缘 称为边缘标记 glEdgeFlag True glEdgeFlag False 1 OpenGL中的变换 1 视图变换 指定观察者或摄影机的位置 2 模型变换 在场景中移动对象 3 模型视图变换 描述视图变换与模型变换的对偶性 4 投影变换 对视见空间进行修剪和改变大小 5 视见区变换 对窗口的最终输出进行缩放 三 图形的变换 2 模型视图矩阵 1 平移voidglTranslated f GLdoublex GLdoubley GLdoublez 2 旋转voidglRotated f GLdoubleangle GLdoublex GLdoubley GLdoublez 3 比例voidglScaled f GLdoublex GLdoubley GLdoublez 矩阵的操作glMatrixMode GLenummode 参数mode用于确定将哪个矩阵堆栈用于矩阵操作 GL MODELVIEW 模型视图矩阵堆栈GL PROJECTION 投影矩阵堆栈GL TEXTURE 纹理矩阵堆栈 3 单位矩阵glTranslatef 10 0f 0 0f 0 0f glutSolidSphere 1 0f 15 15 glTranslatef 0 0f 10 0f 0 0f glutSolidSphere 1 0f 15 15 glMatrixMode GL MODELVIEW glLoadIdentity 4 矩阵堆栈OpenGL为模型视图矩阵和投影矩阵各维护着一个 矩阵堆栈 可以把当前矩阵压到堆栈中保存它 然后对当前矩阵进行修改 把矩阵弹出堆栈即可恢复 使用的函数如下 voidglPushMatrix void voidglPopMatrix void 5 投影变换OpenGL中只提供了两种投影方式 一种是平行投影 正射投影 另一种是透视投影 在投影变换之前必须指定当前处理的是投影变换矩阵 glMAtrixMode GL PROJECTION glLoadIdentity 1 平行投影平行投影 它的视景体是一个矩形的平行管道 也就是一个长方体 其特点是无论物体距离相机多远 投影后的物体大小尺寸不变 voidglOrtho GLdoubleleft GLdoubleright GLdoublebottom GLdoubletop GLdoublenear GLdoublefar 这个函数的操作是创建一个正射投影矩阵 并且用这个矩阵乘以当前矩阵 voidgluOrtho2D GLdoubleleft GLdoubleright GLdoublebottom GLdoubletop 它是一个特殊的正射投影函数 主要用于二维图像到二维屏幕上的投影 它的near和far缺省值分别为 1 0和1 0 所有二维物体的Z坐标都为0 0 因此它的裁剪面是一个左下角点为 left bottom 右上角点为 right top 的矩形 2 透视投影voidglFrustum GLdoubleleft GLdoubleRight GLdoublebottom GLdoubletop GLdoublenear GLdoublefar 此函数创建一个透视投影矩阵 并且用这个矩阵乘以当前矩阵 它的参数只定义近裁剪平面的左下角点和右上角点的三维空间坐标 即 left bottom near 和 right top near 最后一个参数far是远裁剪平面的Z负值 其左下角点和右上角点空间坐标由函数根据透视投影原理自动生成 voidgluPerspective GLdoublefovy GLdoubleaspect GLdoublezNear GLdoublezFar 它也创建一个对称透视视景体 但它的参数定义于前面的不同 其操作是创建一个对称的透视投影矩阵 并且用这个矩阵乘以当前矩阵 参数fovy定义视野在X Z平面 垂直方向上的可见区域 的角度 范围是 0 0 180 0 参数aspect是投影平面的纵横比 宽度与高度的比值 参数zNear和Far分别是远近裁剪面沿Z负轴到视点的距离 6 高级矩阵处理glfloatm 1 0f 0 0f 3 0f 0 0f 0 0f 1 0f 0 0f 1 0f 0 0f 0 0f 1 0f 1 0f 0 0f 0 0f 0 0f 1 0f glMatrixMode GL MODELVIEW glLoadMatrixf m 当光照射到一个物体表面上时 会出现三种情形 首先 光可以通过物体表面向空间反射 产生反射光 其次 对于透明体 光可以穿透该物体并从另一端射出 产生透射光 最后 部分光将被物体表面吸收而转换成热 在上述三部分光中 仅仅是透射光和反射光能够进入人眼产生视觉效果 四 光照处理 1 环境光 AmbientLight 环境光不来自于任何特殊的方向 他有光源 但是被周围的房间或场景多次反射 以致于变得没有方向 被环境光照射的物体表面的各个方向都均等受光 2 散射光 DiffuseLight 光来自某个方向 被物体表面均匀地反射 光是被均匀反射回去的 它直射的物体表面比从某个角度照射过来时要亮 3 镜面光 SpecularLight 镜面光也有方向性 但被强烈地反射到另一特定的方向 高亮度的镜面光能够在被照射的物体表面上产生称之为亮斑的亮点 任何一个光源都是由环境光 散射光和镜面光三种光照成分组成 各成分的定义是由RGBA值定义的 5 材质OpenGL用材料对光的红 绿 蓝三原色的反射率来近似定义材料的颜色 象光源一样 材料颜色也分成环境 漫反射和镜面反射成分 它们决定了材料对环境光 漫反射光和镜面反射光的反射程度 在进行光照计算时 材料对环境光的反射率与每个进入光源的环境光结合 对漫反射光的反射率与每个进入光源的漫反射光结合 对镜面光的反射率与每个进入光源的镜面反射光结合 材质的颜色实际决定了反射光与入射光的百分比率 若OpenGL的光源颜色为 LR LG LB 材质颜色属性为 MR MG MB 那么 最终到达眼睛的光的颜色为 LR MR LG MG LB MB 三种光照成分的RGBA值叠加就形成了物体最终的颜色 当任何一种颜色成分大于1 0 就用1 0计算 6 加入光照 1 glEnable GL LIGHTING 指定OpenGL可以利用材质属性和光照参数决定场景中每个顶点的颜色 2 glLightModelfv f i iv Glenumpname constGLfloat param 指定光照模型GL LIGHT MODEL AMBIENT 设置环境光GL LIGHT MODEL LOCAL VIEWER 定义视点 0表示镜面反射角度认为视线方向平行于z轴负向 否则镜面反射从视点坐标系的原点来计算 GL LIGHT MODEL TWO SIDE 启用双面关照 0 0时表示只有多边形表面的正面进行光照计算 否则正反两面都进行光照计算 3 glMaterialfv GLenumface GLenumpname constGLfloat params Face参数 GL FRONT GL BACK GL FRONT AND BACK Pname参数 GL AMBIENT 材质环境反射RGBA值 GL DIFFUSE 材质漫反射RGBA值 GL SPECULAR 材质镜面反射RGBA值 GL SHININESS 材质的RGBA镜面指数 4 glEnable GL COLOR MATERIAL 启用颜色跟踪法 此时可以通过glColor设置材质属性 5 glColorMaterial Glenumface Glenummode mode 指定哪个材质属性能够遵循当前的颜色 GL EMISSION GL AMBIENT GL DIFFUSE GL SPECULAR GL AMBIENT AND DIFFUSE 7 使用点光源OpenGL支持8种独立光源 它们可以放置在场景中的任意位置 也可放在视见空间之外 当将光源放在无穷远处就可以得到平行的光线 光源发射光线射到多边形的表面 与平面成角度A 在以角度B反射进入观察者 通过这些角度可以计算光线照射的多边形表面的颜色 OpenGL有意让计算的位置就是多边形的顶点 通过计算各个顶点的颜色 再在各个顶点间进行光滑着色 1 法线矢量从假想的平面 或者是多边形 上的一个顶点引出来的一条垂直向上的线称为法线矢量 glNormal3f GLfloatx GLfloaty GLfloatz 指定法线矢量 OpenGL最后都将表面法线转化成单位法线 对于光照计算 所有的法线矢量都必须归一化 glEnable GL NORMALIZE glEnable GL RESCALE NORMALS 法线矢量的计算 2 设置光源参数glLightf GLenumlight GLenumpname GLenumparam light 光源编号 pname 指定光源参数类型GL AMBIENT 光照的环境RGBA浓度 GL DIFFUSE 光照的漫射RGBA浓度 GL SPECULAR 光照的镜面RGBA浓度 3 镜面光处理使用glLightfv函数在光源中加入镜面光成分 为了出现镜面光效果 还要在材质属性中增加镜面成分 镜面指数 glMateriali GL FRONT GL SHININESS 128 GL SHININESS属性设置材质的镜面指数 它说明如何确定镜面关亮斑的大小和聚焦程度 4 光的衰减真实的光 离光源越远则光强越小 OpenGL的光衰减是通过光源的发光量乘以衰减因子计算出来的 缺省状态下 常数衰减因子是 1 0 0 0 0 0 用户也可以自己定义这些值 如 glLightf GL LIGHT0 GL CONSTANT ATTENUATION 2 0 glLightf GL LIGHT0 GL LINEAR ATTENUATION 1 0 glLightf GL LIGHT0 GL QUADRATIC ATTENUATION 0 5 注意 环境光 漫反射光和镜面光的强度都衰减 只有辐射光和全局环境光的强度不衰减 5 聚光和多光源定位光源可以定义成聚光灯形式 即将光的形状限制在一个圆锥内 OpenGL中聚光的定义有以下几步 a 定义聚光源位置 因为聚光源也是定向光源 所以他的位置同一般定向光一样 如 GLfloatlight pos 1 0 1 0 1 0 1 0 glLightfv GL LIGHT0 LIGHT POSITION light pos light pos参数的最后一个分量为0 则光源为方向光源 分量为1 则光源为平行于负z轴的方向光源 b 定义聚光截止角 参数GL SPOT CUTOFF给定光锥的轴与中心线的夹角 也可说成是光锥顶角
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国复合饮料稳定添加剂行业市场分析及投资价值评估前景预测报告
- 第一章 第一节 《疆域》说课稿2025-2026学年人教版初中地理八年级上册
- 零件的弯曲说课稿中职专业课-钳工加工技术-机械制造技术-装备制造大类
- 高等院校考试题目及答案
- 三年级上册道德与法治教学设计-2.1我和小伙伴 ∣北师大版
- 2024年春八年级生物下册 8.1.2 免疫与计划免疫说课稿 (新版)新人教版
- 2025年健身教练中级考试题库及模拟题答案解析
- 2025年医药流通领域物流专员面试模拟题集
- 2025年健康管理师初级专业基础能力测试卷
- 2025年乡村手工艺合作社招聘面试题预测及解析
- 广东省深圳市罗湖区2025-2026学年高三第一学期开学质量检测语文(含答案)
- 基于PLC的果园灌溉施肥系统设计
- 2025年武汉市中考英语试卷真题(含答案)
- 无人机清洗玻璃幕墙技术规范
- 基于人工智能的个性化学习路径研究
- 浙江省舟山市2024-2025学年高二下学期6月期末物理+答案
- 2025年陕西省中考英语试题卷(含答案及解析)
- 2025年中国咖啡行业行业市场调查研究及投资前景预测报告
- 学前卫生考试试题及答案
- 2025春季学期国开电大专科《液压与气压传动》一平台在线形考(形考任务+实验报告)试题及答案
- 2025年戏剧与影视学专业考研试题及答案
评论
0/150
提交评论