Lecture 05 Real-time Environment Mapping
Recap: Environment Lighting
- 一張表示了來自四面八方的無窮遠處光(distance lighting)的圖片
- Spherical map vs. cube map
Shading from environment lighing
非正式地命名為Image-Based Lighting (IBL)
- 通用解法:Monte Carlo intergration蒙特卡洛積分
- 數值上無偏的近似
- 需要大量的樣本
- 問題:非常慢
- 通常,如果shader中出現了sampling,很可能就不能用在實時渲染中
- 因為tempore的進展,時間、空間的濾波方式,sample複用的方式,使得越來越多的基於sampling的方法可以在實時渲染中應用了
- 但是還是儘量避免sampling
- 儘可能避免sampling
- 通常,如果shader中出現了sampling,很可能就不能用在實時渲染中
渲染方程Lighting項和BRDF項相乘再積分
- 如果BRDF項是glossy的(左圖),說明覆蓋球面的情況下覆蓋的挺小(support小)
- 如果BRDF項是diffuse的(右圖),覆蓋半球區域大,但是非常smooth
於是可以用經典的近似方案:
條件:
- g(x)的support比較小
- g(x)比較smooth
滿足其一即可
將Lighting項拆出來,表示為光照在BRDF項範圍的積分,再除以一個在BRDF項範圍內的空積分來做歸一化
*區別於前面Shadow Map,Shadow Map中是將Visibility項拆出來,這裡是將Light拆出來
也可以理解成拆出來的項是在濾波,而support的大小決定了filter核的大小
The split sum approximation
1st Stage Prefiltering
這裡是在球面上做預計算
- 用不同大小的濾波核近似
- 查詢時透過上一步生成的圖中三線性插值得到中間filter size的圖(類似Mipmap)
為什麼要做filtering?
要計算一個shading point對應的環境光項,會在其周圍分佈一些取樣,再做加權平均,從而得到shading point的值
這個操作就約等於先對環境光做好一個filtering,這樣取樣到的環境光的任何一個點都是原先一系列點的加權平均,於是就只需在鏡面反射的方向上查詢一次
這裡對應的是前面渲染方程中拆出來的Lighting項
2nd Stage
思想:
- 預計算所有可能的引數(roughness, color (Fresnel term) )的不同組合得出的值
- 這樣做引數太多,需要一個五維的表來記錄結果(roughness一維,rgb三維,角度一維)
- 預計算是非常正常的做法,但可能無法承受高緯度的預計算
- 如何降低維度?
Recall: Microfacet BRDF 微表面BRDF
Schlick's approximation
能夠近似地描述菲涅爾項,將其近似成一個指數函式,定義了一個初始反射率\(R_0\),以及函式如何增長\((1-\cos\theta)^5\)
Beckmann distribution
NDF項使用Beckmann distribution,結果只與粗糙度\(\alpha\)和半程向量與法線夾角\(\theta_h\)有關
降維後的預計算
於是就將剛剛五維的預計算變成了三維的預計算,引數為\(初始反射率R_0,入射角\theta,roughness\ \alpha\)
繼續降維:
將\(R_0\)拆到了積分外邊,將原本積分對於基礎反射率\(R_0\)的依賴給消除了,BRDF中的\(f_r\)和菲涅爾項\(F\)上下消掉了,剩下的只有兩個引數\(\theta_i和\alpha\),降到了二維,這樣兩個積分部分剛好放在一張紋理的兩個通道,於是計算環境光照只需求查詢紋理,不需要取樣了
- 計算避免了sampling
- 非常快且結果正確
在工業界叫做split sum
- split integral 積分\(\rightarrow\)split sum 求和
- \(\frac{1}{N}\underset{k=1}{\overset{N}\sum}\frac{L_i(l_k)f(l_k,v)\cos\theta_{l_k}}{p(l_k,v)}\approx(\frac{1}{N}\underset{k=1}{\overset{N}{\sum}}L_i(l_k))(\frac{1}{N}\underset{k=1}{\overset{N}{\sum}}\frac{f(l_k,v)\cos\theta_{l_k}}{p(l_k,v)})\)