图书目录

目    录

第1篇  发    现

第1章  基于着色器的OpenGL计算机图形学课程 3

1.1  简介 3

1.2  基础课程 4

1.3  简单的OpenGL示例 4

1.4  从可编程管线开始 7

1.5  新的简单示例 8

1.5.1  OpenGL ES和WebGL 11

1.5.2  第一项作业 11

1.6  课程的其余部分 11

1.6.1  几何 12

1.6.2  变换和视图 12

1.6.3  照明和着色 13

1.6.4  纹理和离散处理 14

1.6.5  高级主题 14

1.6.6  问题 15

1.7  小结 16

致谢 17

参考文献 17

第2章  过渡到新OpenGL版本 19

2.1  概述 19

2.2  命名着色器变量:简介 19

2.3  命名着色器变量:详细信息 20

2.4  索引顶点缓冲区对象C++类 22

2.4.1  使用注意事项 22

2.4.2  示例代码 23

2.4.3  实现说明 25

2.5  GLSLProgram C++类 26

2.5.1  使用注意事项 26

2.5.2  示例代码 27

2.5.3  实现说明 28

2.6  小结 28

参考文献 29

第3章  适用于OpenGL开发人员的WebGL 31

3.1  简介 31

3.2  WebGL的优势 31

3.2.1  零要求 32

3.2.2  跨平台 32

3.2.3  跨设备 32

3.2.4  易开发 34

3.2.5  强大的工具支持 35

3.2.6  性能 36

3.3  安全性 38

3.3.1  跨源请求 39

3.3.2  上下文丢失 41

3.4  部署着色器 41

3.5  关于JavaScript语言 42

3.5.1  JavaScript类型 43

3.5.2  动态类型 45

3.5.3  函数范围 45

3.5.4  函数编程 46

3.5.5  原型对象 47

3.5.6  this关键字 48

3.5.7  代码组织 50

3.5.8  常见错误 51

3.6  资源 51

参考文献 52

第4章  将移动应用程序移植到WebGL 53

4.1  简介 53

4.2  跨平台的OpenGL 53

4.3  入门 54

4.3.1  初始化OpenGL ES上下文 54

4.3.2  加载着色器 55

4.3.3  绘制顶点 56

4.4  加载纹理 57

4.4.1  分配纹理 57

4.4.2  处理异步加载 59

4.5  相机和矩阵 60

4.5.1  对比float和Float32Array 60

4.5.2  将矩阵传递给着色器 60

4.6  控制 61

4.6.1  触摸事件 61

4.6.2  在相机和碰撞中使用触摸事件 62

4.7  其他考虑因素 63

4.7.1  动画 63

4.7.2  继承 63

4.8  维护 64

4.8.1  调试 64

4.8.2  性能分析 65

4.8.3  性能和采用 65

4.9  小结 66

参考文献 67

第5章  GLSL着色器接口 69

5.1  简介 69

5.2  变量和块 69

5.2.1  用户定义的变量和块 69

5.2.2  内置变量和块 71

5.3  位置 72

5.3.1  定义 72

5.3.2  计算位置 73

5.3.3  位置限制 74

5.4  匹配接口 76

5.4.1  部分和完全匹配 76

5.4.2  类型匹配 78

5.4.3  按名称和位置匹配 80

5.4.4  按块匹配 81

5.4.5  按结构匹配 83

5.4.6  链接和单独的程序 86

5.5  使用语义 87

5.5.1  编译器生成的变化的位置和显式位置 87

5.5.2  顶点数组属性和顶点着色器输入 87

5.5.3  片段着色器输出和帧缓冲区颜色附加数据 89

5.5.4  变化的输出和变化的输入 90

5.5.5  统一格式缓冲区和统一格式块 91

5.6  仅适用于调试的应用程序端验证 92

5.6.1  顶点输入验证 93

5.6.2  变化的接口验证 93

