Lecture 05 Real-time Environment Mapping

Telluluu發表於2024-09-01

Lecture 05 Real-time Environment Mapping

Recap: Environment Lighting

  • 一張表示了來自四面八方的無窮遠處光(distance lighting)的圖片
  • Spherical map vs. cube map

Shading from environment lighing

非正式地命名為Image-Based Lighting (IBL)

\[L_o(p,\omega_o)=\int_{\Omega^+}L_i(p,\omega_i)f_r(p,w_i,w_o)\cos\theta_id\omega_i\\ 這裡的渲染方程去掉了V(p,\omega_i) Visibility項,因為沒有考慮陰影\\ \Omega^+表示上半球,和法線點乘是正的方向 \]

  • 通用解法:Monte Carlo intergration蒙特卡洛積分
    • 數值上無偏的近似
    • 需要大量的樣本
  • 問題:非常慢
    • 通常,如果shader中出現了sampling,很可能就不能用在實時渲染中
      • 因為tempore的進展,時間、空間的濾波方式,sample複用的方式,使得越來越多的基於sampling的方法可以在實時渲染中應用了
      • 但是還是儘量避免sampling
    • 儘可能避免sampling

\[L_o(p,\omega_o)=\int_{\Omega^+}L_i(p,\omega_i)f_r(p,w_i,w_o)\cos\theta_id\omega_i\\ \]

渲染方程Lighting項和BRDF項相乘再積分

  • 如果BRDF項是glossy的(左圖),說明覆蓋球面的情況下覆蓋的挺小(support小)
  • 如果BRDF項是diffuse的(右圖),覆蓋半球區域大,但是非常smooth

於是可以用經典的近似方案:

條件:

  • g(x)的support比較小
  • g(x)比較smooth

滿足其一即可

\[\int_{\Omega}f(x)g(x)dx \approx \frac{\int_{\Omega_G}f(x)dx}{\int_{\Omega_G}dx}\cdot \int_{\Omega}g(x)dx\\ 這裡f(x)只需積g函式有值的地方就好 \]

\[L_o(p,\omega_o) \approx \frac{\int_{\Omega_{f_r}}L_i(p,\omega_i)d\omega_i}{\int_{\Omega_{f_r}}d\omega_i} \cdot \int_{\Omega^+}f_r(p,\omega_i,\omega_o)\cos\theta_i d\omega_i \]

將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

\[f(i,o)=\frac{F(i,h)G(i,o,h)D(h)}{4(n,i)(n,o)}\\ F(i,h)為Fresnel\ term菲涅爾項,決定垂直地看向物體表面,有多少能量被反射,直接決定了顏色\\ G(i,o,h)為shadowing-masking term,描述光線入射或反射時被其他微表面遮擋的情況,\\G為幾何衰減因子,輸出未被遮蔽而能從l反射到v方向的比例\\ D(h)為微表面法線分佈項,如果法線分佈在四面八方則為diffuse,如果都集中在某一方向則接近鏡面\\ \]

Schlick's approximation

\[R(\theta)=R_0+(1-R_0)(1-\cos\theta)^5\\ R_0=(\frac{n_1-n_2}{n_1+n_2})^2\\ R_0初始反射率,\theta入射角度\\ 一般認為入射光與法線夾角、出射光與法線夾角,以及半形(入射光和出射光夾角的一半)是可以互換的 \]

能夠近似地描述菲涅爾項,將其近似成一個指數函式,定義了一個初始反射率\(R_0\),以及函式如何增長\((1-\cos\theta)^5\)

Beckmann distribution

\[D(h)=\frac{e^{-\frac{\tan^2\theta_h}{\alpha^2}}}{\pi\alpha^2\cos^4\theta_h}\\ \alpha\ roughness,定義這個分佈是胖還是瘦,決定材質是diffuse還是glossy\\ \theta_h\ half\ vector半程向量和法線的夾角,可以透過某種方式描述成跟入射角相關的\\ \]

NDF項使用Beckmann distribution,結果只與粗糙度\(\alpha\)和半程向量與法線夾角\(\theta_h\)有關

降維後的預計算

於是就將剛剛五維的預計算變成了三維的預計算,引數為\(初始反射率R_0,入射角\theta,roughness\ \alpha\)

繼續降維:

\[\int_{\Omega^+}f_r(p,\omega_i,\omega_0)\cos\theta_id\omega_i \approx R_0\int_{\Omega^+}\frac{f_r}{F}(1-(1-\cos\theta_i)^5)\cos\theta_id\omega_i+\\ \int_{\Omega^+}\frac{f_r}{F}(1-\cos\theta_i)^5\cos\theta_id\omega_i \]

\(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)})\)

相關文章