GAMES202筆記:屏幕空間實時全局光照


本文是GAMES 202的學習筆記,主要內容包括:SSAO、HBAO、SSDO、SSR

1. Screen Space Ambient Occlusion

環境光遮蔽是一個對於全局光照的近似,在屏幕空間意味着從Camera渲染場景得到信息,而非是場景中的所有信息。

1.1 三個假設

  • 假設任何一個shading point上來自任何方向的間接光照(incident lighting)是一個常數
  • 不同位置的Visibility是不同的
  • 假設物體是Diffuse的

下圖中左忽略V項,右考慮V項:

下圖中紅色部分表示被遮擋,黃色部分表示未被遮擋,我們可以明顯的得出一個結論,左邊的 Shading point要比右邊的亮一點:

1.2 理論支持

1.2.1 投影立體角

立體角是單位球上的一個面積,關於cos中的θ,我們認為θ從北極開始到南極是180度,那么立體角 * cosθ 可以把單位球上的面積投影到了單位圓上:

所以\(d x_{\perp}=\cos \theta_{i} \mathrm{~d} \omega_{i}\)

1.2.2 渲染方程拆分

還是從渲染方程開始:

\[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\left(p, \omega_{i}\right) \mathrm{d} \omega_{i} \]

不考慮自發光,用近似公式將V項拆出去:

\[L_{o}\left(p, \omega_{o}\right) \approx \frac{\int_{\Omega^{+}} V\left(p, \omega_{i}\right)\cos \theta_{i} \mathrm{d} \omega_{i}}{\int_{\Omega^{+}}\cos \theta_{i} \mathrm{d} \omega_{i}} \cdot \int_{\Omega^{+}} L_{i}\left(p, \omega_{i}\right) f_{r}\left(p, \omega_{i}, \omega_{o}\right)\cos \theta_{i} \mathrm{~d} \omega_{i} \]

將前半部分積分中分母的立體角 \(\mathrm{d}\omega_{i}\) 拆成\(\sin\theta\mathrm{d} \theta\mathrm{d}\varphi\)之后對 \(\theta\)\(\varphi\) 分別積分得到的結果是\(\pi\),整個前半部分積分結果我們稱其為\(k_{A}\),其實際意義是從一個點往所有方向看去按cos加權平均的平均visibility:

\[k_{A}=\frac{\int_{\Omega^{+}} V\left(\mathrm{p}, \omega_{i}\right) \cos \theta_{i} \mathrm{~d} \omega_{i}}{\pi} \]

因為假設了所有方向的間接光照是一個常數;物體是Diffuse的,BRDF也是常數。最終結果就是漫反射系數×間接光照強度Li。間接光照強度和漫反射系數是可以自定義制定的,所以后半部分完全是自定義的:

\[k_B=L_{i}^{\text {indir }}(p) \cdot \frac{\rho}{\pi} \cdot \pi=L_{i}^{\text {indir }}(p) \cdot \rho \]

所以當前着色點的AO = 加權平均visibility * 自定義顏色。
因為brdf是diffuse的、間接光照也是常數,所以可以將L和BRDF項拆出去,並且轉換為以下形式:

\[\begin{aligned} \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 \\ &=\overline{f(x)} \cdot \int_{\Omega} g(x) \mathrm{d} x \end{aligned} \]

如果\(f(x)\)是常數,那么第一部分相當於取均值,也可以得到相同的結果。

1.3 求Visibility部分

  • 任何一個Shading Point在以自身坐標為圓心,半徑為R的球的內部隨機撒一些點,然后判斷這些點能不能被Shading Point直接看到;
  • 從Camera出發渲染,深度圖可以作為場景的一個簡單近似,也就是我們從camera看到的下圖中的白線,球內部的點是可以投影到Camera然后找之前記錄的深度,如果深度更深,則表示在物體內部被遮擋,反之則未被遮擋。

這樣做存在一些問題:上圖中紅色虛線中的紅點能夠被Shading Point看到的,但是由於是從Camera出發,這里被判斷為了看不到;沒有考慮法線方向,但渲染方程只考慮法線所在的半球空間。因此SSAO只在整個球采樣紅點過半的時候才開始考慮AO問題。

1.4 噪聲問題

采樣數越多,噪聲越少。可以用少量的Sample,得到一個noisy的結果;然后再這個noisy的結果上進行一個denoising來實現降噪。降噪的模糊和噪聲在和場景中其他效果與光照疊加后就會變得非常不明顯,從而在最終的圖像上獲得比較好的綜合效果。

2. Horizon Based Ambient Occlusion

當Screen Pass可以拿到場景法線時,我們就可以進行半球采樣了;同時可以根據方向加權(靠近中間大,靠近兩邊小)。

下面是SSAO與HBAO結果對比:

有效減少了錯誤遮擋情況。

3. Screen Space Direction Occlusion

屏幕空間方向遮蔽是SSAO的一個升級,AO考慮間接光照是一個常數,而DO里更精確的考慮了間接光照。