5.6.3  片段输出验证 93

5.6.4  变量验证 94

5.6.5  统一格式块验证 94

5.7  小结 95

致谢 96

参考文献 96

第6章  曲面细分着色器简介 97

6.1  简介 97

6.1.1  细分表面 97

6.1.2  平滑多边形数据 98

6.1.3  GPU计算 98

6.1.4  曲线、头发和草地 98

6.1.5  其他用途 99

6.2  新的着色管道 99

6.2.1  图块的生命 101

6.2.2  线程模型 102

6.2.3  输入和输出 103

6.2.4  曲面细分控制着色器 104

6.2.5  曲面细分评估着色器 107

6.2.6  使用quads生成图元 108

6.2.7  使用triangles生成图元 109

6.3  对茶壶进行曲面细分 110

6.4  等值线和螺旋 113

6.5  结合其他OpenGL功能 114

参考文献 115

第7章  GLSL中的程序纹理 117

7.1  简介 117

7.2  简单函数 118

7.3  抗锯齿 120

7.4  Perlin噪声 121

7.5  Worley噪声 124

7.6  动画 127

7.7  纹理图像 127

7.8  性能 130

7.9  小结 131

参考文献 131

第8章  基于OpenGL和OpenGL ES的OpenGL SC仿真 133

8.1  简介 133

8.2  OpenGL SC实现 134

8.3  设计和实现 138

8.3.1  总体管线 138

8.3.2  纹理管线 140

8.4  结果 142

8.5  小结 143

参考文献 144

第9章  混合图形和使用多个GPU进行计算 147

9.1  简介 147

9.2  API级别的图形和计算互操作性 147

9.2.1  互操作性准备 147

9.2.2  OpenGL对象交互 149

9.3  系统级的图形和计算互操作性 151

9.4  小结 155

参考文献 156

第2篇  渲 染 技 术

第10章  GPU曲面细分:地形LOD讨论 159

10.1  简介 159

10.2  使用OpenGL GPU曲面细分渲染地形 159

10.3  动态LOD的简单方法 163

10.4  粗糙度和细节 166

10.5  渲染测试 168

10.5.1  测试设置 168

10.5.2  评估LOD解决方案的质量 169

10.5.3  性能 172

10.6  小结 176

参考文献 177

第11章  使用基于着色器的抗锯齿体积线 179

11.1  简介 179

11.2  后处理抗锯齿 180

11.3  抗锯齿体积线 180

11.3.1  使用顶点着色器进行几何体挤出 181

11.3.2  使用几何着色器进行几何体挤出 183

11.4  性能 185

11.5  小结 186

参考文献 186

第12章  通过距离场渲染2D形状 189

12.1  简介 189

12.2  方法概述 190

12.3  更好的距离场算法 191

12.4  距离纹理 192

12.5  硬件加速距离变换 192

12.6  片段渲染 193

12.7  特效 195

12.8  性能 195

12.9  缺点 196

12.10  小结 197

参考文献 197

第13章  WebGL中的高效文本渲染 199

13.1  简介 199

13.2  基于画布的字体渲染 199

13.2.1  HTML5 Canvas 199

13.2.2  概念 200

13.2.3  实现 200

13.3  位图字体渲染 202

13.3.1  概念 202

13.3.2  创建位图字体 204

13.3.3  实现 204

13.4  对比 206

13.4.1  性能 207

13.4.2  内存使用情况 209

13.4.3  开发难度 210

13.5  小结 210

参考文献 211

第14章  分层纹理渲染管线 213

14.1  简介 213

14.1.1  术语 214

14.1.2  在Blender软件中的纹理 214

14.2  分层管线 215

14.2.1  关于G缓冲区创建 215

14.2.2  层解决方案 216

14.2.3  统一的视差偏移 218

14.2.4  照明 219

14.3  实现和结果 219

14.3.1  实现 219

14.3.2  结果 220

