天天看點

Lightmass分析(一) 光子映射(Photon Mapping)簡介Intro算法核心光子追蹤pass與光線追蹤的差別光子存儲Radiance 計算參考文獻

Intro

Lightmass分析 系列文章前言及目錄

閱讀之前最好對光線追蹤, 光照方程, 輻照度量學等有一定的了解, 且本文隻對光子映射做粗淺的介紹.

光子映射 Photon Mapping 和光線追蹤一樣是真實感渲染領域的一種渲染方法. 他能夠很好的解決光線追蹤類方法相對難以處理的 Caustics 等現象. 并且一般情況下能以一定的記憶體空間為代價, 獲得更高的效率.

Lightmass分析(一) 光子映射(Photon Mapping)簡介Intro算法核心光子追蹤pass與光線追蹤的差別光子存儲Radiance 計算參考文獻

另外與使用 Monte Carlo 的各種光線追蹤方法相比, 當算法出現 Artifact(瑕疵) 的時候, 光線追蹤方法一般呈現高頻信号, 很容易被人眼察覺. 光子映射産生的 Artifact 則多為低頻信号, 相對不容易被人眼發現.(在圖像上的高頻信号意味着小範圍内顔色上劇烈的變化)

Lightmass分析(一) 光子映射(Photon Mapping)簡介Intro算法核心光子追蹤pass與光線追蹤的差別光子存儲Radiance 計算參考文獻

算法核心

光子映射是一個 Two-pass 的方法, 第一個 pass 為光子追蹤, 第二個 pass 進行渲染

  • 光子追蹤(Photon Tracing Pass): 從光源像場景發射攜帶能量的光子, 光子在場景中與物體表面進行互動(反射或折射), 并在非光澤表面物體相交時記錄, 最後将這些光子存儲在一個全局的光子圖(Photon Map)中.
  • 渲染(Rendering Pass): 使用傳統的路徑追蹤技術從錄影機通過螢幕向場景中發射光線并在場景中傳輸, 當光線與物體表面相交時, 該頂點光照計算中的漫反射部分則使用統計的方法從前面産生的光子圖中計算得出.
    Lightmass分析(一) 光子映射(Photon Mapping)簡介Intro算法核心光子追蹤pass與光線追蹤的差別光子存儲Radiance 計算參考文獻

光子追蹤pass與光線追蹤的差別

與光線追蹤不同的是光子映射的光子在與物體表面互動時, 要麼被反射, 要麼被折射, 要麼吸收. 這是根據物體表面的材質參數按機率的方式(如俄羅斯輪盤, Russian Roulette)确定的. 而光線追蹤方法在必要時, 一束光線可以根據表面材質, 一部分被反射, 一部分被折射, 進而分成多束光線.

光子存儲

我們在光子中會存儲: 光子的位置, Flux(功率), 入射方向和一個在 KD-Tree 中使用标志位.

struct Photon {
    float x, y, z; // 位置
    char p[4]; // RGBE編碼的flux
    char phi, theta; // 入射方向
    short flag;
};
           

使用 FLux 的原因與我們需要使用統計學中的密度估計有關(密度估計也是在照片級真實感渲染領域的渲染方程中經常出現機率密度函數PDF的原因). 密度估計所涉及的資料一定是具有任意可加性的, 那麼像 radiance 這種與方向有關的實體量則不适合使用. Flux 是機關時間内發出的能量, 與方向面積等都無關, 适合存儲在光子中.

光子最終會被存儲到 PhotonMap 中, 我們一般将 PhotonMap 處理為一顆平衡 KD-Tree. 因為算法後半在計算某點的 radiance 時會涉及很多空間查找操作, 用 KD-Tree 來存儲光子可以加速光子查找.

Radiance 計算

根據 BRDF 理論, 某點 x 處沿着 w 方向的 radiance 是沿着角度 w’ 方向到達 x 點的 radiance 與 BRDF 系數 f 的乘積在該點半球空間上的積分(公式中的點乘項與立體角, Lambert’s Cosine Law等有關).

為了計算這個積分, 我們需要知道 p 點處入射的 radiance ( 公式中的 Li ). 光子圖會為我們提供目前位置附近一定數量光子的 flux, 根據 Radiometry (輻照度量學) 可以進行 radiance 和 flux 之間的轉換.

Lightmass分析(一) 光子映射(Photon Mapping)簡介Intro算法核心光子追蹤pass與光線追蹤的差別光子存儲Radiance 計算參考文獻

積分本質上可以了解為求和, 具體的公式推導我們不做分析, 我們隻需要了解: 光子映射通常使用 kNN 最近鄰估計, 通過選擇 p 點一定範圍内的 n 個光子來計算目标位置的 radiance.

Lightmass分析(一) 光子映射(Photon Mapping)簡介Intro算法核心光子追蹤pass與光線追蹤的差別光子存儲Radiance 計算參考文獻

參考文獻

Jiff:Lightmass分析之 經典Photon Mapping算法介紹

Jiff:LightMass源碼分析之光子追蹤實作

Jiff:LightMass源碼分析之光照評估

《Physically Based Rendering : From Theory to Implementation》Matt Pharr

《全局光照技術 從離線到實時渲染》秦春林

《A Practical Guide to Global Illumination using Photon Maps》Henrik Wann Jensen

繼續閱讀