Lightmass分析(四) 光子追蹤

Intro

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

Lightmass 借用 Photon Mapping 算法生成保存全局光照信息的光照貼圖. 本文將着重介紹 Lightmass 的光子追蹤部分.

光子追蹤的主要工作是: 發射直接光子, 發射間接光子, 緩存物體表面各處的光照結果. 在 Lightmass 中計算光子的 Irradiance 之前還會對光子進行標記和緩存操作. 這些預先的操作目的是根據空間關係先對光子進行一次篩選, 減少無用的光子計算, 提高運行效率, 併爲後面的流程做數據準備.

發射直接光子

直接光子的生成過程比較簡單. 從光源發射一定數量的光線並與場景求交, 所得的交點就是直接光子的位置並可以根據場景光源計算出光子所對應的 power.

另外在得到直接光子之後, Lightmass 還會根據光子所在表面的 BRDF 屬性產生一組被稱爲 IndirectPath 的射線, 這組射線會決定是否需要產生間接光子以及產生間接光子時採樣光線的方向.

直接光子

發射間接光子

間接光子的生成過程與直接光子的類似, 只不過間接光子會開始考慮光子接觸表面後的反彈等行爲. 需要注意的是爲了更好的間接光照效果, 間接光子並沒有在上一步產生的直接光子基礎上繼續生成. 而是以更大的密度重新產生了一遍直接光子, 並在此基礎上生成間接光子. 另外因爲第一次反彈和後續反彈在計算輻照度時的貢獻權重不同, 這裏會將間接光子分成兩個光子圖分別保存.
發射間接光子

標記 IrradiancePhoton

這裏標記的是 IrradiancePhoton 是否存在存在直接光照的貢獻, 這可以通過判斷當前光子一定範圍內是否存在Direct Photon來確定 (這也體現出我們將光子圖一分爲三的意義). 這個指標會影響當前 IrradiancePhoton 的搜索範圍, 存在直接光照貢獻的 IrradiancePhoton 搜索範圍會更小, 也就是在空間中某點處查找其周圍的光子時更不容易被找到. 或者說有直接光照貢獻的 IrradiancePhoton 影響範圍要小一些.

將 IrradiancePhoton 緩存到對應的 TextureMapping 中

這裏我們需要遍歷 TextureMapping 中記錄的物體表面上的每一個點, 爲此我們需要對其進行光柵化操作. 獲取到當前頂點之後查找其一定範圍內與其距離最近的 IrradiancePhoton, 如果存在則將此光子記錄在 TextureMapping->CachedIrradiancePhotons 中並將此光子標記爲已使用. 在後面計算光子的輻照度時, 如果光子沒有被標記爲已使用, 則直接跳過計算. 這其中的邏輯在於: 沒有被標記爲已使用的光子意味着在空間上他沒有影響任何一個表面, 所以不需要計算.

另外需要注意的是我們遍歷每一個位置查詢與其距離最近的光子, 由於光子本身是離散的, 這就形成了一定範圍內的模型表面都受到同一個光子的影響.

計算 IrradiancePhoton 的 Irradiance

這裏我們會遍歷之前所有的 IrradiancePhotons, 跳過未使用的光子, 然後計算光子的 Irradiance. 光子的 Irradiance 涉及直接光照貢獻, 第一次反彈貢獻和第二次及後續反彈貢獻三部分.

其中直接光照部分在默認設置下在這裏不起作用. Lightmass 通過 CalculatePhotonIrradiance 方法計算光子的 Irradiance. 他首先尋找目標光子一定範圍內的所有光子, 然後對這些光子使用 ConeFilter 計算出當前光子的 Irradiance 並更新當前光子.

需要注意的是我們上一步緩存的是 IrradiancePhoton 的指針, 這裏的修改也就自動同步到了 TextureMapping->CachedIrradiancePhotons 中.
CachedIrradiancePhotonsPS: 從圖中可以看出現在緩存的光照明顯呈現色塊效果

緩存物體表面各處的光照結果

我們之前已經緩存了模型表面受到的間接光照值, 接下來我們再將直接光照的結果也應用到緩存中就可以得到完整的光照緩存.

爲此我們需要先遍歷物體表面上的每一個點(和之前一樣通過光柵化來實現這個空間上的遍歷). 這時我們之前緩存的 CachedIrradiancePhotons 開始發揮作用. 由於 CachedIrradiancePhotons 和光柵化之後的 TexelToVertexMap 是一一對應的, 那麼我們在遍歷 TexelToVertexMap 時就可以直接通過下標判斷對應空間位置上是否存在光子並獲取光子的 Irradiance.

這一步會將光子的 Irradiance 數據, 直接光照陰影信息和模型表面材質整合到一起並保存到 TextureMapping->SurfaceCacheLighting 中. 不過這時的光子還沒有對其周圍的環境產生影響, 光子對環境的作用還需要通過最後的 Final Gather 確定.
SurfaceCacheLighting

參考文獻

Jiff:Lightmass分析之 經典Photon Mapping算法介紹
Jiff:LightMass源碼分析之光子追蹤實現
Jiff:LightMass源碼分析之光照評估

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章