14.4  小结 221

参考文献 221

第15章  景深与模糊渲染 223

15.1  简介 223

15.2  景深现象 224

15.3  相关工作 227

15.4  算法 227

15.4.1  概述 227

15.4.2  模糊圈的计算 228

15.4.3  散景检测 229

15.4.4  基于模糊的景深 232

15.4.5  散景渲染 232

15.5  结果 234

15.6  讨论 235

15.7  小结 236

参考文献 236

第16章  阴影代理 239

16.1  简介 239

16.2  对阴影代理的剖析 241

16.3  设置管线 242

16.4  启用ShadowProxy的片段着色器 244

16.5  调整阴影体积 246

16.6  性能 246

16.7  小结 248

参考文献 248

 

第3篇  混 合 管 线

第17章  使用变换反馈的基于物理学的实时变形 251

17.1  简介 251

17.2  硬件支持和变换反馈的演变 252

17.3  变换反馈的机制 253

17.4  数学模型 254

17.5  实现 258

17.5.1  使用Verlet积分顶点着色器 258

17.5.2  注册属性以变换反馈 260

17.5.3  数组缓冲区和缓冲区对象设置 261

17.5.4  数据的动态修改 263

17.6  实验结果和比较 264

17.7  小结 265

参考文献 265

第18章  GPU上的分层深度剔除和包围盒管理 267

18.1  简介 267

18.2  管线 268

18.2.1  早期深度通道 270

18.2.2  深度LOD构造 271

18.2.3  包围盒更新 272

18.2.4  分层深度剔除 274

18.2.5  包围盒调试绘图 275

18.3  操作顺序 276

18.4  实验结果 277

18.5  小结 279

参考文献 279

第19章  使用分层渲染的大量阴影 281

19.1  简介 281

19.2  在OpenGL中的传统阴影贴图渲染技术 282

19.3  阴影贴图生成算法 285

19.4  性能 287

19.4.1  使用复杂顶点着色器的性能 291

19.4.2  视锥体剔除优化 293

19.4.3  背面剔除优化 296

19.5  高级技术 298

19.6  局限性 299

19.7  小结 300

参考文献 301

第20章  高效的分层片段缓冲区技术 303

20.1  简介 303

20.2  相关工作 304

20.3  链表LFB 306

20.4  线性化LFB 307

20.5  性能结果 310

20.6  小结 314

参考文献 315

第21章  可编程顶点拉动 317

21.1  简介 317

21.2  实现 317

21.3  性能 320

21.4  应用 322

21.5  局限性 323

21.6  小结 324

参考文献 324

第22章  使用GPU硬件光栅化器进行基于八叉树的稀疏体素化 327

22.1  简介 327

22.2  以前的工作成果 328

22.3  关于GLSL中的无限制内存访问 329

22.4  简单的体素化管线 330

22.4.1  保守光栅化 332

22.4.2  组合体素片段 333

22.4.3  结果 335

22.5  稀疏体素化为八叉树 336

22.5.1  八叉树结构 337

22.5.2  稀疏体素化概述 337

22.5.3  使用原子计数器进行体素-片段列表构建 338

22.5.4  节点细分 339

22.5.5  写入和Mipmap值 340

22.5.6  使用间接绘图实现无同步内核启动 340

22.5.7  结果与讨论 341

22.6  小结 342

致谢 342

参考文献 342

第4篇  性    能

第23章  基于图块架构的性能调优 347

23.1  简介 347

23.2  背景 348

23.3  清除和丢弃帧缓冲区 351

23.4  增量帧更新 352

23.5  冲洗 353

23.6  延迟 354

23.7  隐藏表面消除 356

23.8  混合 357

23.9  多重采样 357

23.10  性能分析 358

23.11  小结 359

参考文献 359

第24章  探索移动与桌面OpenGL性能 361

24.1  简介 361

24.2  重要的差异和约束 361

