第1章 OpenGL简介 1
1.1 OpenGL是什么 2
1.1.1 基本知识和架构 4
1.1.2 语法 8
1.1.3 状态和查询 10
1.2 GLUT 17
1.3 GLU 18
1.4 开发环境 18
1.4.1 Apple Mac OS X 19
1.4.2 Linux 20
1.4.3 Microsoft Windows 20
1.5 简单示例 21
1.6 OpenGL的历史 27
1.6.1 1992年之前 28
1.6.2 OpenGL与Iris GL之比较 29
1.6.3 OpenGL与PEX之比较 30
1.6.4 不断发展的OpenGL 31
1.7 更详细的信息 31
参考文献 32
第2章 绘制图元 35
2.1 OpenGL图元 36
2.1.1 图元类型 37
2.1.2 顶点共享 39
2.2 指定顶点数据 39
2.2.1 使用glBegin()/glEnd()绘制图元 40
2.2.2 使用顶点数组绘制图元 42
2.3 绘图细节 57
2.3.1 清空帧缓存 57
2.3.2 模型变换 58
2.3.3 平滑着色和恒定着色 59
2.3.4 多边形模式 60
2.3.5 深度测试 60
2.3.6 共面图元 61
2.3.7 alpha和透明度 63
2.4 性能问题 65
2.4.1 显示列表 65
2.4.2 面剔除 68
2.5 更详细的信息 69
2.4.3 顶点数组的大小 69
参考文献 70
第3章 变换和观察 71
3.1 坐标系和矩阵 73
3.1.1 旋向性 73
3.1.2 矩阵 73
3.1.3 矩阵堆栈和矩阵状态 75
3.1.4 矩阵操纵命令 76
3.2 变换流水线 78
3.2.1 物体坐标 79
3.2.2 模型变换 80
3.2.3 世界坐标 81
3.2.4 视点变换 81
3.2.7 裁剪坐标 82
3.2.5 眼坐标 82
3.2.6 投影变换 82
3.2.8 透视除法 83
3.2.9 归一化的设备坐标 83
3.2.10 视口变换 83
3.2.11 窗口坐标 84
3.2.12 控制变换 84
3.3 设置模型视点矩阵 86
3.3.1 使用gluLook()指定视点变换 87
3.3.2 创建视点变换矩阵 88
3.3.3 示例代码中的视点变换 89
3.4 透视和平行投影 90
3.5 视口 92
3.6 选择 93
3.6.1 执行选择 93
3.6.2 示例程序中的选择 98
3.7 更详细的信息 99
参考文献 99
第4章 光照 101
4.1 概述 102
4.1.1 环境光、散射光和镜面反射光 103
4.1.2 控制OpenGL光照 104
4.1.3 最简单的光照代码 105
4.1.4 内部光照计算 105
4.2 法线 106
4.3 光源参数 107
4.3.2 更详细的信息 108
4.3.1 典型用法 108
4.4 材质参数 109
4.4.1 使用glColor*()修改材质参数 111
4.4.2 典型用法 112
4.4.3 更多的信息 113
4.5 定位光源和定向光源 113
4.6 调试光源 114
4.6.1 调试空白窗口 115
4.6.2 法线 115
4.6.3 错误的面剔除 115
4.6.4 调试位置和方向 115
4.6.6 顶点光照异常 116
4.6.5 调试光源颜色 116
4.6.7 没有镜面反射点 117
4.6.8 直线和点的颜色 118
4.7 更详细的信息 118
参考文献 119
第5章 矩形像素阵列 121
5.1 绘制像素 122
5.1.1 当前光栅位置 123
5.1.2 使用glDrawPixels()绘制矩阵像素阵列 126
5.2 读取像素 128
5.3 复制像素 129
5.4.1 使用可替代glDrawPixels()的方式 130
5.4 性能问题 130
5.4.2 刷新OpenGL流水线 131
5.5 调试 131
5.5.1 光栅位置不正确 131
5.5.2 裁剪光栅位置 132
5.5.3 禁用纹理映射和雾效 132
5.5.4 深度测试 133
5.5.5 像素数据对齐 133
5.5.6 被遮住的窗口 134
5.5.7 内存分配问题 134
5.6 更详细的信息 135
参考文献 135
第6章 纹理映射 137
6.1 使用纹理图 139
6.1.1 纹理对象 140
6.1.2 纹理坐标 147
6.1.3 多重纹理 152
6.1.4 纹理映射示例 155
6.2 使用纹理实现光照和阴影效果 160
6.2.1 静态光照 160
6.2.2 光照图 162
6.2.3 深度图 165
6.2.4 镜面反射点 170
6.2.5 环境图 172
6.3.1 OpenGL错误代码 176
6.3.2 纹理状态 176
6.3 调试 176
6.3.3 纹理的完整性 178
6.3.4 缺失纹理 179
6.3.5 逆反纹理 180
6.4 更详细的信息 181
参考文献 181
第7章 扩展和版本 183
7.1 扩展 184
7.1.1 查询扩展 186
7.1.2 获得并调用扩展命令 187
7.2 版本 190
7.3 扩展和版本安全的代码 192
7.4 更详细的信息 198
第8章 平台特定的接口 199
8.1 概念 200
8.2 Apple Mac OS X 201
8.2.1 创建上下文 202
8.2.2 使用上下文 204
8.2.3 交换缓存 205
8.2.4 删除上下文 205
8.3 Linux 205
8.3.1 创建上下文 206
8.3.2 使用上下文 209
8.3.3 交换缓存 210
8.3.4 删除上下文 210
8.4.1 创建窗口 211
8.4 Microsoft Windows 211
8.4.2 创建上下文 212
8.4.3 使用上下文 214
8.4.4 交换缓存 215
8.4.5 删除上下文 215
8.5 更详细的信息 216
参考文献 216
附录A 其他特性 217
A.1 多重采样 217
A.2 遮盖查询 218
A.3 雾效 218
A.4 裁剪面 219
A.7 着色语言 220
A.5 模板 220
A.6 累积缓存 220
A.7.1 着色器示例 221
A.7.2 更详细的信息 223
参考文献 223
附录B 最佳实践 225
B.1 状态 225
B.2 错误 226
B.3 精度 227
B.3.1 数量级 227
B.3.2 舍入 227
B.3.3 深度缓存 228
B.4 对象 229
附录C 性能 231
C.1 度量性能 231
C.2 避免软件渲染 233
C.3 消除流水线瓶颈 234
C.3.1 CPU限制 235
C.3.2 几何体限制 236
C.3.3 填充限制 237
C.3.4 对流水线瓶颈的最后思考 239
C.4 剔除不可见的几何体 239
C.5 状态修改和查询 240
D.1 调试工具 243
附录D 故障排除和调试 243
D.2 OpenGL错误 244
D.2.1 检查OpenGL错误编码 244
D.2.2 具体错误 245
D.3 调试空白窗口 248
D.3.1 采用良好的代码开发实践 248
D.3.2 使用glGetError() 248
D.3.3 启用顶点数组 248
D.3.4 设置合适的裁剪面 249
D.3.5 使用正确的变换 249
D.3.6 交换缓存 250
D.3.7 调用glClear() 250
参考文献 253