2020年5月12日 星期二

Image Based Lighting (1)


  • 前言
本章節是接續 淺談 physically based rendering 裡面未提到的多方向光源渲染的實作方法。

由於在 real-time 去計算所有方向的光源會是一個極大的開銷。

因此通常的作法是將環境內所有方向的光線情報 pre-compute(預先計算) ,

將結果儲存在一張影像圖(通常為一個 Cubemap)。

在渲染物體時,從這張影像圖去取得光線資料。

這種作法又稱作 Image Based Lighting (以後簡稱 IBL)。

  • rendering equation
回頭複習 rendering equation (渲染方程式)[1],


物體的渲染是由物體的自發光(emitted)和來源光線涵蓋整個半球的反射光所組成的。

在 淺談 physically based rendering (2) 裡,

解釋到反射光可以分解成 Diffuse 和 Specular。

因此,反射光方程式可以改寫成



在預先計算光線情報時,也拆分成 Diffuse 和 Specular 來處理。

本篇接下來將集中處理 Diffuse 的部分。


  • Diffuse irradiance
將焦點集中在 Diffuse 的部分,



根據 淺談 physically based rendering (3) 的討論,

我使用 Normalized Lambert 作為 Diffuse BRDF。

所以方程式可以改寫成:


其中:

kd : refraction ratio (折射率)

c : Albedo

對同一個物體來說,其 kd 和 c 值都是固定,可視為一常數值。

因此,在預算 Diffuse 部分,只要對積分部分作處理即可。

積分部分可以改寫成:



其中 θ 和 φ 的定義如下圖所示

圖片來源 LearnOpenGL


使用在 importance sampling (重點採樣) 提到的 Spherical Coordinates (球面座標系)。

積分的實作上,則使用 Monte Carlo method (蒙地卡羅積分法) 最後提到的 Riemann Sum。



  • Unity 實作
由於是預先處理,且需要大量的計算。

所以我使用 Unity 的 Compute Shader 來實作 Diffuse BRDF 的預算。

首先,準備一張 Environment Map (環境貼圖),作為周遭的環境光源。

素材來源 HDRIHaven

接著在 Compute shader 內,對 θ 和 φ 每增加 0.025 就做一次取樣。



因為 Diffuse 資訊不需要太詳細,

因此我將結果儲存在一個 32x32 的 Cubemap 裡。


到此,就完成了 Diffuse BRDF 的預算處理。


  • 結論

就如同 淺談 physically based rendering (3) 的討論,

Diffuse BRDF 的影響並不如 Specular BRDF 來的明顯,

因此整體的計算所使用的演算法並不複雜。

但在計算 Specular BRDF 時,為了確保採樣的精準度,將會使用稍微複雜的演算法來處理。

下一篇將繼續討論並實作 Specular BRDF 的部分。



  • Reference
1. Kajiya, James T., The rendering equation (PDF), Siggraph 1986, 1986: 143–150, ISBN 978-0-89791-196-2, doi:10.1145/15922.15902

2. Learn OpenGL - Diffuse irradiance







沒有留言:

張貼留言