24.2.1  尺寸差异 361

24.2.2  渲染架构差异 362

24.2.3  内存架构差异 363

24.3  减少内存带宽 364

24.3.1  相对显示尺寸 365

24.3.2  帧缓冲区带宽 365

24.3.3  抗锯齿 366

24.3.4  纹理带宽 367

24.3.5  纹理过滤和带宽 368

24.4  减少片段工作负载 368

24.4.1  过度绘制和混合 368

24.4.2  全屏效果 370

24.4.3  屏幕外通道 371

24.4.4  修剪片段工作 372

24.5  顶点着色 372

24.6  小结 373

参考文献 374

第25章  通过减少对驱动程序的调用来提高性能 377

25.1  简介 377

25.2  高效的OpenGL状态使用 377

25.2.1  检测冗余状态修改 378

25.2.2  有效状态修改的一般方法 378

25.3  批处理和实例化 381

25.3.1  批处理 381

25.3.2  关于OpenGL实例化 383

25.4  小结 386

致谢 386

参考文献 387

第26章  索引多个顶点数组 389

26.1  简介 389

26.2  问题 389

26.3  算法 392

26.4  顶点比较方法 393

26.4.1  关于If/Then/Else版本 393

26.4.2  关于memcmp()版本 394

26.4.3  哈希函数 394

26.5  性能 395

26.6  小结 397

参考文献 397

第27章  NVIDIA Quadro上的多GPU渲染 399

27.1  简介 399

27.2  以前的扩展方法 400

27.3  指定特定GPU进行渲染 401

27.4  优化GPU之间的数据传输 406

27.5  多GPU的应用结构 407

27.6  并行渲染方法 410

27.6.1  先排序图像分解 410

27.6.2  后排序数据分解 411

27.6.3  立体渲染 412

27.6.4  服务器端渲染 412

27.7  小结 413

参考文献 413

第5篇  传    输

第28章  异步缓冲区传输 417

28.1  简介 417

28.2  缓冲区对象 418

28.2.1  内存传输 418

28.2.2  使用提示 421

28.2.3  隐式同步 422

28.2.4  同步原语 423

28.3  上传 424

28.3.1  轮询(多个缓冲区对象) 424

28.3.2  缓冲区重新指定(孤立) 425

28.3.3  非同步缓冲区 427

28.3.4  关于AMD_pinned_memory扩展 429

28.4  下载 429

28.5  复制 432

28.6  多线程和共享上下文 432

28.6.1  多线程OpenGL简介 433

28.6.2  同步问题 434

28.6.3  内部同步导致的性能损失 434

28.6.4  关于共享上下文的总结 435

28.7  使用方案 436

28.7.1  方法1:单线程 436

28.7.2  方法2:两个线程和一个OpenGL上下文 437

28.7.3  方法3:两个线程和两个OpenGL共享上下文 439

28.7.4  性能比较 439

28.8  小结 441

参考文献 442

第29章  费米异步纹理传输 443

29.1  简介 443

29.2  关于OpenGL命令缓冲区执行 445

29.3  当前纹理传输方法 446

29.3.1  同步纹理传输 447

29.3.2  CPU异步纹理传输 448

29.4  GPU异步纹理传输 450

29.5  实现细节 452

29.5.1  多个OpenGL上下文 452

29.5.2  同步 453

29.5.3  复制引擎注意事项 455

29.6  结果与分析 455

29.7  小结 460

参考文献 460

第30章  WebGL模型:端到端 461

30.1  简介 461

30.2  关于3D模型的生命周期 462

30.2.1  第1阶段:管线 462

30.2.2  第2阶段:服务 463

30.2.3  第3阶段:加载 465

30.2.4  第4阶段:渲染 468

30.3  整体一致性 472

30.3.1  Delta编码 473

30.3.2  Delta编码分析 474

30.3.3  ZigZag编码 475

30.3.4  Delta+ZigZag编码分析 476

