Image-Based Lighting
環境貼圖就是在場景中任意一點往四周看去可看到的光照,將其記錄在一張圖上這就是環境光照,或者也可以叫做IBL(image-based lighing)。通常我們用spherical map或cube map來存儲環境光照。

下面將解釋IBL的原理與UE4中的實現方法。
1. 渲染方程
還是從渲染方程開始說起:
\[L_{o}\left(p, \omega_{o}\right)=L_{e}\left(p, \omega_{o}\right)+\int_{\Omega^{+}} L_{i}\left(p, \omega_{i}\right) f_{r}\left(p, \omega_{i}, \omega_{o}\right)\left(n \cdot \omega_{i}\right)V(p,\omega_{i}) \mathrm{d} \omega_{i} \]
IBL不考慮遮擋,所以Visibility項可以舍去:
\[L_{o}\left(p, \omega_{o}\right)=L_{e}\left(p, \omega_{o}\right)+\int_{\Omega^{+}} L_{i}\left(p, \omega_{i}\right) f_{r}\left(p, \omega_{i}, \omega_{o}\right)\left(n \cdot \omega_{i}\right)\mathrm{d} \omega_{i} \]
渲染方程相關記錄中使用了蒙特卡洛方法將積分分解成采樣大量隨機樣本可以得到一個近似解:
\[\begin{aligned} L_{o}\left(p, \omega_{o}\right) &=L_{e}\left(p, \omega_{o}\right)+\int_{\Omega^{+}} L_{i}\left(p, \omega_{i}\right) f_{r}\left(p, \omega_{i}, \omega_{o}\right)\left(n \cdot \omega_{i}\right) \mathrm{d} \omega_{i} \\ & \approx L_{e}\left(p, \omega_{o}\right)+\frac{1}{N} \sum_{i=1}^{N} \frac{L_{i}\left(p, \omega_{i}\right) f_{r}\left(p, \omega_{i}, \omega_{o}\right)\left(n \cdot \omega_{i}\right)}{p\left(\omega_{i}\right)} \end{aligned} \]
但實時對每個着色點做一遍蒙特卡洛開銷無法接受。
2. 近似公式
2.1 近似公式
實時渲染中,經常用到一個約等式:
\[ \int_\Omega{f(x)g(x)}\mathrm{d}x\approx\frac{\int_{\Omega_G}{f(x)\mathrm{d}x}}{\int_{\Omega_G}\mathrm{d}x}\cdot\int_\Omega{g(x)\mathrm{d}x} \]
需要注意,\(f(x)\)積分范圍從\(\Omega\)變成了\(\Omega_G\),只需要積有值的范圍即可。
這個約等式成立有兩個條件,滿足兩個條件之一,渲染領域就認為他們相似相等:
- \(g(x)\)的積分域很小
- \(g(x)\)足夠smooth
2.2 相關案例
以渲染方程中的Visibilty項為例(為了方便不考慮自發光):
\[L_{o}\left(p, \omega_{o}\right)=\int_{\Omega^{+}} L_{i}\left(p, \omega_{i}\right) f_{r}\left(p, \omega_{i}, \omega_{o}\right)\left(n \cdot \omega_{i}\right)V(p,\omega_{i}) \mathrm{d} \omega_{i} \]
使用約等式把渲染方程的\(V\)項拿到積分外:
\[L_{o}\left(p, \omega_{o}\right)\approx\frac{\int_{\Omega^+}{V(p,\omega_{i})\mathrm{d} \omega_{i}}}{\int_{\Omega^+}\mathrm{d} \omega_{i}} \cdot\int_{\Omega^{+}} L_{i}\left(p, \omega_{i}\right) f_{r}\left(p, \omega_{i}, \omega_{o}\right)\left(n \cdot \omega_{i}\right) \mathrm{d} \omega_{i} \]
此約等式成立的條件:
- \(g(x)\)的積分域很小:點光源(一個位置)或方向光源(一個方向)
- \(g(x)\)足夠smooth:Diffuse的BRDF 且 面光源的Radiance是均勻分布的
這也是Shadow Map的一個解釋。
3. 使用近似公式拆分L項和BRDF項
首先BRDF有兩種情況:
- brdf為glossy時,覆蓋在球面上的范圍很小,也就是small support(積分域)
- brdf為diffuse時,它會覆蓋整個半球的區域,但是是smooth的,也就是值的變化不大,就算加上cos也是相對平滑的
滿足近似公式成立條件,可以得到不考慮遮擋項的渲染方程的近似:
\[L_{o}\left(p, \omega_{o}\right)\approx\frac{\int_{\Omega_{f_r}}{ L_{i}\left(p, \omega_{i}\right) \mathrm{d} \omega_{i}}}{\int_{\Omega_{f_r}}\mathrm{d} \omega_{i}} \cdot\int_{\Omega^{+}}f_{r}\left(p, \omega_{i}, \omega_{o}\right)\left(n \cdot \omega_{i}\right) \mathrm{d} \omega_{i} \]
4. 處理L項的積分
L項的積分范圍,是和BRDF范圍相關的:

為了只采樣一次入射光,需要對環境貼圖進行模糊。不同的BRDF有不同的濾波核大小。

L值在BRDF相鄰兩個Level采樣結果之間差值:

這樣對於一個着色點,L的值只需要兩次采樣並差值就可以得到。
5. 處理BRDF項的積分
仍然可以用預計算來解決后半部分積分采樣的問題,但是預計算的話我們需要將參數的所有可能性均考慮進去,維度太高,存儲空間太大,需要降低維度。
假設我們使用Microfacet BRDF模型:
\[f(p,\omega_i,\omega_o) = \frac{F(o,h)G(i,o,n)D(h)}{4(n,i)(n,o)} \]
- F是菲涅爾項,主要參數有三通道的初始反射率\(R_0\),以及觀察方向\(\omega_o\)
- G是幾何項,主要表示微表面之間的遮擋關系,主要參數有法線\(n\),觀察方向 \(\omega_o\)
- D是法線分布函數(NDF),主要參數有觀察方向 \(\omega_o\),粗糙度\(\alpha\)等(半程向量\(h\)可以借由 \(\omega_o\) \(\omega_i\)計算得到)
microfacet brdf中,考慮的是菲涅爾項、遮擋項以及法線分布項,由於此時暫時不考慮陰影,此處需要關注的是F和D。其中\(R_0\),\(\omega_o\),\(n\)均為三維向量,再加上\(\alpha\),存儲容量爆炸。
5.1 菲涅爾項:將\(R_0\)拆除積分
首先,我們使用菲涅爾項的Schlick's approximation來替代BRDF中的\(F(o,h)\),Schlick's approximation可以表示為:
\[R(\theta) = R_0+(1-R_0)(1-(h\cdot\omega_o))^5\\ R_0=(\frac{n_1-n_2}{n_1+n_2}) \]
其中\(\omega_o\)是觀察方向,\(n_1\)、\(n_2\)是兩種介質的折射率
帶入BRDF:
\[\begin{aligned} \int_{\Omega^+}f_r(p,\omega_i,\omega_o)cos\theta_i \mathrm{d}\omega_i&=\int_{\Omega^+}\frac{f_r(p,\omega_i,\omega_o) }{F(o,h)}F(o,h)cos\theta_i\mathrm{d}\omega_i \\ &=\int_{\Omega^+}\frac{f_r(p,\omega_i,\omega_o) }{F(o,h)}(R_0+(1-R_0)(1-(h\cdot\omega_o))^5)cos\theta_i\mathrm{d}\omega_i\\ &=R_0\int_{\Omega^+}\frac{f_r(p,\omega_i,\omega_o) }{F(o,h)}(1-(1-(h\cdot\omega_o))^5)cos\theta_i\mathrm{d}\omega_i+\int_{\Omega^+}\frac{f_r(p,\omega_i,\omega_o) }{F(o,h)}(1-(h\cdot\omega_o))^5cos\theta_i\mathrm{d}\omega_i \end{aligned} \]
我們按順序做了如下的變形:
1、在BRDF項中顯式考慮菲涅爾項,並做了一個恆等
2、變形用Schlick's approximation替換其中一個菲涅爾項
3、將替換后的積分式拆開,將\(R_0\) 單獨提取出來
5.2 法線分布項:使用夾角\(\theta\)代替\(\omega_o\)、\(n\)
假設此處的BRDF我們使用各項同性的法線分布函數,比如Beckmann分布:
\[D(h)=\frac{e^{-\frac{tan^2\theta{h}}{\alpha^2}}}{\Pi\alpha^2cos^4\theta_h}(cos\theta_h=(h\cdot{n})) \]
將半程向量\(h\)拆開可得:
\[h\cdot{n}=(\frac{\omega_o+\omega_i}{2})\cdot{n}=\frac{\omega_o\cdot{n}+\omega_i\cdot{n}}{2}=\frac{cos\theta_o+cos\theta_i}{2} \]
菲涅爾項中的\(h\cdot{\omega_o}\)也可以拆開:
\[h\cdot{\omega_o}=(\frac{\omega_o+\omega_i}{2})\cdot{\omega_o}=\frac{\omega_o\cdot{\omega_o}+\omega_i\cdot{\omega_o}}{2}=\frac{1+cos(\theta_o+\theta_i)}{2} \]
其中帶\(i\)下標的是積分變量。可以看出其實我們並不太關注 \(\omega_o\)和\(n\)的具體值,我們只關心它們的夾角\(\theta_o\)。也就是說,不論\(\omega_o\)的方向如何變化,只要夾角\(\theta_o\)不變,積分A和B的值就不會發生變化。
5.3 預計算的二維紋理
經過上述的近似拆分過程,我們將原BRDF積分項拆成了兩個積分並將積分所依賴的參數降到了2個,\(\theta_o\)和粗糙度 \(\alpha\)。可以選取不同的\(\theta_o\)和粗糙度\(\alpha\),分別計算兩個積分,保存到一張2D紋理的兩個通道:

當使用時輸入\(\theta_o\)和 \(\alpha\) ,在紋理上查詢出兩個積分的值,再結合初始反射率 \(R_0\) ,就可以計算出原BRDF的積分結果。
6. 總結
首先不考慮遮擋把\(V\)項干掉;用近似公式將\(L\)和\(BRDF\)拆開;通過對Cube Map生成Mipmap采樣差值取\(L\);將BRDF預計算為一張二維紋理,運行時采樣成反射率可得到。
本文結束
引用
GAMES202
圖片來自GAMES202課件
https://zhuanlan.zhihu.com/p/371112302
https://zhuanlan.zhihu.com/p/370207345