本書詳細闡述了與物理渲染相關的高效解決方案,主要包括幾何形狀和轉換,圖元和相交加速計算,顏色和輻射度,相機模型,采樣和重構,反射模型,材質、紋理、體散射、光源、蒙特卡羅積分、光線傳輸等內容。此外,本書還提供了相應的算法、代碼以及偽代碼,以幫助讀者進一步理解相關方案的實現過程。
本書適合作為高等院校計算機及相關專業的教材和教學參考書,也可作為相關開發人員的自學教材和參考 手冊。
前 言
渲染可視為計算機圖形學中的基礎內容。在最高抽象層次上,渲染行為表示為三維場景描述與圖像之間的轉換。動畫、集合建模、紋理機制以及其他計算機圖形學領域的相關算法須通過某種渲染處理過程傳遞其結果,進而在圖像中呈現。渲染操作的應用日趨廣泛,包括影視業以及游戲等領域,并逐漸成為創意表達、娛樂以及視覺化的前沿陣地。在該領域的早期,渲染研究主要集中于處理基本問題,例如確定相對于既定視點的可見對象。隨著高效方法的不斷涌現,以及圖形學其他領域不斷發展導致的更為豐富、逼真的場景描述,現代渲染操作擴展為更為廣泛的學科領域,包括物理和天文物理、天文學、生物學、心理學、感知研究以及純數學和應用數學。渲染操作的跨學科特征也使其成為一個令人著迷的科研領域。本書通過完整渲染系統的文檔資源代碼,選取了相應的渲染算法,書中的全部圖像均通過該系統加以渲染。pbrt系統通過文學編程(literate programming)這一程序設計方法加以編寫,并將系統描述與其實現代碼加以混合。在計算機圖形學和通用計算機科學中,文學編程可視為引入相關概念的一種有效方法。某些時候,算法細節直至其實現完畢后方清晰呈現。因此,考察算法的真實實現過程則是深入理解算法細節的一種較好方法。實際上,針對計算機圖形學的進一步研究,與粗淺的了解相比,通過這一方式可向讀者提供更為堅實的基礎知識。除了了解算法的實際實現之外,在完整和較為重要的軟件系統中表達算法還可處理中等規模渲染系統中的設計和實現問題。渲染系統的基本抽象和接口設計對于實現的優雅性以及后續擴展性均會產生較大的影響,而這一設計領域內的折中方案則較少討論。pbrt以及本書內容主要討論照片級渲染,并可通過多種不同方式定義為圖像生成任務,且與相機所拍攝的照片基本一致;或者對應圖像生成任務具有與人眼相同的響應機制。除此之外,照片級圖像對于影視特效工業也十分重要,其原因在于,計算機生成的圖像須與真實世界環境實現無縫混合。在娛樂應用中,全部圖像均為合成結果,真實感可視為一種效果工具,以使觀眾不會留意并不存在的場景環境。最后,針對渲染系統的輸出質量,真實感還可作為一種定義良好的度量方案。本書及其所描述的系統并不會涉及渲染過程中的全部技術,鑒于某些與真實感渲染相關的話題無法與軟件系統體系結構實現較好的適配(例如有限元輻射度算法),因而相關內容并未出現于本書中;或者,算法的實現復雜度已超出了其教學價值。相關內容本書會在相應章節予以提示,并提供了相應的參考資源以供讀者進一步閱讀。另外,渲染機制的其他領域,例如交互式渲染、可視化機制以及渲染說明形式(例如筆墨風格)本書也并未涉及。無論如何,系統中的大多數算法和概念(例如紋理貼圖抗鋸齒算法)適用于多種不同類型的渲染集。
目 錄
第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
BRDFBTDF適配器 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章 蒙特卡羅積分I:基本概念 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章 蒙特卡羅積分II:效率改善 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章 光線傳輸I:表面反射 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章 光線傳輸II:體渲染 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章 光線傳輸III:光線傳輸的預計算 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
22線性方程組 801
A.6.2
44矩陣 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