30.3.5  压缩管线 477

30.4  主要改进 478

30.4.1  交错和转置的对比 478

30.4.2  高水位线预测 479

30.4.3  性能 482

30.4.4  未来的工作 482

30.5  小结 483

致谢 483

参考文献 484

第31章  使用实时纹理压缩进行游戏内视频捕捉 485

31.1  简介 485

31.2  DXT压缩概述 485

31.3  DXT压缩算法 486

31.4  转换为YUV格式颜色空间 488

31.5  比较 490

31.6  对程序内容和视频捕捉使用实时DXT压缩 492

31.6.1  使用YUYV-DXT压缩的视频捕捉 492

31.6.2  带宽因素 493

31.6.3  视频流的格式 493

31.6.4  从GPU下载视频帧 495

31.7  小结 495

参考文献 496

第32章  OpenGL友好几何文件格式及其Maya导出器 497

32.1  简介 497

32.2  背景知识 497

32.2.1  目标和特性 497

32.2.2  现有格式 499

32.3  关于Drone格式 499

32.3.1  二进制布局 499

32.3.2  Drone API 501

32.3.3  场景API 503

32.4  编写Maya文件转换器 504

32.4.1  Maya SDK基础知识 504

32.4.2  编写转换器 505

32.4.3  遍历Maya DAG 506

32.4.4  导出可供OpenGL使用的网格 506

32.5  结果 507

32.6  小结 509

参考文献 510

第6篇  调试和性能分析

第33章  开发人员的强力臂助:ARB_debug_output 513

33.1  简介 513

33.2  公开扩展 513

33.3  使用回调函数 514

33.4  通过事件原因排序 515

33.5  访问消息日志 516

33.6  将自定义用户事件添加到日志中 517

33.7  控制事件输出量 518

33.8  防止对最终版本的影响 519

33.9  巨头之间的争斗:实现策略 520

33.10  关于调试的进一步思考 521

33.11  小结 521

参考文献 522

 

第34章  OpenGL计时器查询 523

34.1  简介 523

34.2  测量OpenGL执行时间 524

34.2.1  关于OpenGL时间 525

34.2.2  同步计时器查询 525

34.2.3  异步计时器查询 526

34.2.4  异步时间戳查询 528

34.2.5  考虑查询检索 530

34.3  小结 531

参考文献 532

第35章  实时性能分析工具 533

35.1  简介 533

35.2  范围和要求 533

35.3  工具设计 534

35.3.1  用户界面 534

35.3.2  限制和解决方法 535

35.3.3  应用程序编程接口 535

35.4  实现 536

35.4.1  测量CPU上的时间 536

35.4.2  测量GPU上的时间 537

35.4.3  数据结构 537

35.4.4  标记管理 539

35.5  使用性能分析程序 540

35.5.1  使用级别 540

35.5.2  确定应测量的内容 541

35.5.3  艺术设计师 542

35.5.4  局限性 542

35.6  小结 542

参考文献 543

第36章  浏览器图形分析和优化 545

36.1  简介 545

36.2  发光效果的阶段 545

36.3  发光效果的开销 547

36.4  分析WebGL应用程序 548

36.4.1  近乎原生的图形层引擎 548

36.4.2  JavaScript性能分析 549

36.4.3  WebGL Inspector 550

36.4.4  英特尔图形性能分析器 550

36.5  Windows上的分析工作流程 551

36.6  优化发光效果 554

36.6.1  较低的渲染目标分辨率 555

36.6.2  不必要的Mipmap生成 556

36.6.3  浮点帧缓冲区 557

36.7  小结 558

参考文献 559

第37章  性能状态跟踪 561

37.1  简介 561

37.2  功耗策略 561

37.3  使用NVAPI进行P状态跟踪 562

37.3.1  关于GPU利用率 563

37.3.2  读取P状态 564

37.4  使用ADL进行P状态跟踪 566