3.1 更准確的近似間接光照

  • RSM中通過Shadow Map可以得到用於計算第一次彈射的間接光照光源信息;
  • AO是全局光照的近似,不同顏色的Diffuse會互相照亮,但SSAO/HBAO只能得到明暗變化,得不到Clolor Blending;

3.2 理論支持

3.2.1 基本思路

SSDO的做法與Path Tracing很像,假設在Shading Point的P點,隨機的往某一個方向打出一根光線:

  • 如果光線沒碰到物體,則認為P點這里接收直接光照;
  • 如果碰到了一個點Q,那么算出Q點接受的直接光照打到P點的貢獻,從而求出P點的間接光照;

3.2.2 理論支持

SSAO和SSDO假設完全相反:

  • AO認為紅色的框里能接收間接光照,黃色框里無法接收間接光照,然后求出加權平均的visibility值,也就是假設間接光照來自比較遠的地方
  • DO認為紅色框里接收的是直接光照,而黃色框里才是接收到的間接光照。P點接收到的是來自紅色框的直接光照+黃色框里的間接光照,也就是假設間接光照來自比較近的反射物

這兩個假設都不是完全正確的,物理真實的情況是這兩種的混合:近處的是DO,遠距離是AO,因此AO與DO也並沒有矛盾。

V=1時是直接光照,而DO的計算是計算間接光照,完全不用去計算:

\[L_{o}^{\operatorname{dir}}\left(\mathrm{p}, \omega_{o}\right)=\int_{\Omega^{+}, V=1} L_{i}^{\operatorname{dir}}\left(\mathrm{p}, \omega_{i}\right) f_{r}\left(\mathrm{p}, \omega_{i}, \omega_{o}\right) \cos \theta_{i} \mathrm{~d} \omega_{i} \]

V=0時也就是間接光照的情況,這是DO應該處理的:

\[L_{o}^{\operatorname{indir}}\left(\mathrm{p}, \omega_{o}\right)=\int_{\Omega^{+}, V=0} L_{i}^{\operatorname{indir}}\left(\mathrm{p}, \omega_{i}\right) f_{r}\left(\mathrm{p}, \omega_{i}, \omega_{o}\right) \cos \theta_{i} \mathrm{~d} \omega_{i} \]

3.3 查找點P的間接光照貢獻點

做法與AO一樣:考慮點P法線部分的半球,判斷從P點往A、B、C、D四個方向看會不會被擋住,由於是屏幕空間的算法,因此這里我們同樣不考慮在3D場景中A,B,C,D四點會不會與P連成光線,只考慮從Camera看去A、B、C、D與P連成的光線會不會被擋住。

上圖中,ABD三個點的深度比從camera看去的最小深度深,也就是說PA,PB,PD方向會被物體擋住,因此會為P點提供間接光照。下面我們還需要計算這些點對P點的貢獻。

3.4 計算Surface patch的間接光貢獻

首先需要做的是轉換積分域:渲染方程中求P點的間接光照的積分域是P點的半球空間,對整個立體角進行采樣;現在是通過對已知的光源的貢獻求和得到點P的間接光照。
蒙特卡洛方法需要在x上采樣在x上積分才能成立,需要把渲染方程對\(\mathrm{d}\omega\)的積分轉化為對\(\mathrm{d}A\)的積分。

可以將\(\mathrm{d}A\)投影到單位球表面上:

\[\mathrm{d} \omega=\frac{\mathrm{d}A \cos \theta^{\prime}}{\left\|x^{\prime}-x\right\|^{2}} \]

那么渲染方程可以寫成對\(\mathrm{d}A\)積分的形式:

\[\begin{aligned} L_{o}\left(x, \omega_{o}\right) &=\int_{\Omega^{+}} L_{i}\left(x, \omega_{i}\right) f_{r}\left(x, \omega_{i}, \omega_{o}\right)V\left(p, \omega_{i}\right) \cos \theta \mathrm{d} \omega_{i} \\ &=\int_{A} L_{i}\left(x, \omega_{i}\right) f_{r}\left(x, \omega_{i}, \omega_{o}\right) V\left(p, \omega_{i}\right)\frac{\cos \theta \cos \theta^{\prime}}{\left\|x^{\prime}-x\right\|^{2}} \mathrm{d} A \end{aligned} \]

把立體角的積分變成了對Light區域面積的積分,如果當區域足夠小的時候dA甚至不用積分,直接相乘后相加即可。
因為假設物體是Diffuse的,所以:

\[f_r = \frac{\rho}{\pi} \]

\[L_i = f_r\frac{\Phi}{\mathrm{d} A} \]

其中\(\Phi\)代表直接光的flux,將\(L_i\)帶入渲染方程之后,可以抵消\(\mathrm{d} A\),最后可以得到一個次級光源對着色點的貢獻公式:

\[E_{p}(x, n)=\Phi_{p} \frac{\max \left\{0,\left\langle n^{\prime} \mid x-x^{\prime}\right\rangle\right\} \max \left\{0,\left\langle n \mid x^{\prime}-x\right\rangle\right\}}{\left\|x-x^{\prime}\right\|^{4}} \]

分母上多出來的\(\left\|x-x^{\prime}\right\|^{2}\)用於給上面兩個\(x^{\prime}-x\)歸一化。
剩下的和RSM一樣,將有次光源貢獻求和即可。

