第1章 概述 1
1.1 文学编程 1
1.2 照片级渲染和光线跟踪算法 3
1.2.1 相机 4
1.2.2 光线-对象相交 5
1.2.3 光照分布 6
1.2.4 可见性 7
1.2.5 表面散射 7
1.2.6 递归光线跟踪 8
1.2.7 光线传播 9
1.3 pbrt系统概述 11
1.3.1 执行阶段 14
1.3.2 场景表达 15
1.3.3 渲染器接口与SamplerRenderer 17
1.3.4 主渲染循环 19
1.3.5 pbrt的并行机制 27
1.3.6 WHITTED光线跟踪积分器 31
1.4 如何阅读本书 35
1.5 使用并理解程序代码 36
1.5.1 指针或引用 36
1.5.2 代码优化 36
1.5.3 本书网站 37
1.5.4 系统扩展 37
1.5.5 Bug 37
1.6 进一步阅读 38
1.7 本章练习 39
第2章 几何形状和转换 40
2.1 坐标系 40
2.2 向量 41
2.2.1 运算 42
2.2.2 缩放操作 43
2.2.3 点积和叉积计算 44
2.2.4 标准化计算 46
2.2.5 基于向量的坐标系 46
2.3 点 47
2.4 法线 49
2.5 射线 50
2.6 三维包围盒 53
2.7 转换操作 56
2.7.1 齐次坐标 57
2.7.2 基本操作 58
2.7.3 平移 59
2.7.4 缩放操作 61
2.7.5 x, y, z轴旋转 62
2.7.6 围绕任意轴的旋转行为 63
2.7.7 视见转换 65
2.8 转换应用 66
2.8.1 点 67
2.8.2 向量 67
2.8.3 法线 68
2.8.4 射线 68
2.8.5 包围盒 69
2.8.6 复合转换 69
2.8.7 转换和坐标系的左右手规则 70
2.9 动画转换 70
2.9.1 四元数 72
2.9.2 四元数插值 74
2.9.3 AnimatedTransform实现 75
2.10 微分几何 79
2.11 进一步阅读 82
2.12 本章练习 83
第3章 几何形状 84
3.1 基本的Shape接口 84
3.1.1 包围机制 85
3.1.2 细化操作 86
3.1.3 相交行为 87
3.1.4 避免自相交行为 88
3.1.5 几何体着色 88
3.1.6 表面积 89
3.1.7 多面性 89
3.2 球体 89
3.2.1 构建过程 91
3.2.2 包围体 91
3.2.3 相交 92
3.2.4 局部球体 94
3.2.5 法线向量的偏导数 96
3.2.6 DifferentialGeometry的初始化操作 97
3.2.7 表面积 98
3.3 圆柱体 99
3.3.1 圆柱体的构造过程 99
3.3.2 圆柱体的包围机制 101
3.3.3 圆柱体的相交计算 101
3.3.4 局部圆柱体 102
3.3.5 圆柱体的表面积 103
3.4 圆盘 103
3.4.1 圆盘的构建过程 104
3.4.2 圆盘的包围机制 105
3.4.3 圆盘的相交计算 105
3.4.4 圆盘的表面积 106
3.5 其他二次表面 107
3.5.1 圆锥体 107
3.5.2 抛物面 108
3.5.3 双曲面 108
3.6 三角形和网格 109
3.6.1 三角形 112
3.6.2 三角形相交计算 113
3.6.3 网格表面积 117
3.6.4 着色几何体 118
3.7 表面细分 120
3.7.1 网格表达方式 122
3.7.2 网格边界 130
3.7.3 网格细分 130
3.7.4 计算新的顶点位置 132
3.7.5 更新网格拓扑结构 137
3.7.6 极限表面和输出结果 139
3.8 进一步阅读 142
3.9 本章练习 143
第4章 图元和相交加速计算 148
4.1 图元接口和几何图元 148
4.1.1 几何图元 151
4.1.2 TransformedPrimitive:对象实例和动画图元 152
4.2 集合体 155
4.3 网格加速结构 158
4.3.1 构建过程 159
4.3.2 遍历操作 164
4.4 包围体层次结构 169
4.4.1 BVH构建过程 170
4.4.2 启发式表面积计算 176
4.4.3 遍历过程中的紧凑BVH 180
4.4.4 遍历 182
4.5 kd树加速结构 185
4.5.1 树形结构的表达方式 186
4.5.2 树形结构的构造方式 188
4.5.3 遍历操作 196
4.6 调试聚合体 200
4.6.1 寻找聚合体中的bug 201
4.6.2 修复几何体中的bug 204
4.6.3 聚合体性能问题 204
4.7 进一步阅读 205
4.7.1 网格 205
4.7.2 包围体层次结构 205
4.7.3 kd树 207
4.7.4 启发式表面积方案 207
4.7.5 其他加速结构 208
4.8 本章练习 209
第5章 颜色和辐射度 212
5.1 光谱表达方式 212
5.1.1 Spectrum类型 213
5.1.2 CoefficientSpectrum实现 214
5.2 SampledSpectrum类 216
5.2.1 XYZ颜色 219
5.2.2 RGB颜色 222
5.3 RGBSpectrum实现 227
5.4 辐射度测量学的基本知识 229
5.4.1 基本量值 230
5.4.2 入射和出射辐射度函数 233
5.4.3 亮度和光度测定 233
5.5 与辐射积分协同工作 234
5.5.1 投影立体角的积分运算 235
5.5.2 球体坐标的积分运算 235
5.5.3 面积积分运算 237
5.6 表面反射 239
5.6.1 BRDF 239
5.6.2 BSSRDF 240
5.7 进一步阅读 241
5.8 本章练习 242
第6章 相机模型 243
6.1 相机模型概述 243
6.2 投影相机模型 246
6.2.1 正交相机 247
6.2.2 透视相机 250
6.2.3 景深 253
6.3 环境相机 257
6.4 进一步阅读 258
6.5 本章练习 259
第7章 采样和重构 260
7.1 采样理论 260
7.1.1 频率范围和傅里叶变换 261
7.1.2 理想采样状态和重构 263
7.1.3 锯齿 266
7.1.4 抗锯齿技术 267
7.1.5 图像合成技术 269
7.1.6 渲染中的锯齿来源 269
7.1.7 理解像素数据 270
7.2 图像采样接口 271
7.3 分层采样 277
7.4 低偏差采样 287
7.4.1 偏差定义 288
7.4.2 HAMMERSLEY和HALTON序列 289
7.4.3 [0,2]序列 295
7.4.4 低偏差采样器 298
7.5 最佳候选采样模式 303
7.6 自适应采样 309
7.7 图像重构 314
7.8 Film类和成像管线 323
7.8.1 Film接口 323
7.8.2 ImageFilm类 325
7.9 进一步阅读 333
7.10 本章练习 336
第8章 反射模型 339
8.1 基本接口 342
8.1.1 反射率 344
8.1.2 BRDF→BTDF适配器 345
8.1.3 BxDF缩放适配器 345
8.2 镜面反射和透射 346
8.2.1 菲涅耳反射率 347
8.2.2 镜面反射 351
8.2.3 镜面透射 354
8.3 Lambertian反射 358
8.4 微面元模型 358
8.4.1 Oren-Nayar漫反射 360
8.4.2 Torrance-Sparrow模型 361
8.4.3 Blinn微面元分布 364
8.4.4 各项异性微面元模型 366
8.5 菲涅耳入射效果 368
8.6 测算BRDF 370
8.6.1 不规则的各向同性测算BRDF 371
8.6.2 规则半角格式 374
8.7 进一步阅读 376
8.8 本章练习 378
第9章 材质 380
9.1 BSDF 380
9.2 Material接口和实现 385
9.2.1 MatteMaterial类 386
9.2.2 PlasticMaterial类 387
9.2.3 混合材质 389
9.2.4 测算材质 390
9.2.5 其他材质 391
9.3 凹凸贴图 392
9.4 进一步阅读 396
9.5 本章练习 397
第10章 纹理 399
10.1 采样和抗锯齿操作 400
10.1.1 计算纹理采样率 400
10.1.2 滤波纹理函数 404
10.1.3 镜面反射和透射的光线微分 405
10.2 纹理坐标生成 408
10.2.1 2D(u,v)映射 409
10.2.2 球体映射 410
10.2.3 圆柱体映射 411
10.2.4 平面映射 412
10.2.5 3D映射 413
10.3 纹理接口和基本纹理 413
10.3.1 固定纹理 414
10.3.2 混合纹理 415
10.3.3 线性插值 416
10.4 图像纹理 417
10.4.1 纹理缓存 418
10.4.2 纹理链 421
10.4.3 各向同性三角形滤波器 428
10.4.4 椭圆加权平均值 430
10.5 体纹理和过程纹理 435
10.5.1 UV纹理 436
10.5.2 棋盘纹理 436
10.5.3 体棋盘纹理 441
10.6 噪声 442
10.6.1 Perlin噪声 443
10.6.2 随机波尔卡圆斑 446
10.6.3 频谱合成 448
10.6.4 凹凸和褶皱纹理 451
10.6.5 风力波形 452
10.6.6 大理石纹理 453
10.7 进一步阅读 454
10.8 本章练习 456
第11章 体散射 459
11.1 体散射处理过程 459
11.1.1 吸收过程 460
11.1.2 放射过程 461
11.1.3 外散射和衰减 462
11.1.4 内散射 463
11.2 相位函数 464
11.3 体接口和均一介质 467
11.4 密度变化的空间体 470
11.4.1 3D网格 471
11.4.2 指数密度 473
11.5 体聚合 475
11.6 BSSRDF类 476
11.7 进一步阅读 478
11.8 本章练习 479
第12章 光源 481
12.1 Light接口 481
12.2 点光源 484
12.2.1 聚光灯 486
12.2.2 纹理投射光照 488
12.2.3 测角光度图光照 491
12.3 平行光照 494
12.4 区域光照 495
12.5 无穷远区域光源 499
12.6 进一步阅读 501
12.7 本章练习 503
第13章 蒙特卡罗积分Ⅰ:基本概念 504
13.1 背景知识和概率回顾 505
13.1.1 连续随机变量 505
13.1.2 期望值和方差 506
13.2 蒙特卡罗估算函数 507
13.3 随机变量的基本采样 508
13.3.1 反演法 509
13.3.2 舍选法 514
13.4 METROPOLIS采样 516
13.4.1 基本算法 516
13.4.2 选取突变策略 517
13.4.3 初始偏差 518
13.4.4 基于Metropolis采样的积分 519
13.4.5 示例:一维设置 519
13.5 分布间的转换 522
13.5.1 多维转换 523
13.5.2 极坐标 523
13.5.3 球体坐标 523
13.6 包含多维转换的2D采样 524
13.6.1 示例:半球均匀采样 524
13.6.2 单位圆盘对象采样 526
13.6.3 余弦加权半球采样 529
13.6.4 示例:三角形采样 530
13.6.5 示例:分段-常量2D分布 531
13.7 进一步阅读 534
13.8 本章练习 535
第14章 蒙特卡罗积分Ⅱ:效率改善 536
14.1 俄罗斯轮盘赌和划分机制 537
14.2 采样置放 538
14.2.1 分层采样 538
14.2.2 quasi蒙特卡罗技术 540
14.2.3 采样翘曲和变形 541
14.3 偏差 541
14.4 重要性采样 542
14.5 多重重要性采样机制 544
14.6 采样反射函数 547
14.6.1 Blinn微面元分布采样 548
14.6.2 各向异性微面元模型的采样 551
14.6.3 FresnelBlend采样 553
14.6.4 镜面反射和透射 553
14.6.5 应用:反射率估算 555
14.6.6 BSDF采样 556
14.7 光源采样 559
14.7.1 基本接口 560
14.7.2 包含奇点的光源 562
14.7.3 区域光源 565
14.7.4 ShapeSet采样 571
14.7.5 无穷大区域光源 572
14.8 体散射 577
14.8.1 相位函数采样 577
14.8.2 计算光学厚度 578
14.9 进一步阅读 579
14.10 本章练习 580
第15章 光线传输Ⅰ:表面反射 583
15.1 直接光照 584
15.2 光线传输方程 592
15.2.1 基本推导过程 593
15.2.2 LTE的解析解 594
15.2.3 LTE的表面形式 595
15.2.4 路径积分 596
15.2.5 被积函数中的delta分布 597
15.2.6 划分被积函数 598
15.2.7 测量方程和重要性 599
15.3 路径跟踪 600
15.3.1 概述 600
15.3.2 路径采样 601
15.3.3 递增式路径构造 603
15.3.4 实现过程 603
15.3.5 双向路径跟踪 607
15.4 实时全局光照 608
15.4.1 创建虚拟光源 611
15.4.2 利用虚拟光源进行渲染 615
15.5 辐射度缓存机制 619
15.5.1 利用辐射度缓存进行渲染 622
15.5.2 查找和插值 624
15.5.3 添加新值 627
15.6 粒子跟踪和光子贴图 629
15.6.1 粒子跟踪的理论基础 630
15.6.2 光子积分器 632
15.6.3 构造光子贴图 634
15.6.4 使用光子贴图 645
15.6.5 光子插值和密度估算 654
15.7 METROPOLIS光线传输算法 658
15.7.1 采样表达方式 661
15.7.2 突变行为 663
15.7.3 生成路径 665
15.7.4 路径影响作用 667
15.7.5 MetropolisRenderer实现 674
15.7.6 渲染操作 677
15.8 进一步阅读 681
15.9 本章练习 684
第16章 光线传输 Ⅱ:体渲染 688
16.1 传输方程 688
16.2 体积分器接口 690
16.3 发射积分器 690
16.4 单散射积分器 695
16.5 子表面散射 697
16.5.1 采样点的泊松分布 700
16.5.2 构建采样点八叉树 707
16.5.3 偶极漫反射近似计算 711
16.5.4 基于层次结构积分的渲染行为 716
16.5.5 设置散射属性 719
16.6 进一步阅读 721
16.7 本章练习 723
第17章 光线传输Ⅲ:光线传输的预计算 727
17.1 基础函数:理论 728
17.1.1 分段式-常数基 729
17.1.2 基上的投影 730
17.1.3 正交基函数 731
17.2 球谐函数 732
17.2.1 高效计算 734
17.2.2 光源投影 740
17.2.3 投影入射辐射度函数 746
17.2.4 减少环状效果 747
17.2.5 旋转 748
17.3 辐射度探测器 752
17.3.1 创建辐射度探测器 753
17.3.2 使用辐射度探测器 759
17.4 漫反射传输预计算 763
17.5 光泽传输预计算 766
17.5.1 传输矩阵 768
17.5.2 BSDF矩阵 769
17.5.3 GlossyPRTIntegrator实现 771
17.6 进一步阅读 774
17.7 本章练习 775
第18章 回顾和展望 777
18.1 设计回顾 777
18.1.1 抽象与效率 778
18.1.2 其他设计方案:仅使用三角形 778
18.1.3 提升场景复杂度 779
18.2 吞吐量处理器 779
18.2.1 未来发展状况 781
18.2.2 参考资源 781
18.3 总结 782
附录A实用工具 783
A.1 主要包含的文件 783
A.1.1 工具函数 783
A.1.2 伪随机数 786
A.2 图形文件的输入和输出 786
A.3 与用户的通信 787
A.3.1 错误报告 788
A.3.2 进度报告 788
A.3.3 简单的浮点文件读取器 789
A.4 探测器和统计 789
A.5 内存管理 791
A.5.1 可变栈的分配 791
A.5.2 引用计数对象 792
A.5.3 以缓存友好方式使用内存 794
A.5.4 Arena内存分配 796
A.5.5 2D块数组 798
A.6 数学计算例程 801
A.6.1 2×2线性方程组 801
A.6.2 4×4矩阵 801
A.7 八叉树 802
A.8 kd树 807
A.9 并行机制 813
A.9.1 内存一致性模型以及性能 813
A.9.2 原子操作 814
A.9.3 互斥体 817
A.9.4 任务系统 818
A.10 进一步阅读 820
A.11 本章练习 821
附录B 场景描述接口 822
B.1 参数集 823
B.1.1 ParamSetItem结构 824
B.1.2 添加参数集 824
B.1.3 在参数集查找数据值 825
B.2 初始化和渲染选项 827
B.2.1 状态跟踪 828
B.2.2 转换操作 829
B.2.3 选项 831
B.3 场景描述 834
B.3.1 层次图形状态 834
B.3.2 纹理和材质参数 836
B.3.3 表面和材质描述 837
B.3.4 光源 839
B.3.5 形状和体区域 840
B.3.6 对象实例化操作 843
B.3.7 场景结束与渲染操作 845
B.4 添加新的对象实现 847
B.5 进一步阅读 847
B.6 本章练习 848
参考文献 850