01 / 導讀
導讀
引用
Pharr, M., Jakob, W., & Humphreys, G. (2023). Physically Based Rendering: From Theory to Implementation (4th ed.). The MIT Press. Free official edition: https://pbr-book.org/4ed/contents
章節概要
第1章:引言
開篇一章說明本書的方法:通過文學程式設計來介紹完整的基於物理的渲染器 pbrt,即把文字說明與 C++ 原始碼以命名片段的形式交織在一起。本章回顧光線追蹤的各個要素(相機與膠片、光線與物體求交、光的分佈、可見性、表面散射、間接光傳輸和光線傳播),概述 pbrt 的執行階段、main() 函式和積分器介面,並實現第一個簡單的隨機遊走積分器。本章還說明如何閱讀本書、程式碼約定(包括動態分派、記憶體分配器和並行),練習的三個難度等級,以及基於物理的渲染的簡史。
第2章:蒙特卡羅積分
在本版中,這一章被提前到前面。它把蒙特卡羅積分作為處理渲染中高維、不連續積分的工具來介紹,內容包括基本估計量、提高效率的方法(分層取樣、重要性取樣、多重重要性取樣、俄羅斯輪盤賭和分裂)、用逆變換法取樣以及在分佈之間進行變換。
第3章:幾何與變換
本章構建 pbrt 的幾何基礎:座標系、n 元組基類、向量、點、法線、光線、包圍盒、球面幾何(立體角與方向表示)、變換、把變換應用於各類物件,以及描述光線與表面相交的互動記錄。
第4章:輻射度量學、光譜與顏色
本章介紹渲染的物理基礎:輻射度量(輻射通量、輻射強度、輻照度和輻亮度)、輻射度積分的處理、表面反射與 BRDF、光的發射、pbrt 全光譜渲染所用的光譜分佈表示,以及顏色及其與人類感知的關係。
第5章:相機與膠片
本章超越針孔模型,定義相機介面、投影相機模型(正交與透視,以及景深)、球面相機,以及把到達感測器的光譜輻亮度轉換為影像值的膠片與成像過程。
第6章:形狀
形狀提供幾何資訊和光線求交。本章介紹形狀介面,實現球體、圓柱、圓盤、三角形網格、新增的雙線性面片和曲線,最後仔細討論如何管理浮點舍入誤差,以保證求交的穩健性。
第7章:圖元與求交加速
在 CPU 路徑上,圖元介面把材質等屬性繫結到形狀上。本章隨後介紹聚合體和層次包圍盒(BVH),包括其構建(含表面積啟發式)與遍歷,以便在複雜場景中高效地進行光線求交。
第8章:取樣與重建
本章從取樣理論和傅立葉分析出發,把取樣與積分聯絡起來,定義取樣器介面,實現獨立取樣器、分層取樣器、Halton 取樣器和 Sobol' 取樣器,最後討論用濾波器進行影像重建。
第9章:反射模型
表面散射由 BSDF 描述。本章定義 BSDF 的表示,然後實現漫反射、鏡面反射與透射、導體 BSDF 和電介質 BSDF、基於微表面理論的粗糙度、粗糙電介質、測量 BSDF,以及毛髮散射模型。
第10章:紋理與材質
紋理描述空間上的變化,材質則把紋理值轉換為 BSDF 引數。本章討論紋理取樣與抗鋸齒、紋理座標生成、基本紋理和影像紋理,以及材質介面及其實現。
第11章:體散射
本章介紹參與介質:吸收、發射和散射過程,透射率(包括零散射表述),相位函式,以及均勻介質和基於網格的非均勻介質的表示。
第12章:光源
本章介紹光源介面以及點光源、平行光、面光源和無限遠面光源,隨後討論光源取樣策略,包括用於含有海量光源場景的多光源取樣。
第13章:光傳輸 I:表面反射
本章推導光傳輸方程,把路徑追蹤作為求解該方程的蒙特卡羅方法加以介紹,先實現一個便於理解和除錯的簡單路徑追蹤器,再實現一個更完整、遠比第1章隨機遊走積分器有效的路徑追蹤器。
第14章:光傳輸 II:體渲染
傳輸方程把光傳輸推廣到參與介質。本章開發體散射積分器,包括對非均勻介質的無偏取樣,並對分層材質中的散射進行建模。
第15章:GPU 上的波前渲染
這是本版新增的一章,解釋如何用波前架構把路徑追蹤映射到 GPU 上,介紹使 pbrt 幾乎所有程式碼都能同時在 CPU 和 GPU 上執行的實現基礎,以及 GPU 路徑追蹤器本身。開頭的例子報告了 GPU 渲染比多核 CPU 快很多倍的結果。
第16章:回顧與展望
最後一章回顧 pbrt 和硬體在各版之間的變化,討論其他設計方案(外存渲染、微多邊形網格、光線包追蹤、互動式與動畫渲染、專用編譯),以及逆向渲染與可微渲染、機器學習等新興主題和渲染系統的未來。
附錄 A–C:取樣演算法;實用工具;場景描述的處理
附錄 A 介紹別名法、蓄水池取樣、拒絕取樣,以及基於逆變換對一維和多維函式的進一步取樣。附錄 B 描述系統實用工具:啟動、數學基礎設施、錯誤報告、記憶體管理和並行。附錄 C 說明場景描述檔案如何被分詞、解析並轉換為物件。
核心概念
第1章:引言
- 文學程式設計:把程式呈現為文字與命名程式碼片段相交織的形式,使正文與實現成為同一份文件。
- 積分器:pbrt 中計算沿相機光線到達的輻亮度的元件,是各種光傳輸演算法所在之處。
第2–4章:基礎
- 蒙特卡羅估計量:用隨機樣本處函式值除以其機率密度後的平均值來近似積分。
- 重要性取樣:從形狀與被積函式相似的分佈中抽樣,以降低方差。
- 輻亮度:沿光線傳遞的輻射度量,按單位面積和單位立體角計量。
- 光譜渲染:用依賴波長的分佈的樣本而非 RGB 三元組來計算光傳輸。
第5–8章:成像與幾何
- 薄透鏡相機:通過在透鏡上取樣點來加入景深的相機模型。
- 層次包圍盒:由包圍盒組成的樹,使光線求交可以跳過場景的大部分割槽域。
- 舍入誤差管理:界定求交計算中的浮點誤差,避免光線錯誤地與表面再次相交。
- 低差異采樣:Halton、Sobol' 等比隨機點更均勻覆蓋定義域的樣本序列。
第9–12章:光與物質
- BSDF:描述表面上從一個方向到達的光如何散射到另一個方向的函式。
- 微表面模型:把粗糙表面表示為朝向服從某種統計分佈的大量微小鏡面。
- 參與介質與相位函式:吸收、發射和散射光的體積,相位函式給出散射的角度分佈。
第13–16章:光傳輸與系統
- 光傳輸方程:把某點的出射輻亮度與發射輻亮度和入射輻亮度聯絡起來的積分方程。
- 路徑追蹤:從相機出發隨機取樣光路來求解該方程,並結合直接光照和多重重要性取樣。
- 波前架構:把 GPU 渲染組織為若干階段,每個階段成批處理大量光線。
評析
優點
- 理論與完整程式碼並重。 前言提出要構建一個完整、具有示範性且基於物理的系統,書中每個演算法都以可執行程式碼的形式出現在完整上下文中。正如前言所說,文字描述中隱藏的細節會在實現中顯露出來,讀者還可以邊讀邊渲染範例場景。
- 始終以物理為依據。 正確的單位、輻射度量和光譜渲染提供了具體的正確性標準:對於簡單場景,基於物理的渲染器應與解析結果一致,不同演算法之間也應當一致。本版已在光照計算中完全去除了 RGB。
- 內容新且覆蓋面廣。 第四版重新編排結構,把蒙特卡羅積分和路徑追蹤提前,並新增 GPU 渲染、多光源取樣、分層材質、毛髮散射、雙線性面片以及最前沿的體渲染方法。
- 分級練習與設計討論。 練習分為三個等級,從一兩個小時到期末專案規模不等;第1章和第16章討論中等規模渲染系統中的設計取捨,這是很少有圖形學書籍涉及的內容。
局限
- 先修要求高。 本書預設讀者修過圖形學入門課程,熟悉多元微積分和機率,並能讀懂大型現代 C++ 程式碼庫;交織的程式碼可能讓初學者讀得很慢。
- 只涉及離線渲染。 本書專注於照片級、基於物理的渲染;即時光柵化、遊戲用的 GPU 圖形 API 以及非照片級渲染技術都不在範圍之內。
- 篇幅大、密度高。 全書 16 章加三個附錄,涵蓋一個完整的渲染器,遠超一門課程所能覆蓋的範圍;標有星號的小節是進階內容,作者建議初讀時跳過。
- 程式碼與 pbrt 的設計繫結。 一些解釋依賴 pbrt 特有的基礎設施(分派機制、記憶體分配器、GPU 路徑),自己構建渲染器的讀者需要自行轉換。
在課程中的定位
在本圖形學書單中,Physically Based Rendering 與 Akenine-Möller 等人的 Real-Time Rendering 同為專門教材。兩者相互補充:Real-Time Rendering 通常被認為側重面向 GPU 的互動式光柵化技術,而 pbrt 專注於離線、物理準確的光線追蹤。學生應先學習以 Marschner 和 Shirley 的 Fundamentals of Computer Graphics 或 Angel 和 Shreiner 的 Interactive Computer Graphics 為教材的課程,以具備前言所假定的圖形學入門背景。
Gambetta 的 Computer Graphics from Scratch 對光線追蹤和光柵化都作了平易的介紹,其後記把基於物理的渲染列為下一步;因此先讀 Gambetta,再讀一本通用圖形學教材,最後讀 pbrt,是一條自然的進階路線。Rogers、Sharp 和 Preece 的 Interaction Design 涵蓋課程中人機互動的一面,與本書沒有重疊。
如何使用本書
前言列出三類讀者:修過圖形學入門課程的研究生和高年級大學部學生、渲染方向的研究者,以及業界開發者。讀者應掌握向量幾何與變換(第3章會複習)、微積分和基礎機率,以及 C++。
本書的設計是大致從前往後閱讀。對於一學期的進階渲染課程,實用的核心內容是第1章、第2章、第4章、第3章和第5–7章的部分內容、第8章(至少採樣理論和一兩種取樣器)、第9章、第12章和第13章;第11章和第14章增加體渲染內容,第15章適合對 GPU 感興趣的學生。按照作者的建議,初讀時跳過帶星號的小節;由於 pbrt 以介面為中心構建,作者也指出,讀者在理解某個元件的介面之後可以跳過它的具體實現。
從 pbrt.org 下載 pbrt 原始碼和場景,邊讀邊渲染,並按難度等級選擇練習:一兩個小時的練習用於鞏固,10–20 小時的練習可作為課程作業,40 小時以上的練習可作為期末專案。書中的渲染影像可在 pbr-book.org 上線上檢視以便比較。
版本與來源
本導讀依據第四版(MIT Press,2023),閱讀的是作者自 2023 年 11 月起免費開放的官方線上版 https://pbr-book.org/4ed/contents。內容取材於前言全文(讀者物件、目標和各版之間的變化)、完整目錄、第1.2–1.5節(包括如何閱讀本書和練習等級)、全部 16 章和三個附錄的導言、第16章的小節標題,以及除第16章外每一章的練習頁面。
