1、OpenGL 图形编程入门文库帮手网 免费帮下载 百度文库积分 资料本文由 Joe_king520 贡献doc 文档可能在 WAP 端浏览体验不佳。建议您优先选择 TXT,或下载源文件到本机查看。一、OpenGL 与 3D 图形世界1.1、OpenGL 使人们进入三维图形世界 、 我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三 维空间描绘这些物体。我们又生活在一个充满信息的世界中,能否尽快地理解并运用这些信息将直接影响 事业的成败,所以我们需要用一种最直接的形式来表示这些信息。 最近几年计算机图形学的发展使得三维表现技术得以形成,这些三维表现技术使我
2、们能够再现三维世 界中的物体,能够用三维形体来表示复杂的信息,这种技术就是可视化(Visualization) 技术。可视化 技术使人能够在三维图形世界中直接对具有形体的信息进行操作,和计算机直接交流。这种技术已经把人 和机器的力量以一种直觉而自然的方式加以统 一,这种革命性的变化无疑将极大地提高人们的工作效率。 可视化技术赋予人们一种仿真的、三维的并且具有实时交互的能力,这样人们可以在三维图形世界中用以 前不可想象的手段来获取信息或发挥自己创造性的思维。机械工程师可以从二维平面图中得以解放直接进 入三维世界,从而很快得到自己设计的三维机械零件模型。 医生可以从病人的三维扫描图象分析病人的病
3、灶。军事指挥员可以面对用三维图形技术生成的战场地形,指挥具有真实感的三维飞机、军舰、坦克向目 标开进并分析 战斗方案的效果。 更令人惊奇的是目前正在发展的虚拟现实技术,它能使人们进入一个三维的、多媒体的虚拟世界,人 们可以游历远古时代的城堡,也 可以遨游浩翰的太空。所有这些都依赖于计算机图形学、计算机可视化技 术的发展。人们对计算机可视化技术的研究已经历了一个很长的历程,而且形成了许多可视 化工具,其中 SGI 公司推出的 GL 三维图形库表现突出,易于使用而且功能强大。利用 GL 开发出来的三维应用软件颇 受许多专业技术人员的喜爱,这些三维应用 软件已涉及建筑、产品设计、医学、地球科学、流体
4、力学等领 域。随着计算机技术的继续发展,GL 已经进一步发展成为 OpenGL,OpenGL 已被认为是高 性能图形和 交互式视景处理的标准,目前包括 ATT 公司 UNIX 软件实验室、IBM 公司、DEC 公司、SUN 公司、HP 公司、Microsoft 公司和 SGI 公司在内的几家在计算机市场占领导地位的大公司都采用了 OpenGL 图形 标准。 值得一提的是,由于 Microsoft 公司在 Windows NT 中提供 OpenGL 图形标准,OpenGL 将在微 机中广泛应用, 尤其是 OpenGL 三维图形加速卡和微机图形工作站的推出, 人们可以在微机上实现三维 图 形应用,
5、如 CAD 设计、仿真模拟、三维游戏等,从而更有机会、更方便地使用 OpenGL 及其应用软件来 建立自己的三维图形世界。 1.2、OpenGL 提供直观的三维图形开发环境 、 OpenGL 实际上是一种图形与硬件的接口。它包括了 120 个图形函数,开发者可以用这些函数来建 立三维模型和进行三维实时交互。与其他图形程序设计接 口不同,OpenGL 提供了十分清晰明了的图形 函数, 因此初学的程序设计员也能利用 OpenGL 的图形处理能力和 1670 万种色彩的调色板很快地设计出 三 维图形以及三维交互软件。 OpenGL 强有力的图形函数不要求开发者把三维物体模型的数据写成固定的数据格式,
6、这样开发者不 但可以直接使用自己的数据,而且可以利用其他不同格式的数据源。这种灵活性极大地节省了开发者的时 间,提高了软件开发效益。 长期以来,从事三维图形开发的技术人员都不得不在自己的程序中编写矩阵变换、外部设备访问等函 数,这样为调制这些与自己的软件开发目标关系并不十分密切的函数费脑筋,而 OpenGL 正是提供一种直 观的编程环境,它提供的一系列函数大大地简化了三维图形程序。例如:OpenGL 提供一系列的三维图形单元供开发者调用。 OpenGL 提供一系列的图形变换函数。OpenGL 提供一系列的外部设备访问函数,使开发者可以方便地访问鼠标、键盘、空间球、数据 手套等这种直观的三维图形
7、开发环境体现了 OpenGL 的技术优势, 这也是许多三维图形开发者热 衷于 OpenGL 的缘由所在。1.3、OpenGL 成为目前三维图形开发标准 、 OpenGL 成为目前三维图形开发标准在计算机发展初期,人们就开始从事计算机图形的开发。直到 计算机硬软件和计算机图形学高度发达的九十年代, 人们发 现复杂的数据以视觉的形式表现时是最易理解 的, 因而三维图形得以迅猛发展, 于是各种三维图形工具软件包相继推出, PHIGS、 如 PEX、 RenderMan 等。这些三维图形工具软件包有些侧重于使用方便,有些侧重于渲染效果或与应用软件的连接,但没有一 种三维工具软件包在交互式三维图形建 模
8、能力、 外部设备管理以及编程方便程度上能够 OpenGL 相比拟。 OpenGL 经过对 GL 的进一步发展,实现二维和三维的高级图形技术,在性 能上表现得异常优越,它 包括建模、变换、光线处理、色彩处理、动画以及更先进的能力,如纹理影射、物体运动模糊等。OpenGL 的这些能力为实现逼真的三 维渲染效果、建立交互的三维景观提供了优秀的软件工具。OpenGL 在硬件、 窗口、操作系统方面是相互独立的。 许多计算机公司已经把 OpenGL 集成到各种窗口和操作系统中, 其中操作系统包括 UNIX、 Windows NT、DOS 等,窗口系统有 X 窗口、Windows 等。为了实现一个完整功能的
9、图形处理系统,设计一个与 OpenGL 相关的系统结构为:其最底层是图形硬 件,第二层为操作系统,第三层为窗口系统,第四层为 OpenGL,第五层为应用软件。OpenGL 是网络透明的,在客户 服务器(Client-Server)体系结构 中,OpenGL 允许本地和远程绘图。所以在网络系统中,OpenGL 在 X 窗口、Windows 或其它窗口系统 下都可以以一个独立的图形窗口出现。 OpenGL 作为一个性能优越的图形应用程序设计界面(API) 而适合于广泛的计算环境,从个人计算 机到工作站和超级计算机,OpenGL 都能实现高性能的三维图形功能。由于许多在计算机界具有领导地位 的计算机
10、公司纷 纷采用 OpenGL 作为三维图形应用程序设计界面, OpenGL 应用程序具有广泛的移植性。 因此,OpenGL 已成为目前的三维图形开发标准,是从事三维 图形开发工作的技术人员所必须掌握的开 发工具。二、OpenGL 概念建立2.1、OpenGL 基本理解 、 OpenGL 是一个与硬件图形发生器的软件接口,它包括了 100 多个图形操作函数,开发者可以利用 这些函数来构造景物模型、进行三维图形交互软件的开 发。正如上一章所述,OpenGL 是一个高性能的 图形开发软件包。OpenGL 支持网络,在网络系统中用户可以在不同的图形终端上运行程序显示图形。OpenGL 作为一个与硬件独
11、立的图形接口,它不提供与硬件密切相关的设备操作函数,同时,它也不提供 描述类似于飞机、汽车、分子形状等复杂形体的图形操 作函数。用户必须从点、线、面等最基本的图形单 元开始构造自己的三维模型。当然,象 OpenInventor 那样更高一级的基于 OpenGL 的三维图形建 模开 发软件包将提供方便的工具。因此 OpenGL 的图形操作函数十分基本、灵活。例如 OpenGL 中的模型绘 制过程就多种多样,内容十分丰 富,OpenGL 提供了以下的对三维物体的绘制方式:网格线绘图方式(wireframe) 网格线绘图方式 这种方式仅绘制三维物体的网格轮廓线。深度优先网格线绘图方式(depth_c
12、ued) 深度优先网格线绘图方式 用网格线方式绘图,增加模拟人眼看物体一样,远处的物体比近处的物体要暗些。反走样网格线绘图方式(antialiased) 反走样网格线绘图方式 用网格线方式绘图,绘图时采用反走样技术以减少图形线条的参差不齐。平面消隐绘图方式(flat_shade) 平面消隐绘图方式 对模型的隐藏面进行消隐,对模型的平面单元按光照程度进行着色但不进行光滑处理。光滑消隐绘图方式(smooth_shade) 光滑消隐绘图方式 对模型进行消隐按光照渲染着色的过程中再进行光滑处理,这种方式更接近于现实。加阴影和纹理的绘图方式(shadows、textures) 加阴影和纹理的绘图方式 在
13、模型表面贴上纹理甚至于加上光照阴影,使得三维景观象照片一样。运动模糊的绘图方式(motion-blured) 运动模糊的绘图方式 模拟物体运动时人眼观察所感觉的动感现象。大气环境效果(atmosphere-effects) 大气环境效果 在三维景观中加入如雾等大气环境效果,使人身临其境。深度域效果(depth-of-effects) 深度域效果 类似于照相机镜头效果,模型在聚焦点处清晰,反之则模糊。这些三维物体绘图和特殊效果处理方式,说明 OpenGL 已经能够模拟比较复杂的三维物体或自然景 观,这就是我们所面对的 OpenGL。 2.2、OpenGL 工作流程 、 整个 OpenGL 的基本
14、工作流程如下图:其中几何顶点数据包括模型的顶点集、线集、多边形集,这些数据经过流程图的上部,包括运算器、 逐个顶点操作等;图像数据包括象素集、影像集、位图集等,图像象素数据的处理方式与几何顶点数据的 处理方式是不同的,但它们都经过光栅化、逐个片元(Fragment)处理直至把最后的光栅数据写入帧缓 冲器。 OpenGL 中的所有数据包括几何顶点数据和象素数据都可以被存储在显示列表中或者立即可以得 在 到处理。OpenGL 中,显示列表技术是一项重要的技术。 OpenGL 要求把所有的几何图形单元都用顶点来描述,这样运算器和逐个顶点计算操作都可以针对每 个顶点进行计算和操作,然后进行光栅化形成图
15、形碎片;对于象素数据,象素操作结果被存储在纹理组装 用的内存中,再象几何顶点操作一样光栅化形成图形片元。整个流程操作的最后,图形片元都要进行一系列的逐个片元操作,这样最后的象素值 BZ 送入帧缓冲 器实现图形的显示。 2.3、OpenGL 图形操作步骤 、 在上一节中说明了 OpenGL 的基本工作流程,根据这个流程可以归纳出在 OpenGL 中进行主要的图 形操作直至在计算机屏幕上渲染绘制出三维图形景观的基本步骤: 1)根据基本图形单元建立景物模型,并且对所建立的模型进行数学描述(OpenGL 中把:点、线、 多边形、图像和位图都作为基本图形单元) 。 2)把景物模型放在三维空间中的合适的位
16、置,并且设置视点(viewpoint)以观察所感兴趣的景观。 3)计算模型中所有物体的色彩,其中的色彩根据应用要求来确定,同时确定光照条件、纹理粘贴方式 等。 4)把景物模型的数学描述及其色彩信息转换至计算机屏幕上的象素,这个过程也就是光栅化 (rasterization) 。 在这些步骤的执行过程中,OpenGL 可能执行其他的一些操作,例如自动消隐处理等。另外,景物光 栅化之后被送入帧缓冲器之前还可以根据需要对象素数据进行操作。三、WindowsNT 下的 OpenGL3.1、Windows NT 下的 OpenGL 函数 、 如前面的章节所述,Windows NT 下的 OpenGL 同
17、样包含 100 多个库函数,这些函数都按一定的格 式来命名,即每个函数都以 gl 开头。Windows NT 下的 OpenGL 除了具有基本的 OpenGL 函数外,还 支持其他四类函数:相应函数 OpenGL 实用库 OpenGL 辅助库 Windows 专用库函数(WGL) Win32 API 函数具体说明 43 个函数,每个函数以 glu 开头。 31 个函数,每个函数以 aux 开头。 6 个函数,每个函数以 wgl 开头。 5 个函数,函数前面没有专用前缀。在 OpenGL 中有 115 个核心函数,这些函数是最基本的,它们可以在任何 OpenGL 的工作平台上应 用。这些函数用于
18、建立各种各样的形体, 产生光照效果,进行反走样以及进行纹理映射,进行投影变换等 等。由于这些核心函数有许多种形式并能够接受不同类型的参数,实际上这些函数可以派生出 300 多个 函数。 OpenGL 的实用函数是比 OpenGL 核心函数更高一层的函数,这些函数是通过调用核心函数来起作 用的。这些函数提供了十分简单 的用法,从而减轻了开发者的编程负担。OpenGL 的实用函数包括纹理 映射、坐标变换、多边形分化、绘制一些如椭球、圆柱、茶壶等简单多边形实体(本指南 将详细讲述这些 函数的具体用法)等。这部分函数象核心函数一样在任何 OpenGL 平台都可以应用。 OpenGL 的辅助库是一些特殊
19、的函数,这 些函数本来是用于初学者做简单的练习之用,因此这些函 数不能在所有的 OpenGL 平台上使用,在 Windows NT 环境下可以使用这些函数。这些函数使用简单, 它们可以用于窗口管理、输入输出处理以及绘制一些简单的三维形体。为了使 OpenGL 的应用程序具有良 好 的移植性,在使用 OpenGL 辅助库的时候应谨慎。6 个 WGL 函数是用于连接 OpenGL 与 Windows NT 的,这些函数用于在 Windows NT 环境下的 OpenGL 窗口能够进行渲染着色,在窗口内绘制位图字体以及把文本放在窗口的某一位置等。这些函数把 Windows 与 OpenGL 揉合在一
20、 起。最后的 5 个 Win32 函数用于处理象素存储格式和双缓冲区,显然这 些函数仅仅能够用于 Win32 系统而不能用于其它 OpenGL 平台。 3.2、OpenGL 基本功能 、 OpenGL 能够对整个三维模型进行渲染着色,从而绘制出与客观世界十分类似的三维景象。另外 OpenGL 还可以进行三维交互、动作模拟等。具体的功能主要有以下这些内容。模型绘制 OpenGL 能够绘制点、线和多边形。应用这些基本的形体,我们可以构造出几乎所有的三维模型。 OpenGL 通常用模型的多边形的顶点来描述三维模型。 如何通过多边形及其顶点来描述三维模型, 在指南的在后续章节会有详细的介绍。模型观察
21、在 建立了三维景物模型后,就需要用 OpenGL 描述如何观察所建立的三维模型。观察三维模型 是通过一系列的坐标变换进行的。 模型的坐标变换在使观察者能够在 视点位置观察与视点相适应 的三维模型景观。在整个三维模型的观察过程中,投影变换的类型决定观察三维模型的观察方式, 不同的投影变换得到的三维模型的景象 也是不同的。 最后的视窗变换则对模型的景象进行裁剪缩 放,即决定整个三维模型在屏幕上的图象。颜色模式的指定 OpenGL 应用了一些专门的函数来指定三维模型的颜色。程序员可以选择二个颜色模式,即 RGBA 模式和颜色表模式。在 RGBA 模式中,颜色直接由 RGB 值来指定;在 颜色表模式中
22、,颜 色值则由颜色表中的一个颜色索引值来指定。程序员还可以选择平面着色和光滑着色二种着色方 式对整个三维景观进行着色。光照应用 用 OpenGL 绘制的三维模型必须加上光照才能更加与客观物体相似。OpenGL 提供了管理四种 光(辐射光、环境光、镜面光和漫反射光)的方法,另外还可以指定模型表面的反射特性。图象效果增强 OpenGL 提供了一系列的增强三维景观的图象效果的函数,这些函数通过反走样、混合和雾化来 增强图象的效果。反走样用于改善图象中线段图形的锯齿而更平滑,混合用于处理模型的半透明 效果,雾使得影像从视点到远处逐渐褪色,更接近于真实。位图和图象处理 OpenGL 还提供了专门对位图和
23、图象进行操作的函数。纹理映射 三维景物因缺少景物的具体细节而显得不够真实,为了更加逼真地表现三维景物,OpenGL 提供 了纹理映射的功能。OpenGL 提供的一系列纹理映射函数使得开发者可以十分方便地把真实图象 贴到景物的多边形上,从而可以在视窗内绘制逼真的三维景观。实时动画 为了获得平滑的动画效果,需要先在内存中生成下一幅图象,然后把已经生成的图象从内存拷贝到屏幕上,这就是 OpenGL 的双缓存技术(double buffer) 。OpenGL 提供了双缓存技术的一 系列函数。交互技术 目前有许多图形应用需要人机交互,OpenGL 提供了方便的三维图形人机交互接口,用户可以选 择修改三维
24、景观中的物体。3.3、Windows NT 下 OpenGL 的结构 、 的结构 OpenGL 的作用机制是客户(client)/服务器(sever) 机制,即客户(用 OpenGL 绘制景物的应 用程序)向服务器(即 OpenGL 内核)发布 OpenGL 命令,服务器则解释这些命令。大多数情况下,客 户和服 务器在同一机器上运行。正是 OpenGL 的这种客户/服务器机制,OpenGL 可以十分方便地在网 络环境下使用。因此 Windows NT 下的 OpenGL 是网络透明的。正象 Windows 的图形设备接口(GDI) 把图形函数库封装在一个动态链接库(Windows NT 下的
25、GDI32.DLL)内一样,OpenGL 图形库也被封 装在一个动态链接库内 (OPENGL32.DLL)受客户应用程序调用的 OpenGL 函数都先在 OPENGL32.DLL 。 中处理, 然后传给服务器 WINSRV.DLL。 OpenGL 的命令再次得到处理并且直接传给 Win32 的设备驱动 接口(Device Drive Interface,DDI) ,这样就把经过处理的图形命令送给视频显示驱动程序。下图简要 说明这个过程:图 3-1 OpenGL 在 Windows NT 下运行机制 在三维图形加速卡的 GLINT 图形加速芯片的加速支持下, 二个附加的驱动程序被加入这个过程中。
26、 一 个 OpenGL 可安装客户驱动程序(Installable Client Driver,ICD)被加在客户这一边,一个硬件指定 DDI(Hardware-specific DDI)被加在服务器这边,这个驱动程序与 Wind32 DDI 是同一级别的。图 3-2 在三维图形加速下 OpenGL 运行机制四、OpenGL 基础程序结构用 OpenGL 编写的程序结构类似于用其他语言编写的程序。实际上,OpenGL 是一个丰富的三维图 形函数库, 编写 OpenGL 程序并非难事, 只需在基本 C 语言中调用这些函数, 用法同 Turbo C、 Microsoft C 等类似,但也有许多不同
27、之处。 本指南所有的程序都是在 Windows NT 的 Microsoft Visual C+集成环境下编译连接的,其中有 部分头文件和函数是为这个环境所用的,例如判别操作系统的头文件“glos.h” 。此外,为便于各类读者同 时快速入 门,在短时间内掌握 OpenGL 编程的基本方法和技巧,指南中例子尽量采用标准 ANSI C 调用 OpenGL 函数来编写,而且所有例程都只采用 OpenGL 附带的辅助库中的窗口系统。此外,这样也便于 程序在各平台间移植,尤其往工作站 UNIX 操作系统移植时,也只需改动头文件等很少很少的部分。下面 列出一个简单的 OpenGL 程序: 简单例程(Sim
28、ple.c) 例 4-1 OpenGL 简单例程#include #include #include “glos.h“void main(void) auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); auxInitPosition(0,0,500,500); auxInitWindow(“simple“);glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0); glRectf(-0.5,-0.5,0.5,0.5);glFlush(); _sleep(1
29、000); 这个程序运行结果是在屏幕窗口内画一个红色的方块。 下面具体分析整个程序结构:首先,在程序最开始处是 OpenGL 头文件:、 。前一 个是 gl 库的头文件,后一个是辅助库的头文件。此外,在以后的几章中还将说明 OpenGL 的另外两个头文件,一个是实用 库的头文件,另一个是X 窗口扩充库 的头文件(这个常用在工作站上) 。接下来是主函数 main()的定义:一般的程序结构 是先定义一个窗口:auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); auxInitPosition(0,0,500,500); auxInitWindow(“simple“);a
30、uxInitDisplayMode(AUX_SINGLE|AUX_RGBA)设置窗口显示模式为 RGBA 方式,即彩色方式, 并且图形缓存为单缓存(SINGLE BUFFER) 。 auxInitPosition(0, 0, 500, 500)定义窗口的初始位置,前两个参数(0, 0)为窗口的左上角点的屏幕坐标,后两个参数(500,500)为窗口的宽度和高度。 auxInitWindow(“simple“)是窗口初始化,字符 参数是窗口名称。 然后是窗口内清屏:glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT);第一句将窗口清
31、为黑色,第二句将颜色缓冲区清为 glClearColor(0.0, 0.0, 0.0, 0.0)命令所设置的 颜色,即同窗口背景颜色一致。 再接着是在窗口内画一个物体:glColor3f(1.0,0.0,0.0); glRectf(-0.5,-0.5,0.5,0.5);很明显,第一句设置物体颜色,函数中前三个参数分别为 R、G、B 值,最后一个参数是 Alpha 值, 范围都从 0 至 1;第二句绘制一个二维矩形。注意 注意:OpenGL 是针对三维图形而言,因此用作 OpenGL 注意 编程绘制物体必须意识到任何一个物体都是三维的,具有空间性,而显示于屏幕上的物体都是三维物体在 二维平面上的
32、投影。 从表面上看,上述程序代码很简单,实际上已经用到了缺省的投影形式(正射投影) 。再看 glFlush()函数,表示强制绘图完成。最后一句_sleep(1000),参数单位为毫秒,整句意思是保持现有状况一秒钟, 然后结束程序运行。这个函数是 VC+的库函数。 总而言之,OpenGL 程序基本结构为定义窗口、清理窗口、绘制物体、结束运行。五、OpenGL 的数据类型和函数名OpenGL 的数据类型定义可以与其它语言一致,但建议在 ANSI C 下最好使用以下定义的 数据类型,例如 GLint、GLfloat 等。具体类型见表 5-1。 前缀 数据类型 相应 C 语言类型 OpenGL 类型
33、= = b s i f d ub us ui 8-bit integer 16-bit integer 32-bit integer 32-bit floating-point 64-bit floating-point 8-bit unsigned integer signed char short long float double unsigned char GLbyte GLshort GLint,GLsizei GLfloat,GLclampf GLdouble,GLclampd GLubyte,GLboolean GLushort GLuint,GLenum,GLbitfield1
34、6-bit unsigned integer unsigned short 32-bit unsigned integer unsigned long表 5-1 命令前缀和参数数据类型 OpenGL 的库函数命名方式很有规律,了解这种规律后阅读和编写程序都比较容易方便。 首先,每个库函数有前缀 gl、glu、glx 或 aux,表示此函数分属于基本库、实用库、X 窗 口扩充库或辅助库,其后的函数名头字母大写,后缀是参数类型的简写,取 i、f,参见表 5-1。 例: glVertex2i(2,4); glVertex3f(2.0,4.0,5.0); 注意: 3、 2 3 4 注意 有的函数参数类
35、型后缀前带有数字 2、 4。 代表二维, 代表三维, 代表 alpha 值(以后介绍) 。 有些 OpenGL 函数最后带一个字母 v,表示函数参数可用一个指针指向一个向量(或数组) 来替代一系列单个参数值。下面两种格式都表示设置当前颜色为红色,二者等价。 glColor3f(1.0,0.0,0.0); float color_array=1.0,0.0,0.0; glColor3fv(color_array); 除了以上基本命名方式外,还有一种带“*”星号的表示方法,例如 glColor*(),它表示可以 用函数的各种方式来设置当前颜色。同理,glVertex*v()表示用一个指针指向所有类
36、型的向量 来定义一系列顶点坐标值。 最后,OpenGL 也定义 GLvoid 类型,如果用 C 语言编写,可以用它替代 void 类型。六、OpenGL 辅组库的基本使用OpenGL 是一个开放的系统,它是独立于任何窗口系统或操作系统的。尽管它包含了许多图形函数, 但它却没有窗口函数,也没有从键盘和鼠标读取事件的函 数,所以要初学者写出一个完整的图形程序是相 当困难的。另外,OpenGL 图形函数中只提供基本的几何原形:点、线、多边形,因此要创建基本的三维 几何体 如球、锥体等,也很不容易。而 OpenGL 辅助库就是为解决这些基本问题专门设计的,它提供了 一些基本的窗口管理函数和三维图形绘制
37、函数,能帮助初学者尽 快进入 OpenGL 世界,掌握关键的三维 图形技术,体会其中奇妙的乐趣。但是,对于复杂的应用,这些函数远远不够,只能作为参考。 6.1、辅助库函数分类 、 这一节内容可以作为手册查阅,初学者不必深究。 辅助库函数大致分为六类: 6.1.1 窗口初始化和退出 相关函数有三个,它们在第一章已提到,这里将详细介绍:void auxInitWindow(GLbyte *titleString) 打开一个由 auxInitDisplayMode()和 auxInitPosition()指定的窗口。函数参数是窗口标题,窗口 背景缺省颜色是 RGBA 下的黑色或颜色表(color_i
38、ndex)下的 0 号调色板的颜色。按下 Escape 键可以 完成关掉窗口、结束程序、全部清屏三项功能。void auxInitDisplayMode(GLbitfield mask) 设置窗口显示模式。基本模式有 RGBA 或颜色表、单或双缓存,也可指定其他附加模式:深度、模板 或累积缓存(depth,stencil,and/or accumulation buffer) 。参数 mask 是一组位标志的联合(取或) , AUX_RGBA 或 AUX_INDEX、AUX_SINGLE 或 AUX_DOUBLE,以及其它有效标志 AUX_DEPTH、 AUX_STENCIL 或 AUX_AC
39、CUM。void auxInitPosition(GLint x,GLint y,GLsizei width,GLsizei height) 设置窗口位置及大小。参数(x, y)为窗口的左上角点的屏幕坐标,参数(width, height)为窗口的 宽度和高度,单位为象素,缺省值为(0, 0, 100, 100) 。 6.1.2 窗口处理和事件输入 当窗口创建后,且在进入主函数循环之前,应当登记以下列出的回调函数(callback function):void auxReshapeFunc(void(*function)(GLsizei,GLsizei) 定义窗口改变时形状重定函数。参数 fu
40、nction 是一个函数指针,这个函数带有两个参数,即窗口改变后的新宽度和新高度。通常,function 是 glViewport(),显示裁减后的新尺寸,重定义投影矩阵,以 便使投影后图像的比例与视点匹配,避免比例失调。若不调用 auxReshapeFunc(),缺省重定物体形状 的函数功能是调用一个二维的正射投影矩阵。运用辅助库,窗口将在每个事件改变后自动重新绘制。void auxKeyFunction(GLint key,void(*function)(void) 定义键盘响应函数。 参数 function 就是当按下 key 键时所调用的函数指针, 辅助库为参数 key 定义 了几个常
41、量:AUX_0 至 AUX_9、 AUX_A 至 AUX_Z、AUX_a 至 AUX_z、AUX_LEFT、AUX_RIGHT、 AUX_UP、AUX_DOWN(方向键) 、 AUX_ESCAPE、AUX_SPACE 或 AUX_RETURN。void auxMouseFunc(GLint button,Glint mode,void(*function)(AUX_EVENTREC *) 定义鼠标响应函数。参数 function 就是当鼠标以 mode 方式作用于 button 时所调用的函数。参数 button 有 AUX_LEFTBUTTON、AUX_MIDDLEBUTTON 或 AUX_
42、RIGHTBUTTON(以右手为标准) 。 参数 mode 代表鼠标触击状态,击 中时为 AUX_MOUSEDOWN,释放时为 AUX_MOUSEUP。参数 function 必须带一个参数,它是指向结构 AUX_EVENNTREC 的指 针。当函数 auxMouseFunc()被调 用时将为这个结构分配相应的内存。通常用法类似如下:void function(AUX_EVENTREC *event) GLint x,y; x=event-dataAUX_MOUSEX; y=event-dataAUX_MOUSEY; 6.1.3 颜色表装入 因为 OpenGL 本身没有窗口系统,所以依赖于窗口
43、系统的颜色映射就没法装入颜色查找表。如果采用 颜色表模式,就要用到辅助库提供的用 RGB 值定义的单个颜色索引函数:void auxSetOneColor(GLint index,GLfloat red,GLfloat green,GLfloat blue) 设置自定义颜色的索引。参数 index 即索引号,参数 red、green、blue 分别为红、绿、蓝值,范围 在(01)内。 6.1.4 三维物体绘制 每组三维物体包括两种形式:网状体(wire)和实心体(solid) 。网状体没有平面法向,而实心体有, 能进行光影计算,有光照时采用实心体模型。下面这些函数的 参数都是定义物体大小的,可
44、以改变。 功能 绘制球 函数 void auxWireSphere(GLdouble radius) void auxSolidSphere(GLdouble radius) 绘制立方体 void auxWireCube(GLdouble size) void auxSolidCube(GLdouble size)void auxWireBox(GLdouble width,GLdouble height,GLdouble 绘制长方体 depth) void auxSolidBox(GLdouble width,GLdouble height,GLdouble depth) 绘制环形圆纹面 v
45、oid auxWireTorus(GLdouble innerRadius,GLdouble outerRadius) void auxSolidTorus(GLdouble innerRadius,GLdouble outerRadius) 绘制圆柱 void auxWireCylinder(GLdouble radius,GLdouble height) void auxSolidCylinder(GLdouble radius,GLdouble height) 绘制二十面体 void auxWireIcosahedron(GLdouble radius) void auxSolidIco
46、sahedron(GLdouble radius) 绘制八面体 void auxWireOctahedron(GLdouble radius) void auxSolidOctahedron(GLdouble radius) 绘制四面体 void auxWireTetrahedron(GLdouble radius) void auxSolidTetrahedron(GLdouble radius) 绘制十二面体 void auxWireDodecahedron(GLdouble radius) void auxSolidDodecahedron(GLdouble radius) 绘制圆锥 v
47、oid auxWireCone(GLdouble radius,GLdouble height) void auxSolidCone(GLdouble radius,GLdouble height) 绘制茶壶 void auxWireTeapot(GLdouble size) void aucSolidTeapot(GLdouble size) 表 6-1以上物体均以各自中心为原点绘制,所有坐标都已单位化,可以缩放。 6.1.5 背景过程管理void auxIdleFunc(void *func) 定义空闲状态执行函数。参数 func 是一个指针,指向所要执行的函数功能。当它为零时,func
48、执行 无效。 6.1.6 程序运行void auxMainLoop(void(*displayFunc)(void) 定义场景绘制循环函数。displayFunc 指针指向场景绘制函数。当窗口需要更新或场景发生改变时, 程序便调用它所指的函数,重新绘制场景。 6.2、辅助库应用示例 、辅助库应用示例 下面举一个辅助库的应用例子,testaux.c: 例 6-1 辅助库应用例程 testaux.c#include “glos.h“ #include #include void myinit(void); void CALLBACK myReshape(GLsizei w,GLsizei h);
49、void CALLBACK display(void); void myinit(void) glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); void CALLBACK myReshape(GLsizei w,GLsizei h) glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w #include void myinit(void); void DrawMyObjects(void); void CALLBACK myReshape(GLsizei w,GLsizei h); void CALLBACK display(void); void myinit(void) glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glShadeModel(GL_FLAT); void CALLBACK myReshape(GL