本书对OpenGL以及OpenGL实用函数库进行了全面而又权威的介绍,素有“OpenGL红宝书”之誉。本书的上一个版本覆盖了到OpenGL 2.1版的内容。本版涵盖了OpenGL 3.0和3.1的最新特性。本书以清晰的语言描述了OpenGL的功能以及许多基本的计算机图形技巧,例如创建和渲染3D模型、从不同的透视角度观察物体、使用着色、光照和纹理贴图使场景更加逼真等。另外,本书还深入探讨了许多高级技巧,包括纹理贴图、抗锯齿、雾和大气效果、NURBS、图像处理子集等。此外,本书还对一些重要的主题进行了讨论,例如提高性能、OpenGL扩展以及跨平台技术等。
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版翻译工作的还有刘金华、刘伟超、罗庚臣、刘二然、郑芳菲、庄逸川、王世高、郭莹、陈、邓勇、何进伟、贾晓斌、汪蔚和齐国涛。机械工业出版社华章分社的编辑为本书的出版付出了辛勤劳动,感谢他们!
封面图
目录
- 译者序
- 前言
- 第1章OpenGL简介1
- 1.1什么是OpenGL1
- 1.2一段简单的OpenGL代码3
- 1.3OpenGL函数的语法4
- 1.4OpenGL是一个状态机6
- 1.5OpenGL渲染管线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.2OpenGL实用工具库(GLUT)10
- 1.7动画13
- 1.7.1暂停刷新14
- 1.7.2动画=重绘+交换15
- 1.8OpenGL及其废弃机制17
- 1.8.1OpenGL渲染环境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.3OpenGL几何图元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.3RGBA和颜色索引模式115
- 4.3.1RGBA显示模式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
- 5.5.3双面光照139
- 5.5.4镜面辅助颜色139
- 5.5.5启用光照140
- 5.6定义材料属性140
- 5.6.1散射和环境反射141
- 5.6.2镜面反射141
- 5.6.3发射光颜色142
- 5.6.4更改材料属性142
- 5.6.5颜色材料模式143
- 5.7和光照有关的数学知识146
- 5.7.1材料的发射光147
- 5.7.2经过缩放的全局环境光147
- 5.7.3光源的贡献147
- 5.7.4完整的光照计算公式148
- 5.7.5镜面辅助颜色148
- 5.8颜色索引模式下的光照149
- 第6章混合、抗锯齿、雾和多边形偏移151
- 6.1混合152
- 6.1.1源因子和目标因子152
- 6.1.2启用混合154
- 6.1.3使用混合方程式组合像素154
- 6.1.4混合的样例用法156
- 6.1.5一个混合的例子157
- 6.1.6使用深度缓冲区进行三维混合159
- 6.2抗锯齿162
- 6.2.1对点和直线进行抗锯齿处理164
- 6.2.2使用多重采样对几何图元进行抗锯齿处理169
- 6.2.3对多边形进行抗锯齿处理172
- 6.3雾172
- 6.3.1使用雾173
- 6.3.2雾方程式175
- 6.4点参数181
- 6.5多边形偏移182
- 第7章显示列表185
- 7.1为什么使用显示列表185
- 7.2一个使用显示列表的例子186
- 7.3显示列表的设计哲学188
- 7.4创建和执行显示列表189
- 7.4.1命名和创建显示列表191
- 7.4.2存储在显示列表里的是什么191
- 7.4.3执行显示列表193
- 7.4.4层次式显示列表193
- 7.4.5管理显示列表索引194
- 7.5执行多个显示列表194
- 7.6用显示列表管理状态变量199
- 第8章绘制像素、位图、字体和图像202
- 8.1位图和字体203
- 8.1.1当前光栅位置204
- 8.1.2绘制位图205
- 8.1.3选择位图的颜色206
- 8.1.4字体和显示列表206
- 8.1.5定义和使用一种完整的字体207
- 8.2图像209
- 8.3图像管线215
- 8.3.1像素包装和解包216
- 8.3.2控制像素存储模式217
- 8.3.3像素传输操作219
- 8.3.4像素映射221
- 8.3.5放大、缩小或翻转图像222
- 8.4读取和绘制像素矩形224
- 8.5使用缓冲区对象存取像素矩形数据227
- 8.5.1使用缓冲区对象传输像素数据227
- 8.5.2使用缓冲区对象提取像素数据228
- 8.6提高像素绘图速度的技巧229
- 8.7图像处理子集230
- 8.7.1颜色表231
- 8.7.2卷积234
- 8.7.3颜色矩阵240
- 8.7.4柱状图241
- 8.7.5最小最大值243
- 第9章纹理贴图245
- 9.1概述和示例248
- 9.1.1纹理贴图的步骤248
- 9.1.2一个示例程序249
- 9.2指定纹理251
- 9.2.1纹理代理255
- 9.2.2替换纹理图像的全部或一部分257
- 9.2.3一维纹理259
- 9.2.4三维纹理261
- 9.2.5纹理数组264
- 9.2.6压缩纹理图像265
- 9.2.7使用纹理边框267
- 9.2.8mipmap:多重细节层267
- 9.3过滤275
- 9.4纹理对象277
- 9.4.1命名纹理对象277
- 9.4.2创建和使用纹理对象278
- 9.4.3清除纹理对象280
- 9.4.4常驻纹理工作集280
- 9.5纹理函数282
- 9.6分配纹理坐标284
- 9.6.1计算正确的纹理坐标285
- 9.6.2重复和截取纹理286
- 9.7纹理坐标自动生成289
- 9.7.1创建轮廓线289
- 9.7.2球体纹理293
- 9.7.3立方图纹理294
- 9.8多重纹理296
- 9.9纹理组合器函数299
- 9.10在纹理之后应用辅助颜色303
- 9.10.1在禁用光照时使用辅助颜色303
- 9.10.2启用光照后的辅助镜面颜色303
- 9.11点块纹理303
- 9.12纹理矩阵堆栈304
- 9.13深度纹理305
- 9.13.1创建阴影图306
- 9.13.2生成纹理坐标并进行渲染307
- 第10章帧缓冲区309
- 10.1缓冲区及其用途310
- 10.1.1颜色缓冲区311
- 10.1.2清除缓冲区312
- 10.1.3选择用于读取和写入的颜色缓冲区313
- 10.1.4缓冲区的屏蔽315
- 10.2片断测试和操作316
- 10.2.1裁剪测试316
- 10.2.2alpha测试317
- 10.2.3模板测试318
- 10.2.4深度测试322
- 10.2.5遮挡查询322
- 10.2.6条件渲染324
- 10.2.7混合、抖动和逻辑操作325
- 10.3累积缓冲区327
- 10.3.1运动模糊328
- 10.3.2景深328
- 10.3.3柔和阴影331
- 10.3.4微移331
- 10.4帧缓冲区对象332
- 10.4.1渲染缓冲区333
- 10.4.2复制像素矩形340
- 第11章分格化和二次方程表面342
- 11.1多边形分格化342
- 11.1.1创建分格化对象343
- 11.1.2分格化回调函数343
- 11.1.3分格化属性347
- 11.1.4多边形定义350
- 11.1.5删除分格化对象352
- 11.1.6提高分格化性能的建议352
- 11.1.7描述GLU错误352
- 11.1.8向后兼容性352
- 11.2二次方程表面:渲染球体、圆柱体和圆盘353
- 11.2.1管理二次方程对象354
- 11.2.2控制二次方程对象的属性354
- 11.2.3二次方程图元355
- 第12章求值器和NURBS360
- 12.1前提条件360
- 12.2求值器361
- 12.2.1一维求值器361
- 12.2.2二维求值器365
- 12.2.3使用求值器进行纹理处理369
- 12.3GLU的NURBS接口371
- 12.3.1一个简单的NURBS例子371
- 12.3.2管理NURBS对象374
- 12.3.3创建NURBS曲线或表面377
- 12.3.4修剪NURBS表面380
- 第13章选择和反馈383
- 13.1选择383
- 13.1.1基本步骤384
- 13.1.2创建名字栈384
- 13.1.3点击记录385
- 13.1.4一个选择例子386
- 13.1.5挑选389
- 13.1.6编写使用选择的程序的一些建议397
- 13.2反馈398
- 13.2.1反馈数组399
- 13.2.2在反馈模式下使用标记400
- 13.2.3一个反馈例子400
- 第14章OpenGL高级技巧404
- 14.1错误处理405
- 14.2OpenGL版本406
- 14.2.1工具函数库版本407
- 14.2.2窗口系统扩展版本407
- 14.3标准的扩展407
- 14.4实现半透明效果409
- 14.5轻松实现淡出效果409
- 14.6使用后缓冲区进行物体选择411
- 14.7低开销的图像转换411
- 14.8显示层次412
- 14.9抗锯齿字符413
- 14.10绘制圆点414
- 14.11图像插值414
- 14.12制作贴花415
- 14.13使用模板缓冲区绘制填充的凹多边形416
- 14.14寻找冲突区域416
- 14.15阴影417
- 14.16隐藏直线消除418
- 14.16.1使用多边形偏移实现隐藏直线消除418
- 14.16.2使用模板缓冲区实现隐藏直线消除419
- 14.17纹理贴图的应用419
- 14.18绘制深度缓冲的图像420
- 14.19Dirichlet域420
- 14.20使用模板缓冲区实现生存游戏421
- 14.21glDrawPixels()和glCopyPixels()的其他应用422
- 第15章OpenGL着色语言424
- 15.1OpenGL图形管线和可编程着色器424
- 15.1.1顶点处理425
- 15.1.2片断处理426
- 15.2使用GLSL着色器427
- 15.2.1着色器示例427
- 15.2.2OpenGL/GLSL接口428
- 15.3OpenGL着色语言432
- 15.4使用GLSL创建着色器433
- 15.4.1程序起点433
- 15.4.2声明变量433
- 15.4.3聚合类型434
- 15.5uniform块439
- 15.5.1在着色器中指定uniform变量440
- 15.5.2访问在uniform块中声明的uniform变量440
- 15.5.3计算不变性446
- 15.5.4语句446
- 15.5.5函数448
- 15.5.6在GLSL程序中使用OpenGL状态值449
- 15.6在着色器中访问纹理图像449
- 15.7着色器预处理器452
- 15.7.1预处理器指令452
- 15.7.2宏定义452
- 15.7.3预处理器条件453
- 15.7.4编译器控制453
- 15.8扩展处理454
- 15.9顶点着色器的细节454
- 15.10变换反馈458
- 15.11片断着色器462
- 附录AGLUT(OpenGL实用工具库)基础知识464
- 附录B状态变量468
- 附录C齐次坐标和变换矩阵495
- 附录DOpenGL和窗口系统499
- 术语表511