跳至內容

光子映射

維基百科,自由的百科全書

計算機圖形學中,photon mapping是一個2 pass的全局光照算法,發明者為Henrik Wann Jensen。其做法為:分別從光源和照相機發出射線,當滿足終止條件時,兩條射線被連接在一起,用來在下一步中產生輻射度數值。該方法被用來做光和物體間的真實感模擬,特別值得一提的是,該方法在能夠模擬一些特殊的效果,比如處理透明介質的折射,間接漫反射,透明材質的次表面反射和某些煙及水蒸汽效果等等。經過擴展,Photon mapping也能更加精確的模擬光譜渲染。

一個酒杯光線模型用光子映射跟蹤來顯示焦散的效果。

效果

焦散(Caustics)

透明酒杯的焦散效果.

光經過反射和折射能產生一種叫caustics的效果

間接漫反射(Diffuse interreflection)

我們把光從一個漫反射物體反射到另外一個物體的照明效果叫做間接漫反射,這是Photon mapping的強項之一, 因為這個算法考慮了photon從一個表面反射到另外一個表面的過程,並且BRDF也能起作用,其結果自然的顯示出間接漫反射的效果。Color bleed是最常見的間接漫反射的例子。

次表面散射(Subsurface scattering)

次表面散射是光射入物體表面後,在被完全吸收/反射前朝不同方向散射的效果。該效果也能很精確的被photon mapping模擬。Jensen曾經有過一個實現,但是,當處理一些高散射材質時該方法會變得很慢, 與之對比,BSSRDFs能更好的處理這些情況。

實現步驟

構造photon map(pass 1)

在光子映射算法中,光子從光源發射到場景中。一旦光子和一個幾何面(surface)相交,相交點和入射方向就會被存在一個叫光子貼圖(photon map)的緩存中。一般來講我們會存兩張貼圖,一個給caustics另一個給其他光。經過相交檢測後, 根據相交面的材質,該光子可能被反射,吸收或者折射, 這一步通常用一個叫俄羅斯輪盤(russian roulette)的蒙特卡羅方法(Monte Carlo method)來處理。如果該光子被吸收,不需要下一步處理,這個光子停止輻射。如果光子被反射,根據BRDF計算新反射方向。最後,如果光子被折射,則根據相關自然定理,算出新的傳輸方向。 光子貼圖被構建後,由於光子的查詢時間給予光子的空間分布,所以他會被用一種叫K-nearest neighbor的算法來組織和優化。Jensen提議用kd-trees。光子貼圖會被存到硬碟或者內存里,等待下一步使用。

渲染(pass 2)

這一步中,前面創建好的光子貼圖將被用來估算輸出圖像上每個像素的最終輻射度(亮度)。 針對單個像素,需要做一個光線追蹤去找到最近的相交面。然後在該點上,用渲染方程計算最終輻射。方便起見,渲染方程被分解成四部分:直接光照,鏡面反射,光線蝕刻(caustics),和間接光照。

為了精確估計直接光照,需要從該點輻射射線到各個光源,如果射線沒和其他物體相交,那麼那光源就會被用作直接光照。 鏡面反射一般都用光線追蹤的方法來做(它可以很好的處理反射)。 Caustics則根據caustics光子貼圖來計算而來。由於該光子貼圖是caustics的唯一來源,所以該光子貼圖中,光子數目必須足夠多。 對於間接光照,輻射計算來自光子貼圖,但其不需要像Castics計算那麼精確,使用全局光子貼圖即可。

利用photon map計算輻射度

為了計算相交點的表面輻射度, 一個緩存光子貼圖將被使用,步驟為: 1.用nearest neighbor搜索函數搜索光子貼圖,收集臨近區域的N個光子 2.構造一個球體S,把得到的這N個光子包圍起來 3.對每個光子,根據S和BRDF,計算其光通量能量 4.所有光子的貢獻總和將為相交點的輻射強度

優化

  • 為了避免輻射不必要的光子,我們可以對光子的初始發射方向進行一定的限制。比如只發射光子到我們關心的物體方向上。這有很多種做法:...
  • 為了柔化間接光照,如果相交面術語Lambertian面, 可以使用一種叫irrandiance caching的技術和前面計算的結果進行差值。
  • 為了避免不必要的直接照明檢測,可以使用陰影光子(shadow photon)
  • 為了提高圖像質量,特別是caustics質量,Jensen推薦使用cone filter。這種filter能夠考慮距離權重,產生更加銳利的圖像。
  • 靠使用GPU光柵化,來計算初始和最後散射(Scattering),Image space photon mapping可以取得實時的執行效率,

其它

儘管光子映射設計時是針對光線跟蹤渲染器的,但掃描線渲染器也能使用。

外部連結