光線追蹤精粹:基於DXR及其他API的高質量實時渲染(簡體書)
商品資訊
ISBN13:9787030695208
出版社:科學出版社
作者:(美)埃里克‧海恩斯; (瑞)托馬斯‧艾克奈-莫勒
出版日:2021/08/30
裝訂/頁數:平裝/428頁
規格:24cm*17cm (高/寬)
版次:一版
商品簡介
目次
書摘/試閱
商品簡介
《光線追蹤精粹——基於DXR及其他API的高質量實時渲染》共分七大部分:第一部分幫你理解現代光線追蹤的基礎知識和進行高效渲染所需的思維模式;第二部分為從事光線追蹤器編寫工作的讀者提供一些對於問題的洞察,乃至解決方案;第三部分介紹構建一個產品級的光線追蹤渲染器時對基本的效果進行處理的方法;第四部分介紹採樣的相關知識;第五部分介紹了多個實用的降噪和濾波技術;第六部分展示五種混合使用光柵和光線追蹤的渲染系統;第七部分介紹了用光線追蹤實現全域光照的五個開拓性工作。《光線追蹤精粹——基於DXR及其他API的高質量實時渲染》提供了不少獨門絕技,當這些技巧和技術由撰寫《光線追蹤精粹——基於DXR及其他API的高質量實時渲染》的專家們分享出來時,它們成為了無價的珠寶。
目次
目錄
第一部分 光線追蹤基礎
第1章 光線追蹤術語 3
1.1 歷史回顧 3
1.2 定義 4
參考文獻 7
第2章 什麼是光線? 9
2.1 光線的數學表示 9
2.2 光線區間 10
2.3 DXR中的光線 11
2.4 小結 12
參考文獻 12
第3章 DirectX光線追蹤介紹 13
3.1 介紹 13
3.2 概述 13
3.3 準備就緒 14
3.4 DirectX光線追蹤管線 14
3.5 HLSL針對DXR的新增支持 16
3.5.1 在HLSL中生成新的光線 17
3.5.2 在HLSL中控制光線遍歷 17
3.5.3 額外的HLSL內建函式 18
3.6 一個簡單的HLSL光線追蹤案例 19
3.7 主機端初始化DXR 20
3.8 基礎的DXR初始化和設置 21
3.8.1 幾何體和加速結構 22
3.8.2 根簽名 25
3.8.3 編譯著色器 26
3.9 光線追蹤管線狀態物件(RTPSO) 27
3.10 著色器表 30
3.11 發射光線 32
3.12 挖掘更深和更多的資源 33
3.13 小結 33
參考文獻 34
第4章 天文館球幕相機 36
4.1 介紹 36
4.2 方法 36
4.2.1 從視口座標計算光線方向 38
4.2.2 環形立體投影 40
4.2.3 景深 42
4.2.4 抗鋸齒 43
4.3 天文館球幕投影的示例代碼 43
參考文獻 43
第5章 計算子陣列的*小值和*大值 45
5.1 動機 45
5.2 整表查詢法 45
5.3 稀疏表查詢法 46
5.4 區間樹遞迴查詢法 47
5.5 區間樹反覆運算查詢法 48
5.6 結果 50
5.7 小結 51
參考文獻 51
第二部分 相交和效率
第6章 避免自相交的快速可靠的方法 55
6.1 引言 55
6.2 方法 55
6.2.1 計算物體表面上的交點 55
6.2.2 避免自相交 57
6.3 小結 60
參考文獻 61
第7章 光線/球體相交檢測的精度提升 62
7.1 光線/球體相交基礎 62
7.2 浮點精度探究 63
7.3 相關資源 66
參考文獻 67
第8章 精巧的曲面:計算光線/雙線性曲面相交的幾何方法 68
8.1 引言與當前技術 68
8.1.1 性能測試 70
8.1.2 網格四邊形化 70
8.2 GARP細節 71
8.3 結果討論 73
8.4 代碼 76
參考文獻 77
第9章 DXR中的多重命中光線追蹤 80
9.1 引言 80
9.2 實現 81
9.2.1 樸素的多重命中遍歷 83
9.2.2 節點剔除多重命中BVH遍歷 85
9.3 結果 86
9.3.1 性能測量 86
9.3.2 討論 89
9.4 結論 90
參考文獻 91
第10章 一種具有高擴展效率的簡單負載均衡方案 92
10.1 引言 92
10.2 要求 92
10.3 負載均衡 93
10.3.1 簡單分塊 93
10.3.2 任務大小 93
10.3.3 任務分佈 94
10.3.4 圖像組裝 95
10.4 結果 96
參考文獻 97
第三部分 反射,折射與陰影
第11章 嵌套volume中材質的自動處理 101
11.1 volume的建模 101
11.1.1 獨立邊界 101
11.1.2 添加空氣間隙 102
11.1.3 重疊的邊界 102
11.2 算法 103
11.3 局限性 106
參考文獻 107
第12章 基於微表面陰影函數解決凹凸貼圖中的陰影邊界問題 108
12.1 介紹 108
12.2 之前的工作 109
12.3 方法 109
12.3.1 法線分佈函數 110
12.3.2 陰影函數 112
12.4 結果 113
參考文獻 114
第13章 光線追蹤陰影:保持實時畫面播放速率 115
13.1 介紹 115
13.2 相關工作 116
13.3 光線追蹤陰影 117
13.4 自我調整採樣 119
13.4.1 時間重投影 119
13.4.2 識別半影區域 120
13.4.3 計算採樣數目 121
13.4.4 採樣Mask 121
13.4.5 計算可見性 122
13.5 實現 123
13.5.1 採樣點集生成 124
13.5.2 按距離剔除燈光 124
13.5.3 限制總採樣數 124
13.5.4 在前向渲染管線中集成 125
13.6 結果 127
13.6.1 與陰影映射(方法)的對比 127
13.6.2 軟陰影與硬陰影對比 128
13.6.3 限制 129
13.7 總結和未來的工作 129
參考文獻 130
第14章 DXR下的在單散射介質中引導光線的體積水焦散 132
14.1 介紹 132
14.2 體積光和折射光 134
14.3 算法 136
14.3.1 計算光束壓縮比 136
14.3.2 渲染焦散圖 137
14.3.3 光線追蹤折射焦散圖和累積表面焦散 138
14.3.4 自我調整地對水表面的三角形進行曲面細分 139
14.3.5 構建三角形光束體積 140
14.3.6 使用加算混合方式渲染體積焦散 140
14.3.7 結合表面焦散和體積焦散 141
14.4 實現細節 141
14.5 結果 141
14.6 將來的工作 143
14.7 演示 143
參考文獻 143
第四部分 採樣
第15章 重要性採樣 147
15.1 引言 147
15.2 例子:環境光遮蔽 148
15.3 理解方差 151
15.4 直接光照 153
15.5 結論 155
參考文獻 156
第16章 採樣變換集合 157
16.1 採樣機制 157
16.2 樣本分佈介紹 157
16.3 一維分佈 159
16.3.1 線性函數 159
16.3.2 三角形函數 159
16.3.3 正態分佈 159
16.3.4 一維離散分佈採樣 160
16.4 二維分佈採樣 162
16.4.1 雙線性 162
16.4.2 二維紋理分佈 162
16.5 均勻表面採樣 165
16.5.1 圓盤 165
16.5.2 三角形 166
16.5.3 三角形網格 167
16.5.4 球 167
16.6 方向採樣 168
16.6.1 Z軸向余弦加權半球 169
16.6.2 向量軸向余弦加權半球 169
16.6.3 錐體方向採樣 169
16.6.4 PHONG分佈採樣 170
16.6.5 GGX分佈 170
16.7 體積散射 171
16.7.1 體積中的距離 171
16.7.2 Henyey-Greenstein相函數 172
16.8 添加到集合中 172
參考文獻 173
第17章 忽略光線追蹤時的不便 174
17.1 引言 174
17.2 動機 174
17.3 截斷法 176
17.4 路徑正則化 176
17.5 總結 177
參考文獻 178
第18章 GPU實現的多光源重要性採樣 179
18.1 概述 179
18.2 傳統算法回顧 180
18.2.1 實時光源剔除 180
18.2.2 多光源的算法 181
18.2.3 光源重要性採樣 181
18.3 基礎知識回顧 182
18.3.1 光照積分 182
18.3.2 重要性採樣 183
18.3.3 對光源的光線追蹤 185
18.4 算法 186
18.4.1 光源的預處理 186
18.4.2 加速結構 187
18.4.3 光源重要性採樣 188
18.5 結果 190
18.5.1 性能 192
18.5.2 圖像質量 194
18.6 結論 196
參考文獻 197
第五部分 降噪與濾波
第19章 利用實時光線追蹤和降噪技術在UE4中進行電影渲染 203
19.1 引言 203
19.2 在UE4中集成光線追蹤功能 203
19.2.1 階段1:實驗性的整合 204
19.2.2 階段2 210
19.3 實時光線追蹤和降噪處理 211
19.3.1 基於光線追蹤的陰影 211
19.3.2 基於光線追蹤的反射 214
19.3.3 基於光線追蹤的全域漫反射照明 218
19.3.4 光線追蹤中的透明度 221
19.4 結論 222
參考文獻 223
第20章 實時光線追蹤的紋理LOD策略 224
20.1 簡介 224
20.2 背景 225
20.3 紋理LOD算法 226
20.3.1 MIP第0層的雙線性濾波 226
20.3.2 射線微分 226
20.3.3 射線微分與G-Buffer 229
20.3.4 射線錐 230
20.4 實現 234
20.5 對照及結果 236
20.6 代碼 239
參考文獻 241
第21章 使用射線錐和射線差分進行環境貼圖的過濾 242
21.1 引言 242
21.2 射線錐 243
21.3 射線差分 243
21.4 結果 244
參考文獻 244
第22章 通過自我調整光線追蹤改進時域抗鋸齒 245
22.1 簡介 245
22.2 時域抗鋸齒相關工作 247
22.3 一種新算法 247
22.3.1 分割策略 248
22.3.2 稀疏光線追蹤超採樣 251
22.4 初步結果 253
22.4.1 畫面質量 253
22.4.2 性能 254
22.5 局限性 255
22.6 實時光線追蹤抗鋸齒技術的未來 256
22.7 結論 256
參考文獻 257
第六部分 混合方法及系統
第23章 寒霜引擎中的互動式光照貼圖和輻照度體預覽 261
23.1 介紹 261
23.2 全域光照解算器管線 262
23.2.1 輸入與輸出 262
23.2.2 全域光照解算器管線的總覽 265
23.2.3 光照計算與光路構建 266
23.2.4 光源 269
23.2.5 特殊材質 270
23.2.6 規劃待計算紋素 271
23.2.7 性能開銷 272
23.2.8 後處理 272
23.3 加速技術 275
23.3.1 視圖優先順序 275
23.3.2 燈光加速結構 275
23.3.3 輻照度緩存 2...
第一部分 光線追蹤基礎
第1章 光線追蹤術語 3
1.1 歷史回顧 3
1.2 定義 4
參考文獻 7
第2章 什麼是光線? 9
2.1 光線的數學表示 9
2.2 光線區間 10
2.3 DXR中的光線 11
2.4 小結 12
參考文獻 12
第3章 DirectX光線追蹤介紹 13
3.1 介紹 13
3.2 概述 13
3.3 準備就緒 14
3.4 DirectX光線追蹤管線 14
3.5 HLSL針對DXR的新增支持 16
3.5.1 在HLSL中生成新的光線 17
3.5.2 在HLSL中控制光線遍歷 17
3.5.3 額外的HLSL內建函式 18
3.6 一個簡單的HLSL光線追蹤案例 19
3.7 主機端初始化DXR 20
3.8 基礎的DXR初始化和設置 21
3.8.1 幾何體和加速結構 22
3.8.2 根簽名 25
3.8.3 編譯著色器 26
3.9 光線追蹤管線狀態物件(RTPSO) 27
3.10 著色器表 30
3.11 發射光線 32
3.12 挖掘更深和更多的資源 33
3.13 小結 33
參考文獻 34
第4章 天文館球幕相機 36
4.1 介紹 36
4.2 方法 36
4.2.1 從視口座標計算光線方向 38
4.2.2 環形立體投影 40
4.2.3 景深 42
4.2.4 抗鋸齒 43
4.3 天文館球幕投影的示例代碼 43
參考文獻 43
第5章 計算子陣列的*小值和*大值 45
5.1 動機 45
5.2 整表查詢法 45
5.3 稀疏表查詢法 46
5.4 區間樹遞迴查詢法 47
5.5 區間樹反覆運算查詢法 48
5.6 結果 50
5.7 小結 51
參考文獻 51
第二部分 相交和效率
第6章 避免自相交的快速可靠的方法 55
6.1 引言 55
6.2 方法 55
6.2.1 計算物體表面上的交點 55
6.2.2 避免自相交 57
6.3 小結 60
參考文獻 61
第7章 光線/球體相交檢測的精度提升 62
7.1 光線/球體相交基礎 62
7.2 浮點精度探究 63
7.3 相關資源 66
參考文獻 67
第8章 精巧的曲面:計算光線/雙線性曲面相交的幾何方法 68
8.1 引言與當前技術 68
8.1.1 性能測試 70
8.1.2 網格四邊形化 70
8.2 GARP細節 71
8.3 結果討論 73
8.4 代碼 76
參考文獻 77
第9章 DXR中的多重命中光線追蹤 80
9.1 引言 80
9.2 實現 81
9.2.1 樸素的多重命中遍歷 83
9.2.2 節點剔除多重命中BVH遍歷 85
9.3 結果 86
9.3.1 性能測量 86
9.3.2 討論 89
9.4 結論 90
參考文獻 91
第10章 一種具有高擴展效率的簡單負載均衡方案 92
10.1 引言 92
10.2 要求 92
10.3 負載均衡 93
10.3.1 簡單分塊 93
10.3.2 任務大小 93
10.3.3 任務分佈 94
10.3.4 圖像組裝 95
10.4 結果 96
參考文獻 97
第三部分 反射,折射與陰影
第11章 嵌套volume中材質的自動處理 101
11.1 volume的建模 101
11.1.1 獨立邊界 101
11.1.2 添加空氣間隙 102
11.1.3 重疊的邊界 102
11.2 算法 103
11.3 局限性 106
參考文獻 107
第12章 基於微表面陰影函數解決凹凸貼圖中的陰影邊界問題 108
12.1 介紹 108
12.2 之前的工作 109
12.3 方法 109
12.3.1 法線分佈函數 110
12.3.2 陰影函數 112
12.4 結果 113
參考文獻 114
第13章 光線追蹤陰影:保持實時畫面播放速率 115
13.1 介紹 115
13.2 相關工作 116
13.3 光線追蹤陰影 117
13.4 自我調整採樣 119
13.4.1 時間重投影 119
13.4.2 識別半影區域 120
13.4.3 計算採樣數目 121
13.4.4 採樣Mask 121
13.4.5 計算可見性 122
13.5 實現 123
13.5.1 採樣點集生成 124
13.5.2 按距離剔除燈光 124
13.5.3 限制總採樣數 124
13.5.4 在前向渲染管線中集成 125
13.6 結果 127
13.6.1 與陰影映射(方法)的對比 127
13.6.2 軟陰影與硬陰影對比 128
13.6.3 限制 129
13.7 總結和未來的工作 129
參考文獻 130
第14章 DXR下的在單散射介質中引導光線的體積水焦散 132
14.1 介紹 132
14.2 體積光和折射光 134
14.3 算法 136
14.3.1 計算光束壓縮比 136
14.3.2 渲染焦散圖 137
14.3.3 光線追蹤折射焦散圖和累積表面焦散 138
14.3.4 自我調整地對水表面的三角形進行曲面細分 139
14.3.5 構建三角形光束體積 140
14.3.6 使用加算混合方式渲染體積焦散 140
14.3.7 結合表面焦散和體積焦散 141
14.4 實現細節 141
14.5 結果 141
14.6 將來的工作 143
14.7 演示 143
參考文獻 143
第四部分 採樣
第15章 重要性採樣 147
15.1 引言 147
15.2 例子:環境光遮蔽 148
15.3 理解方差 151
15.4 直接光照 153
15.5 結論 155
參考文獻 156
第16章 採樣變換集合 157
16.1 採樣機制 157
16.2 樣本分佈介紹 157
16.3 一維分佈 159
16.3.1 線性函數 159
16.3.2 三角形函數 159
16.3.3 正態分佈 159
16.3.4 一維離散分佈採樣 160
16.4 二維分佈採樣 162
16.4.1 雙線性 162
16.4.2 二維紋理分佈 162
16.5 均勻表面採樣 165
16.5.1 圓盤 165
16.5.2 三角形 166
16.5.3 三角形網格 167
16.5.4 球 167
16.6 方向採樣 168
16.6.1 Z軸向余弦加權半球 169
16.6.2 向量軸向余弦加權半球 169
16.6.3 錐體方向採樣 169
16.6.4 PHONG分佈採樣 170
16.6.5 GGX分佈 170
16.7 體積散射 171
16.7.1 體積中的距離 171
16.7.2 Henyey-Greenstein相函數 172
16.8 添加到集合中 172
參考文獻 173
第17章 忽略光線追蹤時的不便 174
17.1 引言 174
17.2 動機 174
17.3 截斷法 176
17.4 路徑正則化 176
17.5 總結 177
參考文獻 178
第18章 GPU實現的多光源重要性採樣 179
18.1 概述 179
18.2 傳統算法回顧 180
18.2.1 實時光源剔除 180
18.2.2 多光源的算法 181
18.2.3 光源重要性採樣 181
18.3 基礎知識回顧 182
18.3.1 光照積分 182
18.3.2 重要性採樣 183
18.3.3 對光源的光線追蹤 185
18.4 算法 186
18.4.1 光源的預處理 186
18.4.2 加速結構 187
18.4.3 光源重要性採樣 188
18.5 結果 190
18.5.1 性能 192
18.5.2 圖像質量 194
18.6 結論 196
參考文獻 197
第五部分 降噪與濾波
第19章 利用實時光線追蹤和降噪技術在UE4中進行電影渲染 203
19.1 引言 203
19.2 在UE4中集成光線追蹤功能 203
19.2.1 階段1:實驗性的整合 204
19.2.2 階段2 210
19.3 實時光線追蹤和降噪處理 211
19.3.1 基於光線追蹤的陰影 211
19.3.2 基於光線追蹤的反射 214
19.3.3 基於光線追蹤的全域漫反射照明 218
19.3.4 光線追蹤中的透明度 221
19.4 結論 222
參考文獻 223
第20章 實時光線追蹤的紋理LOD策略 224
20.1 簡介 224
20.2 背景 225
20.3 紋理LOD算法 226
20.3.1 MIP第0層的雙線性濾波 226
20.3.2 射線微分 226
20.3.3 射線微分與G-Buffer 229
20.3.4 射線錐 230
20.4 實現 234
20.5 對照及結果 236
20.6 代碼 239
參考文獻 241
第21章 使用射線錐和射線差分進行環境貼圖的過濾 242
21.1 引言 242
21.2 射線錐 243
21.3 射線差分 243
21.4 結果 244
參考文獻 244
第22章 通過自我調整光線追蹤改進時域抗鋸齒 245
22.1 簡介 245
22.2 時域抗鋸齒相關工作 247
22.3 一種新算法 247
22.3.1 分割策略 248
22.3.2 稀疏光線追蹤超採樣 251
22.4 初步結果 253
22.4.1 畫面質量 253
22.4.2 性能 254
22.5 局限性 255
22.6 實時光線追蹤抗鋸齒技術的未來 256
22.7 結論 256
參考文獻 257
第六部分 混合方法及系統
第23章 寒霜引擎中的互動式光照貼圖和輻照度體預覽 261
23.1 介紹 261
23.2 全域光照解算器管線 262
23.2.1 輸入與輸出 262
23.2.2 全域光照解算器管線的總覽 265
23.2.3 光照計算與光路構建 266
23.2.4 光源 269
23.2.5 特殊材質 270
23.2.6 規劃待計算紋素 271
23.2.7 性能開銷 272
23.2.8 後處理 272
23.3 加速技術 275
23.3.1 視圖優先順序 275
23.3.2 燈光加速結構 275
23.3.3 輻照度緩存 2...
書摘/試閱
第一部分 光線追蹤基礎
今天,光柵化佔領了實時渲染的大多數應用領域,因此許多尋找實時渲染技巧的讀者上次遇到光線追蹤可能還是在學生時代(可能幾十年前)。本部分包含了介紹性的章節來幫助大家複習基礎知識,在術語方面達成共識,並提供一些簡單卻很有用的代碼模組。
第1章,“光線追蹤術語”定義了本書中要用到的術語並且給出了引入這些術語的論文。對於第一次接觸的讀者來說,當你閱讀文獻時,會遇到令人費解、不斷變化的術語,它們時而含義重複,時而模棱兩可。在不理解這些術語如何演化到今天的情況下,直接去讀30年前的論文會令人沮喪。該章節提供了一個基礎的路線圖。
第2章,“什麼是光線?”覆蓋了一些常見的關於光線的數學定義:如何思考光線,哪些公式通常會用於現代API中。雖然這是一個簡單的章節,但是分離出這個基本結構的基礎部分會有助於提醒讀者數值精度問題比比皆是。對於光柵化,精度問題出現在深度緩存閃爍(z-fighting)和陰影貼圖(Shadow Mapping)中;在光線追蹤中,每光線查詢都要小心處理以避免假性相交判斷(精度問題在第6章中有更深入的探討)。
*近,微軟公司對外發佈了DirectX光線追蹤技術,它是DirectX光柵化API的擴展。第3章,“DirectX光線追蹤介紹”,簡單介紹了該程序設計接口引入的抽象、心智模型和新的著色器類型。除此之外,還解釋了如何初始化,並提供示例代碼以幫助你入門。
光線追蹤降低了構建任意相機模型的難度,而不像傳統的光柵化那樣必須定義4×4的投影矩陣來定義相機。第4章,“天文館球幕相機”給出了構建一個180°半球形球幕投影(比如天文館)的相機模型的數學形式和示例代碼。這個章節同樣展示了在光線追蹤中添加立體渲染或者景深功能是多麼容易。
第5章,“計算子陣列的*小值和*大值”描述了三種不同的計算方法(並權衡了計算時的各種因素),用於計算陣列中任意子陣列的*小值和*大值。表面上看,評估這樣的查詢和光線追蹤沒有明顯的關係,但是它可以應用到科學計算可視化這樣的領域,在這些領域經常用到光線查詢。
第一部分的知識可以幫你理解現代光線追蹤的基礎知識和進行高效渲染所需的思維模式。
Chris Wyman
第1章 光線追蹤術語
Eric Haines, Peter Shirley NVIDIA
本章節介紹了貫穿全書的背景知識和術語定義。
1.1 歷史回顧
光線追蹤在環境中追蹤光的運動這一學科方向中具有悠久的歷史,常常稱為輻射傳輸(radiative transfer)。圖形學從業者從中子遷移(neutron transport)[2]、熱傳導(heat transfer)[6]和照明工程(illumination engineering)[11]等領域引入了這些概念。因為有特別多的領域在研究這些概念,加上在學科之間或者學科內部術語經過不斷發展,有時這些概念之間會出現分歧。經典的論文裡也可能會錯誤地使用術語,給讀者帶來困擾。
光沿光線傳播的基本度量是SI國際單位制(International System of Units)中的光譜輻射率(spectral radiance),其在真空中沿光線傳播時保持不變,它*直觀的感受就是亮度(brightness)。在得到標準化之前,光譜輻射經常被稱為“強度”(intensity)或者“亮度”。計算機圖形學丟棄了“光譜”這個首碼,因為我們從不使用非光譜的輻射(在所有波長上的輻射集合)。
圖形學領域中涉及光線的術語在一直發展。幾乎所有的現代光線追蹤器都使用遞迴和蒙特卡羅法,因此現在很少有人會刻意稱自己的渲染器為“遞迴式蒙特卡羅”光線追蹤器。在1968年,蘋果公司[1]使用光線來渲染圖片。1979年,Whitted[16]和Kay,Greenberg[9]開發了一種遞迴光線追蹤方法來描述精確的折射和反射。1982年,Roth[13]使用沿著光線的內向/外向區間清單以及局部產生實體來進行CSG模型的渲染和體積估計。
1984年,Cook等人[4]提出了分散式光線追蹤。在其他地方,為了避免和分散式處理混淆,此方法通常被稱為隨機(stochastic)光線追蹤。幾乎每一個現代光線追蹤器都會使用隨機採樣的方法來實現景深(depth of field)、模糊反射(fuzzy reflection)和軟陰影(soft shadow)等效果。1984年之後不久,研究人員使用傳統的輻射傳輸方法重新描述了繪製過程。1986年,人們提出了兩個重要的算法。Kajiya[8]將積分傳輸方程稱為渲染方程(rendering euqation)。他嘗試了多種解決方案,其中包括他稱為路徑追蹤(path tracing)的蒙特卡羅方法。Immel、Cohen和Greenberg[7]提出了相同的傳輸方程,只是使用了不同的單位,並使用有限單元法(finite element method)來求解這個方程,該方法現在稱為輻射度算法(radiosity)。
自三十多年前使用經典的輻射傳輸理論來重新描述這個圖形學問題後,在如何從數值上進行問題求解方面大家做了大量的工作。一些關鍵的算法也發生了改變,如雙向(bidirectional)路徑追蹤[10, 14]和20世紀90年代引入的基於路徑的(path-based)方法[15]。更多細節,包含如何在項目中實現這些技術,在Pharr、Jakob和Humphreys的書[12]中有討論。
1.2 定義
我們在此強調一些本書中的重要術語,反映了行業中對這些概念的用法。雖然說除了一些標準單位,尚不存在公認的標準術語列表。
光線投射(ray casting)技術返回沿著光線*近的那個物體,有時甚至返回光線穿過的所有的物體。一根光線通過一個圖元離開相機,在場景中行進,直到碰撞到*近的物體。作為著色的一部分,可以在發生碰撞的點向光源投射一個新的光線,以確定這個物體是否在陰影裡,如圖1.1所示。
圖1.1 光線投射。一根光線從相機的位置出發經過圖元網格進入場景中。在每個碰撞點,朝光源投射另一根光線來確定表面被照亮還是在陰影裡(圖片來源Henrik,“光線追蹤(圖形學)”,維琪百科)
光線追蹤(ray tracing)利用光線投射的機制來遞迴地採集反射材質和折射材質對*終光強的貢獻。比如,當光線碰到一個鏡子,從鏡子上的碰撞點沿反射方向投射一根光線。不管這個反射光線(reflection ray)和什麼相交都會影響鏡子*終的著色。類似的,透明物體如玻璃可能會同時產生反射光線和折射光線(refraction ray)。這個過程會不斷遞迴下去,每一根新的光線都可能引發新的反射和折射光光線。遞迴通常都會有截斷限制,比如光線的*大反彈次數。整個光線樹會被反向地沿著光路評估,直至*後計算出顏色。和之前一樣,我們在每個碰撞點向每個光源發射光線來確定該物體是否在陰影裡,如圖1.2所示。
圖1.2 光線追蹤。三束光線從相機射入場景。上方綠色的光線直接擊中盒子。中間紫色的光線先擊中鏡子,經反射擊中盒子的背部。下方藍色光線擊中玻璃球,產生反射和折射光線。折射光線接著產生兩束子光線,其中一根穿過玻璃球
在Whitted算法(即經典光線追蹤)中,假設物體表面絕對閃亮光滑,光源是方向光或者說位於無窮遠處。在Cook算法(即隨機光線追蹤)中,光線樹中每個節點可以發射更多的光線以產生各種效果。比如說,我們想像一個球面光源而非點光源。物體表面的局部被照亮,因此我們需發射非常多的光線到球面光源上不同的位置,來估計有多少光照可到達。我們對面光源的可見程度進行積分,完全落在陰影裡的點位於在全影區(umbra),局部照亮的點落在半影區(penumbra),如圖1.3所示。
圖1.3 球面光源投射出柔和的半影區,全影區則完全在陰影當中
通過向反射方向上的錐形區域射出很多光線並對結果進行混合,我們得到帶光澤的反射而非完全的鏡面反射。如圖1.4所示。這種分散採樣點的理念同樣可用於實現半透明(translucency)、景深(depth of field)、運動模糊(motion blur)等效果。
在真實世界中有很多光源,它們到達人眼的方式多種多樣,包括折射和反射。光澤表面反射光線到很多方向上,不僅僅局限在反射方向上。漫反射或者啞光材質可以將光線分散到更廣泛的範圍。在路徑追蹤方法中,我們顛倒一下光的散射行為,使用出射方向和材質來決定入射方向*終著色的重要性。
追蹤如此複雜的光線傳輸過程對計算資源的要求非常驚人,也容易造成低效的渲染。其實,為了產生一張圖像,我們只需要光線沿著特定的一組方向穿過相機鏡頭。遞迴光線追蹤(recursive ray tracing)及其衍生算法逆轉了光線傳播的物理過程,僅在相機處對*終圖像內容的方向生成光線。
(a)入射光被反射後朝單個方向離開鏡面
(b)在被打磨過的材質上(比如黃銅),在反射方向附近散佈光線並使表面有光澤
(c)在漫反射或啞光的材質上(比如石膏),反射光線被散佈到各個方向
圖1.4 鏡面(mirror)反射、光澤(glossy)反射及漫(diffuse)反射
在Kajiya風格算法(即路徑追蹤)中,場景中的啞光表面會反射光線,它可以模擬現實世界中的所有光路(衍射之類的相位效果除外)。這裡的光路(path)指的是從相機到光源之間一系列的光與物體的相互作用。
每個表面的交點處都需要結合材質的反射屬性來估算它周圍所有方向上的光線的貢獻。例如,一堵紅色的牆旁邊有白色的屋頂,牆會反射紅色的光到屋頂,反之亦然。牆和屋頂會不斷產生更多的相互反射,這些相互反射又會產生更多反射光線,不斷影響彼此的著色。我們從相機的視角遞迴地累計這些效果,只有當光線擊中光源時才結束該光路。通過這種方法,才可能生成出真實的基於物理的圖像。
這裡我們使用了“可能”,如果我們在一個粗糙的表面射出一組光,比方說一千束。然後對於每一束光,我們遞迴地發射出另外上千束,那我們僅僅是計算一個圖元點就可以到天荒地老了。相反,當一束光線從人眼發射出去並碰到一個可見的表面上,在碰撞點光線追蹤器在有用的方向上只產生一束光。這束光依次產生一束光並持續下去,這些光線並*終形成一個路徑。對於一個圖元,將多個路徑的結果進行混合就可以估計出真正的圖元輻射值。隨著追蹤的路徑數量變多,*後的效果也會提升。通過適當的處理,路徑追蹤可以給出無偏(unbiased)的、符合物理現實的結果。
大多數現代的光線追蹤器對每個圖元使用多束光線作為蒙特卡羅(Monte Carlo,MC)算法的底層部分。Cook風格和Kajiya風格的算法就是例子。這些算法都在某些空間對各種概率密度函數(probability density function,PDF)有著特定的理解。比如,在Cook風格算法中,我們可能會在一個透鏡空間包含一個PDF。在Kajiya風格算法中,PDF將會在我們稱為路徑空間(path space)的路徑上出現。
蒙特卡羅算法使用不均勻分佈的PDF採樣來減少誤差,這種採樣稱為重要性採樣(importance sampling)。使用數論方法中的樣本低差異模式而不是傳統的偽亂數產生器來創建隨機樣本被稱為準蒙特卡羅(Quasi-Monte Carlo,QMC)採樣。大部分場合,計算機圖形學從業者使用MC和QMC領域的標準術語。然而,這樣的做法有時會造成同義詞混淆。比如,計算機圖形學中的“使用陰影光線的直接光照”是MC/QMC中“下一事件估計”的一個例子。
從形式化的角度看,渲染器求解的是傳播方程(transport equation),在圖形學領域
今天,光柵化佔領了實時渲染的大多數應用領域,因此許多尋找實時渲染技巧的讀者上次遇到光線追蹤可能還是在學生時代(可能幾十年前)。本部分包含了介紹性的章節來幫助大家複習基礎知識,在術語方面達成共識,並提供一些簡單卻很有用的代碼模組。
第1章,“光線追蹤術語”定義了本書中要用到的術語並且給出了引入這些術語的論文。對於第一次接觸的讀者來說,當你閱讀文獻時,會遇到令人費解、不斷變化的術語,它們時而含義重複,時而模棱兩可。在不理解這些術語如何演化到今天的情況下,直接去讀30年前的論文會令人沮喪。該章節提供了一個基礎的路線圖。
第2章,“什麼是光線?”覆蓋了一些常見的關於光線的數學定義:如何思考光線,哪些公式通常會用於現代API中。雖然這是一個簡單的章節,但是分離出這個基本結構的基礎部分會有助於提醒讀者數值精度問題比比皆是。對於光柵化,精度問題出現在深度緩存閃爍(z-fighting)和陰影貼圖(Shadow Mapping)中;在光線追蹤中,每光線查詢都要小心處理以避免假性相交判斷(精度問題在第6章中有更深入的探討)。
*近,微軟公司對外發佈了DirectX光線追蹤技術,它是DirectX光柵化API的擴展。第3章,“DirectX光線追蹤介紹”,簡單介紹了該程序設計接口引入的抽象、心智模型和新的著色器類型。除此之外,還解釋了如何初始化,並提供示例代碼以幫助你入門。
光線追蹤降低了構建任意相機模型的難度,而不像傳統的光柵化那樣必須定義4×4的投影矩陣來定義相機。第4章,“天文館球幕相機”給出了構建一個180°半球形球幕投影(比如天文館)的相機模型的數學形式和示例代碼。這個章節同樣展示了在光線追蹤中添加立體渲染或者景深功能是多麼容易。
第5章,“計算子陣列的*小值和*大值”描述了三種不同的計算方法(並權衡了計算時的各種因素),用於計算陣列中任意子陣列的*小值和*大值。表面上看,評估這樣的查詢和光線追蹤沒有明顯的關係,但是它可以應用到科學計算可視化這樣的領域,在這些領域經常用到光線查詢。
第一部分的知識可以幫你理解現代光線追蹤的基礎知識和進行高效渲染所需的思維模式。
Chris Wyman
第1章 光線追蹤術語
Eric Haines, Peter Shirley NVIDIA
本章節介紹了貫穿全書的背景知識和術語定義。
1.1 歷史回顧
光線追蹤在環境中追蹤光的運動這一學科方向中具有悠久的歷史,常常稱為輻射傳輸(radiative transfer)。圖形學從業者從中子遷移(neutron transport)[2]、熱傳導(heat transfer)[6]和照明工程(illumination engineering)[11]等領域引入了這些概念。因為有特別多的領域在研究這些概念,加上在學科之間或者學科內部術語經過不斷發展,有時這些概念之間會出現分歧。經典的論文裡也可能會錯誤地使用術語,給讀者帶來困擾。
光沿光線傳播的基本度量是SI國際單位制(International System of Units)中的光譜輻射率(spectral radiance),其在真空中沿光線傳播時保持不變,它*直觀的感受就是亮度(brightness)。在得到標準化之前,光譜輻射經常被稱為“強度”(intensity)或者“亮度”。計算機圖形學丟棄了“光譜”這個首碼,因為我們從不使用非光譜的輻射(在所有波長上的輻射集合)。
圖形學領域中涉及光線的術語在一直發展。幾乎所有的現代光線追蹤器都使用遞迴和蒙特卡羅法,因此現在很少有人會刻意稱自己的渲染器為“遞迴式蒙特卡羅”光線追蹤器。在1968年,蘋果公司[1]使用光線來渲染圖片。1979年,Whitted[16]和Kay,Greenberg[9]開發了一種遞迴光線追蹤方法來描述精確的折射和反射。1982年,Roth[13]使用沿著光線的內向/外向區間清單以及局部產生實體來進行CSG模型的渲染和體積估計。
1984年,Cook等人[4]提出了分散式光線追蹤。在其他地方,為了避免和分散式處理混淆,此方法通常被稱為隨機(stochastic)光線追蹤。幾乎每一個現代光線追蹤器都會使用隨機採樣的方法來實現景深(depth of field)、模糊反射(fuzzy reflection)和軟陰影(soft shadow)等效果。1984年之後不久,研究人員使用傳統的輻射傳輸方法重新描述了繪製過程。1986年,人們提出了兩個重要的算法。Kajiya[8]將積分傳輸方程稱為渲染方程(rendering euqation)。他嘗試了多種解決方案,其中包括他稱為路徑追蹤(path tracing)的蒙特卡羅方法。Immel、Cohen和Greenberg[7]提出了相同的傳輸方程,只是使用了不同的單位,並使用有限單元法(finite element method)來求解這個方程,該方法現在稱為輻射度算法(radiosity)。
自三十多年前使用經典的輻射傳輸理論來重新描述這個圖形學問題後,在如何從數值上進行問題求解方面大家做了大量的工作。一些關鍵的算法也發生了改變,如雙向(bidirectional)路徑追蹤[10, 14]和20世紀90年代引入的基於路徑的(path-based)方法[15]。更多細節,包含如何在項目中實現這些技術,在Pharr、Jakob和Humphreys的書[12]中有討論。
1.2 定義
我們在此強調一些本書中的重要術語,反映了行業中對這些概念的用法。雖然說除了一些標準單位,尚不存在公認的標準術語列表。
光線投射(ray casting)技術返回沿著光線*近的那個物體,有時甚至返回光線穿過的所有的物體。一根光線通過一個圖元離開相機,在場景中行進,直到碰撞到*近的物體。作為著色的一部分,可以在發生碰撞的點向光源投射一個新的光線,以確定這個物體是否在陰影裡,如圖1.1所示。
圖1.1 光線投射。一根光線從相機的位置出發經過圖元網格進入場景中。在每個碰撞點,朝光源投射另一根光線來確定表面被照亮還是在陰影裡(圖片來源Henrik,“光線追蹤(圖形學)”,維琪百科)
光線追蹤(ray tracing)利用光線投射的機制來遞迴地採集反射材質和折射材質對*終光強的貢獻。比如,當光線碰到一個鏡子,從鏡子上的碰撞點沿反射方向投射一根光線。不管這個反射光線(reflection ray)和什麼相交都會影響鏡子*終的著色。類似的,透明物體如玻璃可能會同時產生反射光線和折射光線(refraction ray)。這個過程會不斷遞迴下去,每一根新的光線都可能引發新的反射和折射光光線。遞迴通常都會有截斷限制,比如光線的*大反彈次數。整個光線樹會被反向地沿著光路評估,直至*後計算出顏色。和之前一樣,我們在每個碰撞點向每個光源發射光線來確定該物體是否在陰影裡,如圖1.2所示。
圖1.2 光線追蹤。三束光線從相機射入場景。上方綠色的光線直接擊中盒子。中間紫色的光線先擊中鏡子,經反射擊中盒子的背部。下方藍色光線擊中玻璃球,產生反射和折射光線。折射光線接著產生兩束子光線,其中一根穿過玻璃球
在Whitted算法(即經典光線追蹤)中,假設物體表面絕對閃亮光滑,光源是方向光或者說位於無窮遠處。在Cook算法(即隨機光線追蹤)中,光線樹中每個節點可以發射更多的光線以產生各種效果。比如說,我們想像一個球面光源而非點光源。物體表面的局部被照亮,因此我們需發射非常多的光線到球面光源上不同的位置,來估計有多少光照可到達。我們對面光源的可見程度進行積分,完全落在陰影裡的點位於在全影區(umbra),局部照亮的點落在半影區(penumbra),如圖1.3所示。
圖1.3 球面光源投射出柔和的半影區,全影區則完全在陰影當中
通過向反射方向上的錐形區域射出很多光線並對結果進行混合,我們得到帶光澤的反射而非完全的鏡面反射。如圖1.4所示。這種分散採樣點的理念同樣可用於實現半透明(translucency)、景深(depth of field)、運動模糊(motion blur)等效果。
在真實世界中有很多光源,它們到達人眼的方式多種多樣,包括折射和反射。光澤表面反射光線到很多方向上,不僅僅局限在反射方向上。漫反射或者啞光材質可以將光線分散到更廣泛的範圍。在路徑追蹤方法中,我們顛倒一下光的散射行為,使用出射方向和材質來決定入射方向*終著色的重要性。
追蹤如此複雜的光線傳輸過程對計算資源的要求非常驚人,也容易造成低效的渲染。其實,為了產生一張圖像,我們只需要光線沿著特定的一組方向穿過相機鏡頭。遞迴光線追蹤(recursive ray tracing)及其衍生算法逆轉了光線傳播的物理過程,僅在相機處對*終圖像內容的方向生成光線。
(a)入射光被反射後朝單個方向離開鏡面
(b)在被打磨過的材質上(比如黃銅),在反射方向附近散佈光線並使表面有光澤
(c)在漫反射或啞光的材質上(比如石膏),反射光線被散佈到各個方向
圖1.4 鏡面(mirror)反射、光澤(glossy)反射及漫(diffuse)反射
在Kajiya風格算法(即路徑追蹤)中,場景中的啞光表面會反射光線,它可以模擬現實世界中的所有光路(衍射之類的相位效果除外)。這裡的光路(path)指的是從相機到光源之間一系列的光與物體的相互作用。
每個表面的交點處都需要結合材質的反射屬性來估算它周圍所有方向上的光線的貢獻。例如,一堵紅色的牆旁邊有白色的屋頂,牆會反射紅色的光到屋頂,反之亦然。牆和屋頂會不斷產生更多的相互反射,這些相互反射又會產生更多反射光線,不斷影響彼此的著色。我們從相機的視角遞迴地累計這些效果,只有當光線擊中光源時才結束該光路。通過這種方法,才可能生成出真實的基於物理的圖像。
這裡我們使用了“可能”,如果我們在一個粗糙的表面射出一組光,比方說一千束。然後對於每一束光,我們遞迴地發射出另外上千束,那我們僅僅是計算一個圖元點就可以到天荒地老了。相反,當一束光線從人眼發射出去並碰到一個可見的表面上,在碰撞點光線追蹤器在有用的方向上只產生一束光。這束光依次產生一束光並持續下去,這些光線並*終形成一個路徑。對於一個圖元,將多個路徑的結果進行混合就可以估計出真正的圖元輻射值。隨著追蹤的路徑數量變多,*後的效果也會提升。通過適當的處理,路徑追蹤可以給出無偏(unbiased)的、符合物理現實的結果。
大多數現代的光線追蹤器對每個圖元使用多束光線作為蒙特卡羅(Monte Carlo,MC)算法的底層部分。Cook風格和Kajiya風格的算法就是例子。這些算法都在某些空間對各種概率密度函數(probability density function,PDF)有著特定的理解。比如,在Cook風格算法中,我們可能會在一個透鏡空間包含一個PDF。在Kajiya風格算法中,PDF將會在我們稱為路徑空間(path space)的路徑上出現。
蒙特卡羅算法使用不均勻分佈的PDF採樣來減少誤差,這種採樣稱為重要性採樣(importance sampling)。使用數論方法中的樣本低差異模式而不是傳統的偽亂數產生器來創建隨機樣本被稱為準蒙特卡羅(Quasi-Monte Carlo,QMC)採樣。大部分場合,計算機圖形學從業者使用MC和QMC領域的標準術語。然而,這樣的做法有時會造成同義詞混淆。比如,計算機圖形學中的“使用陰影光線的直接光照”是MC/QMC中“下一事件估計”的一個例子。
從形式化的角度看,渲染器求解的是傳播方程(transport equation),在圖形學領域
主題書展
更多
主題書展
更多書展購物須知
大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。
特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。
無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。
為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。
若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。

