第1章 OpenGL基础知识概述 1
1.1 OpenGL的历史 1
1.2 发展OpenGL 2
1.3 执行模型 3
1.4 帧缓冲区 3
1.5 状态 5
1.6 处理管线 6
1.7 绘制几何对象 6
1.7.1 指定几何对象 7
1.7.2 逐个顶点操作 8
1.7.3 图元组装 9
1.7.4 图元处理 10
1.7.5 栅格化 10
1.7.6 片元处理 11
1.7.7 逐个片元的操作 11
1.7.8 帧缓冲区操作 12
1.8 绘制图像 12
1.8.1 像素解码 12
1.8.2 像素传输 13
1.8.3 栅格化和后端处理 13
1.9 坐标变换 14
1.8.4 读取控制 14
1.10 纹理 18
1.11 小结 21
1.12 参考资料 21
第2章 基础知识 23
2.1 OpenGL着色语言简介 23
2.2 为什么要编写着色器 24
2.3 OpenGL可编程处理器 25
2.3.1 顶点处理器 26
2.3.2 片元处理器 29
2.4.1 语言的设计考虑 31
2.4 语言概述 31
2.4.2 以C为基础 33
2.4.3 对C的增加 33
2.4.4 来自C++的增加 34
2.4.5 不受支持的C特性 35
2.4.6 其他差异 35
2.5 系统概述 36
2.5.1 驱动程序模型 36
2.5.2 OpenGL着色语言编译器/链接器 37
2.5.3 OpenGL API扩展 38
2.6 主要优点 40
2.7 小结 41
2.8 参考资料 42
第3章 语言定义 43
3.1 着色器对的实例 43
3.2 数据类型 44
3.2.1 标量 45
3.2.2 矢量 46
3.2.3 矩阵 47
3.2.4 取样器 47
3.2.6 数组 48
3.2.5 结构 48
3.2.7 Void 49
3.2.8 声明和作用域 49
3.2.9 类型匹配与提升 50
3.3 初始化器和构造函数 50
3.4 类型转换 51
3.5 限定符和着色器接口 52
3.5.1 Attribute限定符 52
3.5.2 Uniform限定符 52
3.5.3 Varying限定符 53
3.5.4 常量限定符 53
3.6 流控制 54
3.5.5 缺少限定符 54
3.6.1 函数 55
3.6.2 调用约定 55
3.6.3 内置函数 56
3.7 操作 56
3.7.1 索引 57
3.7.2 混合 57
3.7.3 按部分操作 58
3.8 预处理器 60
3.9 预处理器表达式 61
3.10 错误处理 61
3.12 参考资料 62
3.11 小结 62
第4章 OpenGL可编程管线 65
4.1 顶点处理器 65
4.1.1 顶点属性 66
4.1.2 一致变量 67
4.1.3 特殊的输出变量 68
4.1.4 内置的易变变量 68
4.1.5 用户定义的易变变量 69
4.2 片元处理器 69
4.2.1 易变变量 70
4.2.4 特殊的输出变量 71
4.2.2 一致变量 71
4.2.3 特殊的输入变量 71
4.3 内置一致变量 72
4.4 内置常量 75
4.5 与OpenGL的固定功能交互 76
4.5.1 两侧颜色模式 76
4.5.2 点大小模式 77
4.5.3 裁剪 77
4.5.4 光栅位置 78
4.5.5 位置不变性 78
4.5.6 纹理处理 79
4.6 小结 80
4.7 参考资料 80
第5章 内置函数 83
5.1 角度和三角函数 84
5.2 指数函数 85
5.3 常见函数 86
5.4 几何函数 90
5.5 矩阵函数 92
5.6 矢量关系函数 92
5.7 纹理访问函数 94
5.8 片元处理函数 95
5.9 噪声函数 96
5.10 小结 97
5.11 参考资料 97
第6章 简单的着色实例 99
6.1 砖块着色器简介 99
6.2 顶点着色器 100
6.3 片元着色器 104
6.4 观察 108
6.5 小结 108
6.6 参考资料 109
第7章 OpenGL着色语言API 111
7.1 创建着色器对象 112
7.2 编译着色器对象 113
7.3 链接和使用着色器 114
7.4 清理工作 116
7.5 查询函数 117
7.6 指定顶点属性 120
7.7 指定一致变量 128
7.8 采样器 133
7.9 开发辅助工具 133
7.10 与实现有关的API值 134
7.11 砖块着色器的应用程序代码 135
7.12 小结 138
7.13 参考资料 138
第8章 开发着色器 141
8.1 一般原则 141
8.1.1 理解问题 141
8.1.2 逐步提高复杂性 142
8.1.3 测试和重复 142
8.1.4 尽量简化 142
8.2.1 考虑计算频率 143
8.2 性能考虑 143
8.1.5 模块化 143
8.2.2 分析算法 144
8.2.3 使用内置函数 144
8.2.4 使用矢量 144
8.2.5 使用纹理编写复杂函数 144
8.2.6 回顾信息日志 144
8.3 着色器调试 145
8.3.1 使用顶点着色器的输出 145
8.3.2 使用片元着色器的输出 145
8.4.1 着色器开发工具 146
8.4.1 RenderMonkey 146
8.3.3 使用简单的几何对象 146
8.4.2 OpenGL着色语言编译器前端 148
8.5 小结 149
8.6 参考资料 149
第9章 传统着色器 151
9.1 变换 151
9.2 光源 152
9.2.1 定向光源 153
9.2.2 点光源 153
9.2.3 聚光灯 155
9.3 材质属性和光照 156
9.4 两侧光照 158
9.5 无光照 158
9.6 雾化 159
9.7 纹理坐标生成 160
9.8 用户裁剪 162
9.9 纹理应用 162
9.10 小结 164
9.11 参考资料 164
第10章 存储的纹理着色器 165
10.1 从着色器内部访问纹理贴图 166
10.2.1 应用程序设置 167
10.2 简单的纹理处理实例 167
10.2.2 顶点着色器 168
10.2.3 片元着色器 169
10.3 多重纹理处理实例 169
10.3.1 应用程序设置 171
10.3.2 顶点着色器 171
10.3.3 片元着色器 172
10.4 环境贴图实例 173
10.4.1 应用程序设置 174
10.4.2 顶点着色器 174
10.4.3 片元着色器 175
10.5 使用BRDF数据的多项式纹理贴图 177
10.5.1 应用程序设置 179
10.5.2 顶点着色器 180
10.5.3 片元着色器 182
10.6 小结 183
10.7 参考资料 184
第11章 程序纹理着色器 187
11.1 常规图案 188
11.1.1 条纹顶点着色器 189
11.1.2 条纹片元着色器 190
11.2 玩具球 191
11.2.1 应用程序设置 192
11.2.2 顶点着色器 192
11.2.3 片元着色器 193
11.3 网格 196
11.4 凹凸贴图 197
11.4.1 应用程序设置 199
11.4.2 顶点着色器 200
11.4.3 片元着色器 201
11.4.4 法向量贴图 202
11.6 参考资料 203
11.5 小结 203
第12章 噪声 205
12.1 定义噪声 206
12.1.1 2D噪声 209
12.1.2 更高维度的噪声 210
12.1.3 在OpenGL着色器中使用噪声 210
12.2 噪声纹理 211
12.3 权衡考虑 213
12.4 一个简单的噪声着色器 214
12.4.1 应用程序设置 214
12.4.2 顶点着色器 214
12.4.3 片元着色器 215
12.5 扰动 216
12.5.1 太阳表面着色器 216
12.5.2 大理石 217
12.6 花岗岩 217
12.7 木材 218
12.7.1 应用程序设置 218
12.7.2 片元着色器 218
12.8 小结 220
12.9 参考资料 220
第13章 动画着色器 223
13.1 开/关 224
13.2 阈值 224
13.3 转换 224
13.4 关键帧插值 225
13.5 其他混合效果 227
13.6 粒子系统 227
13.6.1 应用程序设置 228
13.6.2 纸炮顶点着色器 230
13.6.3 纸炮片元着色器 231
13.7 摇摆 232
13.6.4 进一步增强 232
13.8 小结 235
13.9 参考资料 235
第14章 反走样过程纹理 237
14.1 走样的原因 237
14.2 避免走样 238
14.3 提高分辨率 239
14.4 反走样的条纹实例 240
14.4.1 生成条纹 240
14.4.2 分析预过滤 241
14.4.3 自适应分析预过滤 242
14.4.4 分析积分 244
14.4.5 反走样的砖块片元着色器 246
14.5 频率限定 247
14.6 小结 248
14.7 参考资料 249
第15章 反真实着色器 251
15.1 剖面线实例 251
15.1.1 应用程序设置 252
15.1.2 顶点着色器 252
15.1.3 生成剖面线 253
15.1.4 获得一致的线条密度 253
15.1.6 添加特征 255
15.1.5 光照 255
15.1.7 剖面线片元着色器 256
15.2 技术示意图实例 257
15.2.1 应用程序设置 259
15.2.2 顶点着色器 259
15.2.3 片元着色器 260
15.3 Mandelbrot实例 261
15.3.1 Mandelbrot set简介 261
15.3.2 顶点着色器 263
15.3.3 片元着色器 263
15.3.4 Julia set 265
15.4 小结 266
15.5 参考资料 266
第16章 用于图像处理的着色器 269
16.1 几何图像变换 270
16.2 数学贴图 270
16.3 查找表操作 270
16.4 颜色空间变换 271
16.5 图像内插和外插 272
16.5.1 亮度 272
16.5.4 锐度 273
16.5.2 对比度 273
16.5.3 饱和度 273
16.6 混合模式 274
16.6.1 正常 274
16.6.2 平均 275
16.6.3 溶解 275
16.6.4 背面 275
16.6.5 清除 275
16.6.6 变暗 275
16.6.10 颜色加深 276
16.6.12 叠加 276
16.6.11 颜色减淡 276
16.6.8 正片叠底 276
16.6.9 屏幕 276
16.6.7 变亮 276
16.6.13 柔光 277
16.6.14 强光 277
16.6.15 相加 277
16.6.16 相减 277
16.7 卷积 278
16.6.19 排除 278
16.6.20 不透明度 278
16.6.18 反差值 278
16.6.17 差值 278
16.7.1 平滑 280
16.7.2 边缘检测 282
16.7.3 锐化 283
16.8 小结 284
16.9 参考资料 284
第17章 语言的比较 287
17.1 着色语言的历史 287
17.2 RenderMan 288
17.3 OpenGL Shader(ISL) 290
17.4 HLSL 291
17.5 Cg 293
17.6 小结 294
17.7 参考资料 295
附录A 语言的语法 297
附录B API函数参考 309
glAttachObjectARB 309
glBindAttribLocationARB 310
glCompileShaderARB 312
glCreateProgramObjectARB 313
glCreateShaderObjectARB 314
glDeleteObjectARB 315
glDetachObjectARB 316
glEnableVertexAttribArrayARB 317
glGetActiveAttribARB 318
glGetActiveUniformARB 320
glGetAttachedObjectsARB 322
glGetAttribLocationARB 323
glGetHandleARB 324
glGetinfoLogARB 324
glGetObjectParameterARB 326
glGetShaderSourceARB 328
glGetUniformARB 329
glGetUniformLocationARB 331
glGetVertexAttribARB 332
glGetVertexAttribPointervARB 333
glLinkProgramARB 334
glShaderSourceARB 337
glUniformARB 338
glUseProgramObjectARB 342
glValidateProgramARB 344
glVertexAttribARB 345
glVertexAttribPointerARB 348
后记 351