第一部分 经典OpenGL 3
第1章 3D图形和OpenGL简介 3
1.1 计算机图形的简单历史回顾 3
1.1.1 进入CRT 3
目录 3
1.1.2 走向3D 4
1.2 3D效果初探 6
1.2.1 透视(视角) 6
1.2.2 颜色和着色 6
1.2.3 光照和阴影 7
1.2.4 纹理贴图 7
1.2.5 雾 7
1.2.6 混和和透明 8
1.2.7 抗锯齿 8
1.3.1 实时3D 9
1.3 3D图形的常见用途 9
1.3.2 非实时3D 10
1.4 3D编程的基本原则 11
1.4.1 立即模式和保持模式(场景图) 11
1.4.2 坐标系统 11
1.4.3 投影(从3D到2D) 14
1.5 小结 16
第2章 使用OpenGL 17
2.1 什么是OpenGL 17
2.1.1 标准的演化 18
2.1.2 API战争 19
2.2 OpenGL的工作原理 22
2.2.1 泛型实现 22
2.2.2 硬件实现 23
2.3 OpenGL是API而不是编程语言 24
2.2.3 管线 24
2.4 API规范 25
2.4.1 数据类型 25
2.4.2 函数名约定 26
2.5 平台独立性 27
2.5.1 使用GLUT 27
2.5.2 设置编程环境 28
2.5.3 你的第一个程序 28
2.5.4 用OpenGL绘制形状 32
2.6 使用OpenGL和GLUT生成动画 37
2.7 OpenGL状态机 40
2.8 OpenGL错误 41
2.9 确认版本 42
2.10 调用glHint获得线索 42
2.11 使用扩展 42
2.11.2 这是谁的扩展 43
2.11.1 检查扩展 43
2.11.3 在Windows中使用OpenGL 1.1以后的版本 44
2.12 小结 44
2.13 参考 45
第3章 在空间中绘图(几何图元和缓冲区) 55
3.1 在3D 中绘制点 55
3.2 设置3D画布 56
3.3 3D空间中的点——顶点 57
3.4 绘制图形 58
3.5 设置点的大小 60
3.6 在3D空间中画直线 62
3.6.1 线带和线环 63
3.6.2 用直线构成近似曲线 64
3.6.3 设置直线的宽度 64
3.6.4 直线点画 66
3.7.2 环绕 68
3.7.1 三角形——第一种多边形 68
3.7 在3D空间中绘制三角形 68
3.7.3 三角形带 69
3.7.4 三角形扇 69
3.8 创建实心物体 70
3.8.1 设置多边形颜色 72
3.8.2 隐藏表面消除 72
3.8.3 剔除:隐藏表面,提高性能 73
3.8.4 多边形模式 75
3.9 其他图元 75
3.9.1 四条边的多边形——四边形 75
3.9.2 通用多边形 76
3.9.3 填充多边形,回顾点画 76
3.9.4 多边形创建规则 79
3.9.5 细分和边界 80
3.10.1 使用缓冲区目标 82
3.10 其他缓冲区技巧 82
3.10.2 操纵深度缓冲区 83
3.10.3 用剪刀进行裁剪 84
3.10.4 使用模版缓冲区 85
3.11 小结 88
3.12 参考 88
第4章 几何转换——管线 100
4.1 本章是不是枯燥的数学课 100
4.2 理解转换 101
4.2.1 视觉坐标 101
4.2.2 视图转换 102
4.2.3 模型转换 102
4.2.4 模型视图二元性 103
4.2.5 投影转换 104
4.2.6 视口转换 104
4.3.2 转换管线 105
4.3.1 什么是矩阵 105
4.3 矩阵——3D图形的数学基础 105
4.3.3 模型视图矩阵 106
4.3.4 单位矩阵 108
4.3.5 矩阵堆栈 109
4.3.6 一个原子例子 110
4.4 使用投影 112
4.4.1 投影 112
4.4.2 透视投影 113
4.4.3 一个远处缩小的例子 114
4.5 高级矩阵操作 116
4.5.1 载入矩阵 117
4.5.2 自己执行转换 118
4.5.3 把转换放在一起 120
4.6 使用照相机和角色在OpenGL中移动 121
4.6.1 角色帧 121
4.6.3 照相机管理 122
4.6.2 欧拉角:“卢克!请使用帧” 122
4.7 综合应用 123
4.8 小结 127
4.9 参考 128
第5章 颜色、材料和光照基础知识 134
5.1 什么是颜色 134
5.1.1 光的波性 134
5.1.2 光的粒子性 135
5.1.3 人眼作为光子检测器 136
5.1.4 计算机作为光子检测器 136
5.2 PC颜色硬件 137
5.3 PC显示模式 137
5.3.1 屏幕分辨率 138
5.3.2 颜色深度 138
5.4.1 颜色立方体 139
5.4 在OpenGL 中使用颜色 139
5.4.3 着色 140
5.4.2 设置绘图颜色 140
5.4.4 设置着色模型 142
5.5 现实世界的颜色 142
5.5.1 环境光 143
5.5.2 散射光 143
5.5.3 镜面光 143
5.5.4 综合考虑 143
5.6 现实世界的材料 144
5.6.1 材料属性 144
5.6.2 向材料添加光照 144
5.6.3 计算环境光效果 144
5.7 向场景添加光照 145
5.7.1 启用光照 145
5.6.4 散射和镜面光效果 145
5.7.2 设置光照模型 146
5.7.3 设置材料属性 146
5.8 使用光源 148
5.8.1 哪种方式最合适 148
5.8.2 表面法线 149
5.8.3 指定法线 149
5.8.4 单位法线 150
5.8.5 寻找法线 151
5.8.6 设置光源 152
5.8.7 设置材料属性 153
5.8.8 指定多边形 153
5.9 光照效果 154
5.9.1 镜面加亮 154
5.9.2 镜面光 154
5.9.3 镜面反射 155
5.9.4 镜面指数 156
5.9.5 法线均衡 157
5.10 综合讨论 158
5.10.1 创建亮点 158
5.10.2 绘制光点 159
5.11 阴影 162
5.11.1 什么是阴影 163
5.11.2 实现压平的代码 163
5.11.3 一个阴影例子 164
5.11.4 重新回顾球体世界 166
5.12 小结 167
5.13 参考 167
第6章 颜色和材料的更多细节 174
6.1 混合 174
6.1.1 组合颜色 174
6.1.3 抗锯齿 177
6.1.2 修改混合方程式 177
6.2 雾 181
6.3 累积缓冲区 183
6.4 其他颜色操作 185
6.4.1 颜色掩码 185
6.4.2 颜色逻辑操作 185
6.4.3 Alpha测试 186
6.4.4 抖动 186
6.5 小结 186
6.6 参考 187
第7章 OpenGL中的图像 191
7.1 位图 191
7.2 像素包装 195
7.3 像素图 196
7.3.1 经过包装的像素格式 198
7.3.2 一个颜色更丰富的例子 198
7.3.3 移动像素 200
7.3.4 保存像素 201
7.4 像素的更多乐趣 203
7.4.1 像素缩放 208
7.4.2 像素转移 208
7.4.3 像素映射 211
7.5 图像“子集” 212
7.6 小结 222
7.7 参考 223
第8章 纹理贴图基础知识 239
8.1 载入纹理 239
8.1.1 使用颜色缓冲区 242
8.1.2 更新纹理 242
8.2 将纹理贴图到几何图形 243
8.3 一个简单的2D例子 244
8.4 纹理环境 249
8.5 纹理参数 250
8.5.1 基本过滤 250
8.5.2 纹理环绕 251
8.5.3 带纹理的卡通 252
8.5.4 Mip贴图 256
8.6 纹理对象 259
8.7 小结 266
8.8 参考 266
第9章 纹理贴图高级知识 279
9.1 第二颜色 279
9.2 各向异性过滤 281
9.3 纹理压缩 282
9.3.1 压缩纹理 283
9.3.2 载入压缩纹理 284
9.4 纹理坐标生成 284
9.4.1 物体线性贴图 289
9.4.2 视觉线性贴图 290
9.4.3 球体贴图 291
9.4.4 立方体贴图 292
9.5 多重纹理 294
9.5.1 多重纹理坐标 295
9.5.2 一个多重纹理例子 295
9.6 纹理组合器 298
9.7 小结 300
9.8 参考 300
第10章 曲线和表面 306
10.1 内部支持的表面 306
10.1.1 设置二次方程状态 307
10.1.2 绘制二次方程图形 308
10.1.3 用二次方程进行建模 311
10.2 Bézier曲线和表面 312
10.2.1 参数方程表示形式 313
10.2.2 求值器 314
10.3 NURBS 321
10.3.1 从Bézier到B样条 321
10.3.2 结点 322
10.3.3 创建NURBS表面 322
10.3.4 NURBS属性 323
10.3.5 定义表面 323
10.3.6 修剪 324
10.3.7 NURBS表面 326
10.4 镶嵌 326
10.4.1 镶嵌器 327
10.4.2 镶嵌器回调函数 327
10.4.3 指定顶点数据 328
10.4.4 综合应用 328
10.6 参考 332
10.5 小结 332
11.1 模型装配101 353
第11章 这就是管线—更快的几何图形渲染 353
11.2 显示列表 363
11.2.1 批处理 363
11.2.2 预批处理 364
11.2.3 使用显示列表的一些注意事项 365
11.2.4 转换到显示列表 365
11.3 测量性能 366
11.4 顶点数组 370
11.4.1 载入几何图形 373
11.4.2 启用数组 374
1 1.4.3 数据在哪里 374
11.4.4 进行绘图 375
11.4.5 索引顶点数组 376
11.6 参考 385
11.5 小结 385
第12章 交互式图形 395
12.1 选择 395
12.1.1 为图元命名 396
12.1.2 在选择模式下工作 397
12.1.3 选择缓冲区 398
12.1.4 挑选 399
12.1.5 层次式挑选 401
12.1.6 反馈 404
12.1.7 反馈缓冲区 404
12.1.8 反馈数据 405
12.1.9 用户定义标记 405
12.2 一个反馈例子 406
12.2.1 对物体加上标签以便反馈 406
12.2.2 步骤1:选择物体 408
12.2.3 步骤2:从物体获取反馈信息 409
12.4 参考 411
12.3 小结 411
第二部分 OpenGL无处不在 417
第13章 Windows上的OpenGL Wiggle 417
13.1 Windows上的OpenGL实现 417
13.1.1 泛型OpenGL 418
13.1.2 可安装客户驱动程序(ICD) 418
13.1.3 Mini客户驱动程序(MCD) 418
13.1.4 Mini驱动程序 419
13.1.5 扩展OpenGL 419
13.2 基本的窗口渲染 420
13.2.1 GDI设备环境 420
13.2.2 像素格式 421
13.2.3 OpenGL渲染环境 426
13.3.1 创建窗口 427
13.3 综合应用 427
13.3.2 使用OpenGL渲染环境 430
13.3.3 其他Windows消息 433
13.4 Windows调色板 434
13.4.1 颜色匹配 434
13.4.2 调色板仲裁 435
13.4.3 为OpenGL创建调色板 436
13.4.4 调色板的创建和销毁 439
13.5 OpenGL和Windows字体 440
13.5.1 3D字体和文本 441
13.5.2 2D字体和文本 442
13.6 全屏渲染 444
13.6.1 创建一个无边框窗口 444
13.6.2 创建一个全屏窗口 445
13.7 多线程渲染 447
13.8.1 简单扩展 448
13.8 OpenGL和WGL扩展 448
13.8.2 使用新入口 449
13.8.3 WGL扩展 449
13.9 小结 470
13.10 参考 470
第14章 MacOS X上的OpenGL 482
14.1 基础知识 482
14.1.1 框架 482
14.1.2 使用GLUT API 483
14.2 使用AGL和CarbonAPI 483
14.2.1 像素格式 483
14.2.2 管理渲染环境 484
14.2.3 执行双缓冲渲染 485
14.2.4 你的第一个AGL程序 485
14.2.5 使用位图字体 494
14.3.1 NSOpenGL类 504
14.3 使用Cocoa API 504
14.3.2 你的第一个Cocoa程序 505
14.4 小结 512
14.5 参考 512
第15章 GLX:Linux上的OpenGL 516
15.1 基础知识 516
15.1.1 使用OpenGL和X11函数库 516
15.1.2 使用GLUT函数库 518
15.1.3 Linux上的OpenGL 518
15.1.4 OpenGL模拟:Mesa 519
15.2 X Window系统的OpenGL扩展 519
15.2.1 X Window系统基础知识 519
15.2.2 选择画面 519
15.2.3 管理OpenGL渲染环境 520
15.2.6 综合应用 521
15.2.5 双缓冲窗口 521
15.2.4 创建OpenGL窗口 521
15.3 为OpenGL创建位图字体 528
15.4 离屏渲染 537
15.4.1 使用GLX Pixmap 537
15.4.2 使用Pbuffer 541
15.5 使用Motif函数库 546
15.5.1 GLwDrawingArea和GLwMDrawingArea 546
15.5.2 回调资源 547
15.5.3 函数 548
15.5.4 综合应用 549
15.6 小结 557
15.7 参考 557
第三部分 下一代OpenGL 565
第16章 缓冲区对象 565
16.1.1 生成球状微粒云彩 566
16.1 顶点数组 566
16.1.2 启用顶点数组 567
16.1.3 使用更多的球体 568
16.2 迁移到缓冲区对象 569
16.2.1 缓冲区对象管理 570
16.2.2 用缓冲区对象进行渲染 571
16.3 把数据载入到缓冲区对象 571
16.3.1 把数据复制到缓冲区对象 571
16.3.2 直接映射缓冲区对象 572
16.4 补遗 575
16.5 小结 576
16.6 参考 576
第17章 遮挡查询 581
17.1 遮挡查询之前的世界 581
17.2 边框 584
17.3 对查询对象进行查询 587
17.5 参考 589
17.4 小结 589
第18章 深度纹理和阴影 593
18.1 作为光源 594
18.1.1 使场景正好占据整个窗口 594
18.1.2 去掉华而不实的东西 594
18.2 一种新类型的纹理 597
18.3 首先绘制阴影 597
18.4 然后是光照 598
18.4.1 投影阴影贴图:“为什么” 598
18.4.2 投影阴影贴图:“怎么做” 599
18.4.3 阴影比较 600
18.5 只用两个就够了 605
18.6 关于多边形偏移 606
18.7 小结 606
18.8 参考 607
19.1.1 固定的顶点处理 609
19.1 旧的被淘汰 609
第19章 可编程管线 609
19.1.2 固定的片断处理 611
19.2 新的占主导 612
19.2.1 可编程顶点着色器 612
19.2.2 固定功能胶水 614
19.2.3 可编程片断着色器 614
19.3 着色器扩展介绍 615
19.3.1 低层扩展 615
19.3.2 高层扩展 617
19.4 小结 618
第20章 低层着色(深入底层) 619
20.1 管理低层着色器 619
20.1.1 创建和绑定着色器 619
20.1.2 载入着色器 620
20.1.4 设置扩展 621
20.1.3 删除着色器 621
20.2.1 常用指令 622
20.2 指令集 622
20.2.2 专用于顶点的指令 623
20.2.3 专用于片断的指令 624
20.3 变量类型 624
20.3.1 临时变量 625
20.3.2 参数 625
20.3.3 属性 626
20.3.4 输出 628
20.3.5 别名 629
20.3.6 地址 629
20.4.2 输入Swizzle 630
20.4.4 输出限定 630
20.4.3 输出写入掩码 630
20.4.1 输入取负 630
20.4 输入和输出限定符 630
20.5 资源消耗和队列 631
20.5.1 解析器限制 631
20.5.2 本地限制 632
20.5.3 其他查询 633
20.6 着色器选项 633
20.6.1 位置不变性顶点选项 634
20.6.2 雾应用片段选项 634
20.6.3 精度提示片断选项 634
20.7 小结 634
20.8 参考 634
第21章 高层着色 644
21.1 管理高层着色器 644
21.1.1 着色器对象 644
21.1.2 程序对象 646
21.1.3 设置扩展 647
21.2 变量 648
21.2.1 基本类型 648
21.2.2 结构 649
21.2.3 数组 650
21.2.4 修饰符 650
21.2.5 内置的变量 650
21.3 表达式 651
21.3.1 操作符 651
21.3.2 数组访问 652
21.3.3 构造函数 652
21.3.4 成分选择 653
21.4 控制流 653
21.4.3 discard 654
21.4.4 函数 654
21.4.2 if/else 654
21.4.1 循环 654
21.5 小结 656
21.6 参考 657
第22章 顶点着色 668
22.1 初次试验 668
22.2 散射光照 670
22.3 镜面光照 672
22.4 改善镜面光照 674
22.5 基于顶点的雾 680
22.6 基于顶点的点大小 683
22.7 自定义的顶点转换 685
22.8 顶点混合 687
22.9 小结 691
23.1.1 灰度 692
23.1 颜色转换 692
第23章 片断着色器 692
23.1.2 调棕色 694
23.1.3 反色 694
23.1.4 热信号 696
23.1.5 基于片断的雾 697
23.2 图像处理 699
23.2.1 模糊 699
23.2.2 锐化 702
23.2.3 膨胀和侵蚀 703
23.2.4 边缘检测 705
23.3 光照 707
23.3.1 散射光照 707
23.3.2 多重镜面光照 710
23.4 过程纹理贴图 714
23.4.1 棋盘纹理 714
23.4.2 沙滩球纹理 718
23.4.3 玩具球纹理 722
23.5 小结 727
附录A 推荐读物 728
A.1 其他优秀的OpenGL书籍 728
A.2 3D图形书籍 728
A.3 网站 728
附录B 术语表 730
附录C OpenGLES 733
C.1 数据类型的削减 733
C.2 完全消除的特性 733
C.3 大幅度削减了的功能 734
C.3.1 纹理贴图 734
C.3.2 光栅操作 734
C.3.3 光照 735
C.4 小结 735