第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
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.8 mipmap:多重细节层 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.2 alpha测试 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章 求值器和NURB S 360
12.1前提条件 360
12.2求值器 361
12.2.1一维求值器 361
12.2.2二维求值器 365
12.2.3使用求值器进行纹理处理 369
12.3 GLU的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.2 OpenGL版本 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.19 Dirichlet域 420
14.20使用模板缓冲区实现生存游戏 421
14.21 glDrawPixels()和glCopyPixels()的其他应用 422
第15章OpenGL着色语言 424
15.1 OpenGL图形管线和可编程着色器 424
15.1.1顶点处理 425
15.1.2片断处理 426
15.2使用GLSL着色器 427
15.2.1着色器示例 427
15.2.2 OpenGL/GLSL接口 428
15.3 OpenGL着色语言 432
15.4使用GLSL创建着色器 433
15.4.1程序起点 433
15.4.2声明变量 433
15.4.3聚合类型 434
15.5 uniform块 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
附录A? GLUT (OpenGL实用工具库)基础知识 464
附录B状态变量 468
附录C齐次坐标和变换矩阵 495
附录D OpenGL和窗口系统 499
术语表 511