第一部分 “旧约”——经典属性第1章 3D图形和OpenGL的介绍 2
1.1 计算机图形的简单历史回顾 2
1.1.1 进入电子时代 2
1.1.2 走向3D 3
1.2 3D效果初探 5
1.2.1 透视(视角) 5
1.2.2 颜色和着色 6
1.2.3 光照和阴影 6
1.2.4 纹理贴图 7
1.2.5 雾 7
1.2.6 混和和透明 8
1.2.7 抗锯齿 8
1.3 3D图形的常见用途 9
1.3.1 实时3D 9
1.3.2 非实时3D 10
1.3.3 着色器 11
1.4 3D编程的基本原则 12
1.4.1 立即模式和保持模式 12
1.4.2 坐标系统 12
1.4.3 投影:从3D到2D 15
1.5 总结 17
第2章 使用OpenGL 18
2.1 什么是OpenGL 18
2.1.1 标准的演化 19
2.1.2 API战争 20
2.1.3 OpenGL的未来 20
2.2 OpenGL的工作原理 21
2.2.1 通用实现 21
2.2.2 硬件实现 22
2.2.3 管线 23
2.3 OpenGL是API而不是编程语言 23
2.3.1 标准函数库和头文件 24
2.3.2 头文件自定义 24
2.4 API特定细节 25
2.4.1 数据类型 26
2.4.2 函数名约定 27
2.5 平台独立性 27
2.5.1 使用GLUT 28
2.5.2 第一个程序 28
2.5.3 用OpenGL绘制形状 32
2.6 使用OpenGL和GLUT生成动画 38
2.7 OpenGL状态机 41
2.8 OpenGL错误 42
2.9 确认版本 43
2.10 使用glHint获取线索 43
2.11 使用扩展 44
2.11.1 检查扩展 44
2.11.2 这是谁的扩展 45
2.12 总结 45
第3章 空间绘图:几何图元和缓冲区 46
3.1 在3D中绘制点 46
3.2 设置3D画布 47
3.3 3D空间中的点:顶点 48
3.4 绘制图形 49
3.4.1 画点 49
3.4.2 第一个例子 50
3.5 设置点的大小 52
3.6 在3D空间中画直线 54
3.6.1 线带和线环 55
3.6.2 用直线构成近似曲线 56
3.6.3 设置直线的宽度 57
3.6.4 直线点画 58
3.7 在3D空间中绘制三角形 60
3.7.1 三角形:第一种多边形 60
3.7.2 环绕 61
3.7.3 三角形带 62
3.7.4 三角形扇 62
3.8 创建实心物体 63
3.8.1 设置多边形的颜色 65
3.8.2 隐藏表面消除 65
3.8.3 剔除:隐藏表面,提高性能 67
3.8.4 多边形模式 68
3.9 其他图元 69
3.9.1 四条边的多边形:四边形 69
3.9.2 通用多边形 70
3.9.3 填充多边形,重新讨论点画 70
3.9.4 多边形的创建规则 73
3.9.5 细分和边界 74
3.10 其他缓冲区技巧 76
3.10.1 使用缓冲区目标 76
3.10.2 操纵深度缓冲区 77
3.10.3 用剪刀进行裁剪 77
3.10.4 使用模板缓冲区 78
3.10.5 创建模板图案 80
3.11 总结 82
第4章 几何变换:管线 83
4.1 本章是不是枯燥的数学课 83
4.2 理解变换 84
4.2.1 视觉坐标 84
4.2.2 视图变换 85
4.2.3 模型变换 85
4.2.4 模型视图对偶性 85
4.2.5 投影变换 86
4.2.6 视口变换 87
4.3 矩阵:3D图形的数学基础 87
4.3.1 什么是矩阵 88
4.3.2 变换管线 88
4.3.3 模型视图矩阵 89
4.3.4 单位矩阵 91
4.3.5 矩阵堆栈 93
4.3.6 一个原子例子 94
4.4 使用投影 96
4.4.1 正投影 96
4.4.2 透视投影 97
4.4.3 一个远处缩小的例子 99
4.5 高级矩阵操作 101
4.5.1 加载矩阵 102
4.5.2 自己执行变换 103
4.5.3 变换的叠加 105
4.6 使用照相机和角色在OpenGL中移动 105
4.6.1 角色帧 106
4.6.2 欧拉角:“卢克!请使用帧” 107
4.6.3 照相机管理 107
4.6.4 综合应用 108
4.7 总结 112
第5章 颜色、材料和光照:基础知识 113
5.1 什么是颜色 113
5.1.1 光的波动性 114
5.1.2 光的粒子性 114
5.1.3 人眼作为光子检测器 115
5.1.4 计算机作为光子检测器 116
5.2 PC颜色硬件 116
5.3 PC显示模式 117
5.3.1 屏幕分辨率 117
5.3.2 颜色深度 118
5.4 在OpenGL中使用颜色 118
5.4.1 颜色立方体 118
5.4.2 设置绘图颜色 119
5.4.3 着色 120
5.4.4 设置着色模型 121
5.5 现实世界的颜色 122
5.5.1 环境光 123
5.5.2 散射光 123
5.5.3 镜面光 124
5.5.4 综合考虑 124
5.6 现实世界的材料 124
5.6.1 材料属性 125
5.6.2 向材料添加光照 125
5.6.3 计算环境光效果 125
5.6.4 散射和镜面光效果 126
5.7 向场景添加光照 126
5.7.1 启用光照 126
5.7.2 设置宇宙背景发射光 127
5.7.3 设置材料属性 127
5.8 使用光源 129
5.8.1 哪种方式最合适 129
5.8.2 表面法线 130
5.8.3 指定法线 130
5.8.4 单位法线 132
5.8.5 寻找法线 132
5.8.6 设置光源 133
5.8.7 设置材料属性 135
5.8.8 指定多边形 135
5.9 光照效果 136
5.9.1 镜面亮点 136
5.9.2 镜面光 137
5.9.3 镜面反射 137
5.9.4 镜面指数 138
5.9.5 法线均衡 139
5.10 综合讨论 140
5.10.1 创建聚光灯 141
5.10.2 绘制聚光灯 142
5.11 阴影 145
5.11.1 什么是阴影 146
5.11.2 实现压平的代码 147
5.11.3 一个阴影例子 147
5.11.4 重新回顾球体世界 149
5.12 总结 150
第6章 颜色和材料的更多细节 151
6.1 混合 151
6.1.1 组合颜色 151
6.1.2 修改混合方程式 154
6.1.3 抗锯齿 154
6.1.4 多重采样 157
6.2 应用雾 158
6.2.1 雾方程式 159
6.2.2 雾坐标 160
6.3 累积缓冲区 161
6.4 其他颜色操作 163
6.4.1 颜色掩码 163
6.4.2 颜色逻辑操作 163
6.4.3 alpha测试 163
6.4.4 抖动 164
6.5 总结 164
第7章 OpenGL中的图像 165
7.1 位图 165
7.1.1 一个位图例子 166
7.1.2 设置光栅位置 168
7.2 像素包装 169
7.3 像素图 170
7.3.1 经过包装的像素格式 171
7.3.2 一个颜色更丰富的例子 172
7.3.3 移动像素 174
7.3.4 保存像素 175
7.4 像素的更多乐趣 177
7.4.1 像素缩放 181
7.4.2 像素转移 183
7.4.3 像素映射 185
7.5 图像“子集”和管线 186
7.5.1 颜色矩阵 190
7.5.2 颜色查找 190
7.5.3 代理 192
7.5.4 其他操作 192
7.5.5 卷积 193
7.5.6 最小最大值操作 198
7.6 总结 198
第8章 纹理贴图:基础知识 199
8.1 加载纹理 200
8.1.1 使用颜色缓冲区 202
8.1.2 更新纹理 202
8.1.3 将纹理贴图到几何图形 203
8.1.4 纹理矩阵 205
8.2 一个简单的2D例子 205
8.3 纹理环境 208
8.4 纹理参数 209
8.4.1 基本过滤 209
8.4.2 纹理环绕 211
8.4.3 带纹理的卡通 211
8.4.4 Mip贴图 214
8.5 纹理对象 217
8.6 总结 223
第9章 纹理贴图:高级知识 224
9.1 辅助颜色 224
9.2 各向异性过滤 226
9.3 纹理压缩 227
9.3.1 压缩纹理 228
9.3.2 加载压缩纹理 229
9.4 纹理坐标生成 230
9.4.1 物体线性贴图 232
9.4.2 视觉线性贴图 233
9.4.3 球体贴图 234
9.4.4 立方体贴图 234
9.5 多重纹理 237
9.5.1 多重纹理坐标 238
9.5.2 一个多重纹理例子 239
9.6 纹理组合器 242
9.7 点块纹理 244
9.7.1 使用点 244
9.7.2 纹理应用 245
9.7.3 点参数 245
9.8 总结 246
第10章 曲线和表面 247
10.1 内部支持的表面 247
10.1.1 设置二次方程状态 248
10.1.2 绘制二次方程图形 249
10.1.3 用二次方程进行建模 251
10.2 Bézier曲线和表面 253
10.2.1 参数方程表示形式 253
10.2.2 求值器(evaluator) 255
10.3 NURBS 262
10.3.1 从Bézier到B样条 262
10.3.2 结点 263
10.3.3 创建NURBS表面 263
10.3.4 NURBS属性 264
10.3.5 定义表面 264
10.3.6 修剪 265
10.3.7 NURBS表面 267
10.4 分格化(tessellation) 267
10.4.1 分格器(tessellator) 267
10.4.2 分格器回调函数 268
10.4.3 指定顶点数据 269
10.4.4 综合应用 269
10.5 总结 273
第11章 这就是管线:更快的几何图形渲染 275
11.1 显示列表 275
11.1.1 批处理 276
11.1.2 预批处理 277
11.1.3 使用显示列表的一些注意事项 278
11.1.4 转换到显示列表 278
11.2 顶点数组 279
11.2.1 加载几何图形 281
11.2.2 启用数组 282
11.2.3 数据在哪里 282
11.2.4 用数据绘图 283
11.2.5 索引顶点数组 284
11.3 顶点缓冲区对象 293
11.3.1 管理和使用缓冲区对象 294
11.3.2 回到Thunderbird 295
11.4 总结 297
第12章 交互式图形 298
12.1 选择 298
12.1.1 为图元命名 299
12.1.2 在选择模式下工作 300
12.1.3 选择缓冲区 301
12.1.4 挑选 302
12.1.5 层次式挑选 304
12.2 反馈 307
12.2.1 反馈缓冲区 307
12.2.2 反馈数据 308
12.2.3 用户定义标记 308
12.3 一个反馈例子 309
12.3.1 对物体加上标签以便反馈 309
12.3.2 步骤1:选择物体 311
12.3.3 步骤2:从物体获取反馈信息 312
12.4 总结 314
第13章 遮挡查询:消除不必要的工作 315
13.1 遮挡查询之前的世界 315
13.2 边框 317
13.3 对查询对象进行查询 321
13.4 最佳实践 322
13.5 总结 323
第14章 深度纹理和阴影 324
14.1 作为光源 325
14.1.1 使场景正好占据整个窗口 325
14.1.2 去掉不必要的东西 326
14.2 一种新类型的纹理 326
14.3 首先绘制阴影 327
14.4 然后是光照 328
14.4.1 投影阴影贴图:“为什么” 328
14.4.2 投影阴影贴图:“怎么做” 329
14.4.3 阴影比较 330
14.5 只用两个就够了 333
14.6 关于多边形偏移 334
14.7 总结 334
第二部分 “新约”——新的发展第15章 可编程管线:这已不是旧式的OpenGL 336
15.1 旧的被淘汰 336
15.1.1 固定的顶点处理 337
15.1.2 固定的片断处理 339
15.2 新的占主导 339
15.2.1 可编程顶点着色器 340
15.2.2 固定功能胶水 341
15.2.3 可编程片断着色器 342
15.3 初窥OpenGL着色语言 343
15.4 管理高层着色器 344
15.4.1 着色器对象 344
15.4.2 程序对象 345
15.5 变量 347
15.5.1 基本类型 347
15.5.2 结构 348
15.5.3 数组 349
15.5.4 限定符 349
15.5.5 内置的变量 350
15.6 表达式 351
15.6.1 操作符 351
15.6.2 数组访问 352
15.6.3 构造函数 352
15.6.4 成分选择 353
15.7 控制流 353
15.7.1 循环 354
15.7.2 if/else 354
15.7.3 discard 354
15.7.4 函数 354
15.8 总结 356
第16章 顶点着色:自行转换、光照和Texgen 357
16.1 初次试验 357
16.2 散射光照 358
16.3 镜面光照 359
16.4 改善镜面光照 360
16.5 基于顶点的雾 362
16.6 基于顶点的点大小 364
16.7 自定义的顶点变换 365
16.8 顶点混合 366
16.9 总结 367
第17章 片断着色器:增强像素处理的威力 368
17.1 颜色转换 368
17.1.1 灰度 368
17.1.2 调棕色 369
17.1.3 反色 370
17.1.4 热信号 370
17.1.5 基于片断的雾 371
17.2 图像处理 372
17.2.1 模糊 372
17.2.2 锐化 373
17.2.3 膨胀和侵蚀 374
17.2.4 边缘检测 375
17.3 光照 376
17.3.1 散射光照 377
17.3.2 多重镜面光照 378
17.4 过程纹理贴图 379
17.4.1 棋盘纹理 380
17.4.2 沙滩球纹理 382
17.4.3 玩具球纹理 384
17.5 总结 386
第18章 高级缓冲区 387
18.1 像素缓冲区对象 387
18.1.1 如何使用PBO 388
18.1.2 PBO的优点 388
18.1.3 实际使用PBO 389
18.1.4 可以使用PBQ的命令 391
18.2 帧缓冲区对象 392
18.2.1 如何使用FBO 392
18.2.2 离屏渲染 395
18.2.3 渲染到纹理 396
18.2.4 多个渲染目标 398
18.3 浮点纹理 400
18.3.1 高动态范围 400
18.3.2 OpenEXR文件格式 401
18.3.3 调和映射(tone mapping) 403
18.4 更白、更亮 405
18.4.1 绘制场景 405
18.4.2 亮度渲染 407
18.4.3 借助于高斯模糊 407
18.4.4 把各部分相加 408
18.4.5 再次使用PBO 409
18.5 总结 409
第三部分 “新约外传”——扩展应用第19章 Wiggle:Windows上的OpenGL 412
19.1 Windows上的OpenGL实现 412
19.1.1 泛型OpenGL 413
19.1.2 可安装客户驱动程序 413
19.1.3 Mini客户驱动程序 413
19.1.4 Mini驱动程序 414
19.1.5 Vista上的OpenGL 414
19.1.6 扩展OpenGL 414
19.2 基本的窗口渲染 415
19.2.1 GDI设备环境 415
19.2.2 像素格式 416
19.2.3 OpenGL渲染环境 421
19.3 综合应用 421
19.3.1 创建窗口 422
19.3.2 使用OpenGL渲染环境 425
19.3.3 其他Windows消息 427
19.4 OpenGL和Windows字体 428
19.4.1 3D字体和文本 429
19.4.2 2D字体和文本 430
19.5 全屏渲染 432
19.5.1 创建一个无边框窗口 432
19.5.2 创建一个全屏窗口 433
19.6 多线程渲染 435
19.7 OpenGL和WGL扩展 436
19.7.1 简单扩展 436
19.7.2 使用新入口 437
19.7.3 自动魔法扩展 437
19.7.4 WGL扩展 438
19.8 总结 441
第20章 Mac OSX上的OpenGL 442
20 1 GLUT 442
20.1.1 创建一个GLUT项目 443
20.1.2 应用程序框架 443
20.1.3 Ditching Cocoa 444
20.2 使用Carbon的OpenGL 444
20.2.1 为OpenGL进行设置 444
20.2.2 设置像素格式 446
20.2.3 位图字体 449
20.3 使用Cocoa的OpenGL 451
20.3.1 创建一个Cocoa程序 451
20.3.2 综合运用 452
20.4 全屏渲染 455
20.4.1 显示管理 455
20.4.2 AGL全屏支持 456
20.5 总结 458
第21章 Linux上的OpenGL 459
21.1 基础知识 459
21.2 安装 460
21.2.1 安装Mesa 460
21.2.2 安装硬件驱动程序 461
21.2 3 其他安装细节 461
21.2.4 安装GLUT 461
21.2.5 生成OpenGL应用程序 461
21.3 GLUT 462
21.4 GLX——处理X Window接口 462
21.4.1 显示和X 463
21.4 2 配置管理和画面 463
21.4.3 窗口和渲染表面 466
21.4.4 环境管理 467
21.4.5 同步 468
21.4.6 GLX字符串 469
21.4.7 其他关于GLX的内容 469
21.5 综合运用 470
21.6 总结 473
第22章 OpenGL ES:嵌入式OpenGL 474
22.1 精简的OpenGL 474
22.1.1 ES指什么 474
22.1.2 历史概述 475
22.2 版本选择 476
22.2.1 ES 1.0 476
22.2.2 ES 1.1 478
22.2.3 ES 2.0 481
22.2.4 ES SC 485
22.3 ES环境 486
22.3.1 应用程序设计的注意事项 486
22.3.2 有限环境的处理 487
22.3.3 定点数学 487
22.4 EGL:新的窗口环境 488
22.4.1 EGL显示 489
22.4.2 创建一个窗口 489
22.4.3 环境管理 492
22.4.4 呈现缓冲区和渲染同步 493
22.4.5 更多EGL相关内容 493
22.5 处理嵌入式环境 494
22.5.1 流行操作系统 494
22.5.2 嵌入式硬件 495
22.5.3 供应商特定扩展 495
22.5.4 个人玩家 495
22.6 实施OpenGL ES 495
22.6.1 设置环境 495
22.6.2 设置OpenGL ES状态 497
22.6.3 渲染 497
22.6.4 清除工作 498
22.7 总结 498
附录A 更多阅读建议 499
附录B 词汇表 501
附录C API参考 504