37.5  小结 567

参考文献 567

第38章  图形内存使用情况监控 569

38.1  简介 569

38.2  图形内存分配 569

38.3  查询NVIDIA显卡的内存状态 570

38.4  查询AMD显卡的内存状态 571

38.5  小结 573

参考文献 573

 

第7篇  软 件 设 计

第39章  ANGLE项目:在Direct3D上实现OpenGL ES 2.0 577

39.1  简介 577

39.2  背景 577

39.3  实现 578

39.3.1  坐标系 579

39.3.2  着色器编译器和链接器 583

39.3.3  顶点和索引缓冲区 587

39.3.4  纹理 588

39.3.5  顶点纹理提取 591

39.3.6  图元类型 591

39.3.7  蒙版清除 592

39.3.8  单独的深度和模板缓冲区 592

39.3.9  同步 593

39.3.10  多重采样 593

39.3.11  多个上下文和资源共享 594

39.3.12  上下文丢失 595

39.3.13  资源限制 596

39.3.14  优化 597

39.3.15  推荐做法 598

39.3.16  性能结果 599

39.4  未来工作 600

39.5  小结 600

39.6  源代码 600

致谢 600

参考文献 601

第40章  SceneJS:基于WebGL的场景图形引擎 603

40.1  简介 603

40.2  有效抽象WebGL 604

40.2.1  绘制列表编译 609

40.2.2  状态排序 610

40.3  优化场景 611

40.3.1  纹理图集 611

40.3.2  VBO共享 611

40.3.3  可共享的节点核心 612

40.4  拾取 614

40.5  小结 614

参考文献 614

第41章  SpiderGL中的特性和设计选择 617

41.1  简介 617

41.2  库架构 617

41.3  表示3D对象 619

41.4  直接访问WebGL对象状态 624

41.4.1  问题 625

41.4.2  解决方案 626

41.4.3  使用SGL_current_binding 628

41.4.4  使用SGL_direct_state_access 630

41.4.5  缺点 632

41.5  WebGLObject包装器 633

41.6  小结 637

致谢 637

参考文献 637

第42章  Web上的多模态交互式模拟 639

42.1  简介 639

42.2  关于Π-SoFMIS模块的设计和定义 639

42.3  框架实现 641

42.3.1  模态 642

42.3.2  着色器 642

42.3.3  文件格式 642

42.4  渲染模块 643

42.5  模拟模块 646

42.6  硬件模块 647

42.7  案例研究:LAGB模拟器 649

42.8  小结 655

参考文献 655

第43章  使用OpenGL和OpenGL ES的子集方法 657

43.1  简介 657

43.2  使陈旧的代码现代化 658

43.2.1  立即模式和顶点属性数组 658

43.2.2  图元选择 660

43.2.3  位图和多边形点画 660

43.3  保持代码在API变体中的可维护性 662

43.3.1  顶点和片段处理 662

43.3.2  GLX和EGL 663

43.3.3  顶点数组对象 663

43.3.4  线框模式 664

43.3.5  纹理包装模式 664

43.3.6  非2的n次幂 666

43.3.7  图像格式和类型 667

43.3.8  图像布局 668

43.3.9  着色语言 668

43.4  特定功能的代码块 669

43.5  小结 669

参考文献 670

第44章  构建跨平台应用程序 671

44.1  简介 671

44.2  使用实用程序库 673

44.2.1  使用GLUT的示例 673

44.2.2  使用Qt的示例 674

44.2.3  使用EGL的示例 675

44.3  与OpenGL版本无关的代码 676

44.4  配置空间 679

44.5  关于Metabuilds和CMake 680

44.6  关于CMake和配置空间 681

44.7  关于CMake和平台细节 684

44.7.1  平台:Windows 685

44.7.2  平台:Mac OS X 685

44.7.3  平台:iOS 686

44.8  小结 690

参考文献 690