第一章 绪论 1
1.1 虚拟地球渲染中的挑战 1
1.2 内容简介 5
1.2.1 基础知识 5
1.2.2 精度修正 5
1.2.3 矢量数据 5
1.2.4 三维球面地形构建 6
1.3 OpenGlobe结构 7
1.4 约定惯例 9
第一部分 基础知识 10
第二章 数学基础 10
2.1 虚拟地球坐标系 10
2.1.1 地理坐标系 10
2.1.2 WGS84坐标系 12
2.2 椭球体基础 14
2.2.1 WGS84椭球体 15
2.2.2 椭球体表面法线 16
2.2.3 大地纬度和高度 17
2.3 坐标变换 18
2.3.1 地理坐标系向WGS84坐标系转换 18
2.3.2 WGS84坐标系向地理坐标系转换 21
2.4 椭球体上的曲线 30
2.5 资源 34
第三章 渲染设计 35
3.1 渲染需求 35
3.2 概要 39
3.2.1 代码结构 42
3.3 状态管理 43
3.3.1 全局状态 43
3.3.2 定义渲染状态 45
3.3.3 GL状态与渲染状态同步 48
3.3.4 绘图状态 50
3.3.5 清除状态 51
3.3.6 通过状态排序 53
3.4 shader 56
3.4.1 编译和连接shader 56
3.4.2 顶点属性 59
3.4.3 片元输出 62
3.4.4 uniform单元 63
3.4.5 自动的uniform单元 67
3.4.6 高速缓存shader 73
3.5 顶点数据 76
3.5.1 顶点缓冲区 77
3.5.2 引导缓冲区 82
3.5.3 顶点数组 83
3.5.4 GL渲染操作 86
3.5.5 Direct3D中的顶点数据 87
3.5.6 网格 87
3.6 纹理 93
3.6.1 创建纹理 93
3.6.2 采样器 98
3.6.3 用纹理渲染 100
3.6.4 GL渲染操作 101
3.6.5 Direct3D中的纹理 102
3.7 帧缓冲区 103
3.7.1 GL渲染操作 105
3.7.2 Direct3D中的帧缓冲区 106
3.8 完整流程:渲染一个三角形 106
3.9 资源 109
第四章 球面渲染 111
4.1 分格化 111
4.1.1 细分表面 111
4.1.2 细分表面操作 114
4.1.3 立方体图分格化 117
4.1.4 地理网格分格化 120
4.1.5 分格化算法比较 122
4.2 着色 122
4.2.1 光照 122
4.2.2 纹理 127
4.2.3 CPU/GPU权衡 130
4.2.4 经纬度网格 131
4.2.5 夜间照明 134
4.3 GPU光线投射 138
4.4 资源 142
第二部分 精度修正 144
第五章 顶点位置精度修正 144
5.1 抖动产生原因 145
5.1.1 浮点舍入误差 146
5.1.2 导致抖动的根本原因 147
5.1.3 为什么缩放不能解决抖动问题 150
5.2 根据中心渲染物体 150
5.3 使用CPU根据视点进行渲染 155
5.4 在GPU上根据视点进行渲染 158
5.4.1 通过DSFUN90提高精度 160
5.4.2 精度LOD 162
5.5 一些建议 164
5.6 资源 166
第六章 深度缓存精度 168
6.1 深度缓存误差的原因 169
6.1.1 最小三角分隔 173
6.2 基本解决方案 174
6.3 补偿深度缓存 175
6.4 对数深度缓存 177
6.5 多视锥体渲染 179
6.5.1 性能影响 181
6.6 w缓存 183
6.7 算法总结 183
6.8 资源 184
第三部分 矢量数据 185
第七章 矢量数据和折线 185
7.1 矢量数据源 186
7.2 解决z冲突 186
7.3 折线 188
7.3.1 批处理 189
7.3.2 静态缓存 191
7.3.3 线宽 192
7.3.4 轮廓线 196
7.3.5 采样 199
7.4 资源 200
第八章 多边形 201
8.1 纹理渲染 201
8.2 多边形镶嵌 202
8.2.1 输入整理 203
8.2.2 三角化 206
8.2.3 耳部剪除优化 213
8.2.4 细分 214
8.2.5 设置高度 218
8.2.6 绘制 218
8.2.7 管线修正 219
8.3 地形上的多边形 219
8.3.1 绘制方法 220
8.3.2 阴影体 221
8.3.3 采用阴影体绘制多边形 223
8.3.4 优化 225
8.4 资源 226
第九章 球面布告板 227
9.1 基础渲染 228
9.2 最小化纹理切换 233
9.2.1 纹理图集装箱算法 235
9.2.2 基于纹理图集的渲染 239
9.3 原点与偏移 241
9.4 文本渲染 244
9.5 资源 247
第十章 并行化资源准备 248
10.1 并行化无处不在 248
10.1.1 CPU并行化 248
10.1.2 GPU并行化 249
10.1.3 多线程并行化 250
10.2 数字地球中任务级的并行化 251
10.3 多线程的体系结构 252
10.3.1 消息队列 253
10.3.2 粗粒度线程 255
10.3.3 细粒度线程 260
10.3.4 异步I/O 262
10.3.5 单线程测试/调试模式 263
10.4 OpenGL多线程编程 263
10.4.1 一个GL线程,多个工作线程 263
10.4.2 多个线程,一个GL上下文 264
10.4.3 多线程,多内容 265
10.4.4 多线程驱动 274
10.5 参考资料 275
第四部分 三维球面地形构建 276
第十一章 地形基础知识 276
11.1 地形表示的基础理论 277
11.1.1 高度图 277
11.1.2 体素渲染 278
11.1.3 内隐式曲面 279
11.1.4 不规则三角网格 280
11.1.5 地形表示法小结 281
11.2 渲染高度图 282
11.2.1 创建三角形网格 283
11.2.2 顶点着色位移图 286
11.2.3 GPU光线投射算法 288
11.2.4 高度放大技术 300
11.3 计算法向量 301
11.3.1 前向求差分算法 303
11.3.2 中心差分算法 305
11.3.3 Sobel滤波方法 306
11.3.4 法向量计算方法小结 308
11.4 地形着色 309
11.4.1 颜色图和纹理坐标 310
11.4.2 细节图 311
11.4.3 程序着色 311
11.5 相关资料 323
第十二章 大面积地形渲染 325
12.1 细节等级(LOD) 326
12.1.1 离散LOD 327
12.1.2 连续LOD 327
12.1.3 层次LOD 329
12.1.4 屏幕空间误差 330
12.1.5 Artifacts 332
12.2 预处理 334
12.2.1 高度图转换为Mipmaps和Clipmaps 335
12.2.2 瓦片 336
12.2.3 网格简化 338
12.3 外存绘制 338
12.3.1 缓存层次结构 339
12.3.2 加载顺序策略 340
12.3.3 替换策略 342
12.3.4 预取 343
12.3.5 压缩 345
12.4 剔除 346
12.4.1 背面剔除 346
12.4.2 视锥体剔除 347
12.4.3 地平线剔除 347
12.4.4 硬件遮挡查询 349
12.4.5 从前往后绘制 351
12.5 资源 354
第十三章 geometry clipmapping算法 355
13.1 clipmap金字塔 357
13.2 顶点缓冲区 359
13.3 顶点和片断shader 361
13.4 融合 364
13.5 clipmap更新 367
13.5.1 环形寻址 368
13.5.2 更新区域 369
13.5.3 更新高程 372
13.5.4 更新法线 374
13.5.5 多线程Out-of-Core更新 376
13.5.6 上采样 379
13.5.7 替换和预取 381
13.5.8 比较和综合 382
13.6 着色 383
13.7 球体上的geometry clipmapping算法 385
13.7.1 在顶点shader中映射到椭球体表面 385
13.7.2 spherical clipmapping算法 388
13.7.3 coordinate clipmapping算法 389
13.8 相关资料 391
第十四章 chunked LOD算法 392
14.1 chunks 393
14.2 选择过程 394
14.3 chunk之间的裂痕 396
14.4 转换算法 397
14.5 生成算法 399
14.5.1 更新 399
14.5.2 激活顶点 402
14.5.3 网格化 405
14.6 着色 405
14.7 Out-of-Core渲染 407
14.8 地球上执行chunked LOD算法 408
14.9 chunked LOD算法与geometry clipmapping算法的比较 410
14.10 相关资料 411
附录A 消息队列实现 412
参考文献 421
关于作者 432