译者序
OpenGL 是图形硬件的一种软件接口。从本质上说,它是一个 3D 图形和模型库,具有高度
的可移植性,并且具有非常快的渲染速度。如今,OpenGL 广泛应用于游戏、医学影像、地
理信息、气象模拟等领域,是高性能图形和交互性场景处理的行业标准。
OpenGL 的前身是 SGI 公司开发的 IRIS GL 图形函数库。SGI 是一家久负盛名的公司,在计算
机图形和动画领域处于业界领先地位。IRIS GL 最初是一个 2D 图形函数库,后来逐渐演化为
SGI 的高端 IRIS 图形工作站所使用的 3D 编程 API。后来,由于图形技术的发展,SGI 对 IRIS GL
的移植性进行了改进和提高,使它逐步发展成如今的 OpenGL。在此期间,OpenGL 得到了各
大厂商的支持,从而成为一种广泛流行的三维图形标准。
OpenGL 并不是一种编程语言,而更像是一个 C 运行时函数库。它提供了一些预包装的功能,
帮助开发人员编写功能强大的三维图形应用程序。OpenGL 可以在多种操作系统平台上运行,
例如各种版本的 Windows、UNIX/Linux、Mac OS 和 OS/2 等。
OpenGL 是一个开放的标准,虽然它由 SGI 首创,但是它的标准并不控制在 SGI 的手中,而
是由 OpenGL 体系结构审核委员会(ARB)掌管。ARB 由 SGC、DEC、IBM、Intel 和 Microsoft
等著名公司于 1992 年创立,后来又陆续添加了 nVidia、ATI 等图形芯片领域的巨擎。ARB 每
隔 4 年举行一次会议,对 OpenGL 规范进行维护和改善,并出台计划对 OpenGL 标准进行升
级,使 OpenGL 一直保持与时代同步。
2006 年,SGI 公司把 OpenGL 标准的控制从 ARB 移交给一个新的工作组—Khronos 小组
(www.khronos.org)。 Khronos 是一个由成员提供资金的行业协会,专注于开放媒体标准的
创建和维护。目前,Khronos 负责 OpenGL 的发展和升级。
《OpenGL 编程指南》就是由 Khronos 小组编写的官方指南,是 OpenGL 领域的权威著作,
有“OpenGL 红宝书”之称,曾经帮助许多程序员走上了 OpenGL 专家之路。第 7 版在第 6
版的基础上又有所改进,介绍了 OpenGL 3.0 和 OpenGL 3.1 的新的和更新的内容。
本书历经多次版本升级,其中文版的翻译也是一项延续性的工作,凝结了许多人的辛勤工作。
徐波等曾承担《OpenGL 编程指南》第 5 版和第 6 版的主要翻译工作。李军在第 6 版的中文
版的基础上,负责了第 7 版新增内容的翻译和更新工作。参与第 7 版翻译工作的还有刘金华、
刘伟超、罗庚臣、刘二然、郑芳菲、庄逸川、王世高、郭莹、陈、邓勇、何进伟、贾晓斌、
汪蔚和齐国涛。机械工业出版社华章分社的编辑为本书的出版付出了辛勤劳动,感谢他们!
译者
2009 年 10 月
目录
译者序
前言
第 1 章 OpenGL 简介 ........................................................................1
1.1 什么是 OpenGL .......................................................................1
1.2 一段简单的 OpenGL 代码 ..............................................................3
1.3 OpenGL 函数的语法 ..................................................................4
1.4 OpenGL 是一个状态机 ................................................................6
1.5 OpenGL 渲染管线 ....................................................................6
1.5.1 显示列表 ......................................................................7
1.5.2 求值器 ........................................................................7
1.5.3 基于顶点的操作 .............................................................7
1.5.4 图元装配 ......................................................................7
1.5.5 像素操作 ......................................................................8
1.5.6 纹理装配 ......................................................................8
1.5.7 光栅化 ........................................................................8
1.5.8 片断操作 ......................................................................8
1.6 与 OpenGL 相关的函数库 ..............................................................9
1.6.1 包含文件 ......................................................................9
1.6.2 OpenGL 实用工具库(GLUT) .........................................10
1.7 动画...............................................................................13
1.7.1 暂停刷新 ....................................................................14
1.7.2 动画=重绘+交换 ...........................................................15
1.8 OpenGL 及其废弃机制 ..............................................................17
1.8.1 OpenGL 渲染环境 ..........................................................17
1.8.2 访问 OpenGL 函数 ........................................................18
第 2 章 状态管理和绘制几何物体 ................................................... 19
2.1 绘图工具箱 ........................................................................20
2.1.1 清除窗口 ....................................................................20
2.1.2 指定颜色 .....................................................................22
2.1.3 强制完成绘图操作 .......................................................23
2.1.4 坐标系统工具箱 ...........................................................24
2.2 描述点、直线和多边形 .............................................................25
2.2.1 什么是点、直线和多边形 ............................................25
2.2.2 指定顶点.....................................................................27
2.2.3 OpenGL 几何图元 ..........................................................27
2.3 基本状态管理......................................................................31
2.4 显示点、直线和多边形 ..............................................................32
2.4.1 点的细节 ....................................................................32
2.4.2 直线的细节 ...................................................................33
2.4.3 多边形的细节 ...............................................................36
2.5 法线向量 ..........................................................................41
2.6 顶点数组 ..........................................................................43
2.6.1 步骤 1:启用数组 .........................................................44
2.6.2 步骤 2:指定数组的数据 .............................................44
2.6.3 步骤 3:解引用和渲染 ..................................................46
2.6.4 重启图元 ....................................................................51
2.6.5 实例化绘制 ...................................................................53
2.6.6 混合数组 ....................................................................54
2.7 缓冲区对象 ........................................................................57
2.7.1 创建缓冲区对象 ...........................................................57
2.7.2 激活缓冲区对象 ...........................................................58
2.7.3 用数据分配和初始化缓冲区对象 ................................58
2.7.4 更新缓冲区对象的数据值 ............................................60
2.7.5 在缓冲区对象之间复制数据 ........................................62
2.7.6 清除缓冲区对象 ...........................................................63
2.7.7 使用缓冲区对象存储顶点数组数据 ............................63
2.8 顶点数组对象 ......................................................................65
2.9 属性组 ............................................................................69
2.10 创建多边形表面模型的一些提示 ...............................................71
第 3 章 视图 .............................................................................77
3.1 简介:用照相机打比方 ...............................................................78
3.1.1 一个简单的例子:绘制立方体 .....................................80
3.1.2 通用的变换函数 ...........................................................83
3.2 视图和模型变换 ....................................................................84
3.2.1 对变换进行思考 ...........................................................85
3.2.2 模型变换 ...................................................................86
3.2.3 视图变换 ....................................................................89
3.3 投影变换 ..........................................................................93
3.3.1 透视投影 ....................................................................94
3.3.2 正投影 .......................................................................95
3.3.3 视景体裁剪 ...................................................................96
3.4 视口变换 ..........................................................................96
3.4.1 定义视口 ...................................................................96
3.4.2 变换深度坐标 ...............................................................97
3.5 和变换相关的故障排除 .............................................................98
3.6 操纵矩阵堆栈 .....................................................................100
3.6.1 模型视图矩阵堆栈 .....................................................101
3.6.2 投影矩阵堆栈 .............................................................102
3.7 其他裁剪平面 .....................................................................102
3.8 一些组合变换的例子 ..............................................................104
3.8.1 创建太阳系模型 .........................................................104
3.8.2 创建机器人手臂 .........................................................107
3.9 逆变换和模拟变换 ................................................................109
第 4 章 颜色 ................................................................................ 113
4.1 颜色感知 .........................................................................113
4.2 计算机颜色 .......................................................................114
4.3 RGBA 和颜色索引模式 ..............................................................115
4.3.1 RGBA 显示模式 ...........................................................116
4.3.2 颜色索引模式 .............................................................117
4.3.3 在 RGBA 和颜色索引模式中进行选择 ........................118
4.3.4 切换显示模式 .............................................................118
4.4 指定颜色和着色模型 ...............................................................119
4.4.1 在 RGBA 模式下指定颜色 ...........................................119
4.4.2 在颜色索引模式下指定颜色 ......................................120
4.4.3 指定着色模型 .............................................................121
第 5 章 光照 ............................................................................123
5.1 隐藏表面消除工具.................................................................124
5.2 现实世界和 OpenGL 光照 ...........................................................125
5.2.1 环境光、散射光、镜面光和发射光 ..............................125
5.2.2 材料颜色 ...................................................................126
5.2.3 光和材料的 RGB 值 ......................................................126
5.3 一个简单的例子:渲染光照球体 .................................................127
5.4 创建光源 .........................................................................129
5.4.1 颜色........................................................................130
5.4.2 位置和衰减 .................................................................131
5.4.3 聚光灯 ......................................................................132
5.4.4 多光源 ......................................................................133
5.4.5 控制光源的位置和方向 .............................................133
5.5 选择光照模型 ....................................................................138
5.5.1 全局环境光 .................................................................138
5.5.2 局部的观察点或无限远的观察点 ..............................138