3.5 SSDO存在的問題

畢竟只有屏幕可見幾何的信息,遮擋上一定會存在誤判:

上圖中的點A,按照SSDO的理念應該屬於直接光照貢獻部分,但在實現時會被判定為間接光照貢獻。
屏幕空間拿不到的信息無法補全,當下圖中的方塊朝向與攝像機射線幾乎垂直或被遮擋時:

SSDO只適合小范圍的間接光補全,當距離超過追蹤范圍時,無法補全。下圖是Path Tracing的結果,如果用SSDO,綠色牆面超出采樣范圍,Cube上不會有綠色反光:

4. Screen Space Reflection

屏幕空間反射,或屏幕空間光線追蹤(Screen Space Raytracing)

4.1 基本實現方法

4.1.1 鏡面反射 Specular

對於任何一個像素:

  • 知道Shading point的觀察方向后,可以得出其反射方向
  • 從Shading point點沿着反射方向延長找到與屏幕的殼的交點
  • 將交點的顏色作為反射的顏色記錄到Shading point

4.1.2 光滑面反射 Glossy

Specular反射只需要反射一個方向的話,那么對於一定Roughness的材質來說我們要根據其BRDF的Lobe來考慮:如果Lobe比較細,則需要很少的光線;如果Lobe比較越大,像Diffuse那種的話我們需要射出很多根光線。

4.2 理論支持

對於任何一個Shading point,看到的radiance就是對半球進行積分,如果是Specular的物體,那么相當於光線打到物體的哪里,就用它所發出的radiance就可以:

\[\begin{aligned} L_{o}\left(x, \omega_{o}\right) &=\int_{\Omega^{+}} L_{i}\left(x, \omega_{i}\right) f_{r}\left(x, \omega_{i}, \omega_{o}\right)V\left(p, \omega_{i}\right) \cos \theta \mathrm{d} \omega_{i} \\ &=\int_{\Omega^{+}} L_{o}\left(q, q-p\right) f_{r}\left(x, \omega_{i}, \omega_{o}\right)V\left(p, \omega_{i}\right) \cos \theta \mathrm{d} \omega_{i}\end{aligned} \]

\(q\)代表次光源的位置
所以,我們需要根據反射向量與場景殼求交得到\(q\),然后通過采樣Color Buffer得到\(L_{o}\left(q, p-q\right)\)

4.3 反射光線與場景殼求交

4.3.1 Linear Raymarch

上圖中,黃色點是Shading point,橙色點是反射方向的采樣點,綠色是反射射線與場景殼的交點。

  • 沿着反射方向以一個固定的步長逐步前進,並將每次停止時的深度與殼的深度進行比較:如果淺於殼,則繼續前進;比殼深、則停止求交。也就是我們用深度來進行可見性判斷
  • 質量取決於步長的大小,步長小越精准,同時計算量也越大,因此步長太大太小都不行,在沒有SDF的情況下,步長只能是一個定值

所以如果沒有場景的SDF,需要一種加速策略。

4.3.2 Hierachical Ray Trace

這種方法基於為Depth Buffer生成存儲下層最小值的Mip-Map,和Hi-Z一樣。

大體步驟如下:
1根據Normal Buffer計算出Shading point的反射方向;
2使用最小步長前進,檢查是否與殼相交,深度采樣對應Level 0的Mip-Map;
3如果沒有相交,增大步長,檢查是否相交,采Level 1;以此類推,直到相交或者采樣點超出屏幕范圍;
4相交后根據Mip-Map向下級回退,很容易得到交點像素坐標。

特別說明:

  • 因為Level(n+1)對應Level(n)四個像素的最小值,只要Level(n+1)不與射線相交,Level(n)四個像素都不會。
  • 這里的步長是反射向量投影到Mip-Map深度圖上的距離。如果在Level0,那么步長是向量投影到Level0相鄰兩個像素的長度;如果在Level1,則是對應Level1上相鄰兩個像素的長度。所以步長是根據當前所在的Mip-Map Level動態決定的。
  • 如果Shading point並不是在\(2^k\)上的像素,查詢並不准確

4.4 存在問題

攝像機看不到的內容和在視錐體之外的信息無法得到。

Shading Point為Diffuse物體時效率低。

4.5 SSR的效果

4.5.1 Sharp and blurry reflection

Glossy物體反射的模糊現象:

4.5.2 Contact hardening

對於物體來說,近處的物體反射清晰,遠處反射模糊,當反射物是Glossy時反射的lobe是一個錐形,當距離越遠錐形的截面越越大,也就會發生模糊現象:

4.5.3 Specular elongation

反射在垂直方向被拉長的現象,在雨天常見的現象,當我們認為地面是各向同性的,也就是法線分布是一個圓,反射出去的lobe就是一個橢圓:

4.5.4 Per-piex roughness and normal

對於不同的法線與粗糙度不同的現象:

引用

GAMES 202
圖片來自於GAMES 202 PPT
https://zhuanlan.zhihu.com/p/381782999
https://zhuanlan.zhihu.com/p/383370745


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM