實時&離線皮膚渲染技術(Real-time & Offline Skin Rendering)


本博客將用於記錄搜集到的 Skin Rendering 技術,持續更新中。

目前還有相當些錯誤,正在修改中(目前簡單實現了一下皮膚渲染的demo,但還在繼續改進 XD)

現實皮膚模型

在渲染皮膚時主要關注以下光照路徑:

  • 鏡面反射:6%入射皮膚的光被皮膚最上層油脂菲涅爾反射

    • 實現例子:dual specular BRDF

    14fig03.jpg

  • 次表面散射(Subsurface Scattering,SSS):94% 的光進入皮膚次表層,在圍繞進入點的 3D 鄰域中返回和離開表面。現實的皮膚介質是多層的,而較物理的渲染一般建模成至少兩個不同的層。散射路徑還可進一步細分為單次散射和多次散射的路徑:

    • 單散射:在介質內部只散射了一次的光照貢獻,與光線角度相關性大
    • 多散射:在介質內部散射了2次或更多次的光照貢獻(也是diffuse現象的主要來源,而皮膚主要貢獻便是多散射)
    • 實現例子:BSSRDF

  • 透射 [可選]:對於較薄的物體(如耳朵邊緣、鼻子邊緣),光射入的平面和射出的平面很可能是不一樣的。實際上如果次表面散射的路徑實現的足夠物理,自然而然也會包含透射現象,因此該光路是可選的

    • 實現例子:BTDF with thickness map & shadow thickness

BSSRDF 着色模型 [2001]

光線進入 shading point 周圍的像素后經過在散射介質內部的隨機游走(random walk),可能會從 shading point 射出。

img

但 SSS 的光線在散射介質中的游走行為難以模擬,為了達成實時渲染的性能要求,便有了以下思路:

  • 提供一個類似於 BRDF 的函數(也就是 BSSRDF),但輸入參數從4D(入射方向、出射方向)變成了8D(入射點位置、入射方向、出射點位置、出射方向)
  • 太遠的像素對 shading point 的散射光貢獻極小,因此可以忽略它們,只對一定范圍內的表面 A 進行積分
img

圖左是 BRDF 的行為,圖右是 BSSRDF 的行為

於是便有了基於 BSSRDF 的渲染方程,相當於在 BRDF 渲染方程的基礎上增加了對表面的積分:

\[L_{o}\left(p_{o}, \omega_{o}\right)=\int_{A} \int_{2\pi} S\left(p_{o}, \omega_{o}, p_{i}, \omega_{i}\right) L_{i}\left(p_{i}, \omega_{i}\right)\left|\cos \theta_{i}\right| d \omega_{i} d A \]

然后又基於下列假設:

  • 次表面散射的物體是一個曲率為零的平面
  • 這個平面的厚度,大小都是無限
  • 平面內部的介質參數是均勻的
  • 光線永遠是從垂直的方向入射表面

得出 BSSRDF 函數的形式:

\[S\left(p_{o}, \omega_{o}, p_{i}, \omega_{i}\right)=\frac{1}{\pi} F_{t}\left(\eta_{o}, \omega_{o}\right) R_{d}\left(\left\|p_{i}-p_{o}\right\|\right) F_{t}\left(\eta_{i}, \omega_{i}\right) \]

Diffusion Profile(擴散剖面)[2001]

diffusion profile 描述了光線如何在半透明物體中進行擴散和分布,其函數形式如下:

\[R_{d}\left(\left\|p_{i}-p_{o}\right\|\right) \]

其輸入參數是距離(即 \(\|p_{i}-p_{o}\|\))和單散射Albedo(它是一個常系數,往往作用是直接相乘,從而可以調整各個顏色通道的貢獻率)

實際上,diffusion profile 就是預計算散射光線在介質內部的 random walk 行為,然后做成 LUT 以供 BSSRDF 快速查詢結果,從而達成實時渲染的性能需求。

14fig09.jpg

此外,可以看到這個距離模型其實是忽略形狀的,只是簡單的輸入兩點間距離,雖然簡單,但是實際效果還是相當能接受的。

14fig10.jpg

常見有計算 diffusion profile 的方法:

  • 偶極子(Dipole)[2002]
  • 多級子(Multipole)[2005]
  • 高斯和(Sum-of-Gaussians)擬合 [2007]
  • Burley Normalized Diffusion 擬合 [2015]

偶極子、多極子方法是早期用來計算 diffusion profile 的離線模擬方法,而高斯和、Burley normalized diffusion 則是已有精確 diffusion profile 情況下用來擬合的方法。

在實時渲染的時候,往往采用擬合方法而不用使用占據大量空間的精確 diffusion profile 數據。

偶極子 [2002] & 多極子 [2005]

偶極子、多極子方法實在太老,而且極子部分涉及的物理知識完全沒學過,沒什么參考價值還是跳過把。

將 BSSRDF 分成單散射部分和漫反射部分去計算:

\[S = S_{ss}+S_{ms} \]

單散射近似:為了簡化折射路徑,假設光源離表面距離很遠,將使用直射的ray來近似折射,因此可用 BRDF 來近似,結合蒙特卡洛方法計算出來。單散射的 radiance,受折射路徑距離、折射吸收率擴散率影響:

\[L_{o}^{(1)}\left(x_{o}, \vec{\omega}_{o}\right)=\frac{\sigma_{s}\left(x_{o}\right) F p\left(\vec{\omega}_{i} \cdot \vec{\omega}_{o}\right)}{\sigma_{t c}} e^{-s_{i}^{\prime} \sigma_{t}\left(x_{i}\right)} e^{-s_{o}^{\prime} \sigma_{t}\left(x_{o}\right)} L_{i}\left(x_{i}, \vec{\omega}_{i}\right) \]

雖然BRDF是基於直射路徑的,但是關於折射路徑的距離仍然可以通過以下斯涅耳定律公式估計出:

\[s_{i}^{\prime}=s_{i} \frac{\left|\vec{\omega}_{i} \cdot \vec{n}_{i}\right|}{\sqrt{1-\left(\frac{1}{\eta}\right)^{2}\left(1-\left|\vec{\omega}_{i} \cdot \vec{n}\left(x_{i}\right)\right|^{2}\right)}} \]

漫反射近似:假設兩次及以上的散射事件導致了光分布的均勻,因此這部分散射視為漫反射。使用偶極子來表示入射光源分布,上面為正的真實光源,下面為負的虛擬光源。

image-20211128161658294

仍然采用蒙特卡洛方法,取 N 個 sample 分布於不同的半徑 \(z_r\)(與負光源的距離),然后推算出一系列變量(如\(Z_v\)),其中 1 個sample 受偶極子源影響的漫反射:

\[\begin{aligned} R_{d}(r) &=\frac{\alpha^{\prime}}{4 \pi}\left[\left(\sigma_{t r} d_{r}+1\right) \frac{e^{-\sigma_{t r} d_{r}}}{\sigma_{t}^{\prime} d_{r}^{3}}+z_{v}\left(\sigma_{t r} d_{v}+1\right) \frac{e^{-\sigma_{t r} d_{v}}}{\sigma_{t}^{\prime} d_{v}^{3}}\right] \end{aligned} \]

多極子:偶極子模型可以滿足許多材料的散射效果。然而,對於由多層組成的材料,每一層都有不同的散射特性,輪廓的形狀變得比偶極子所能表示的更復雜。使用更復雜的多極模型可以顯着改善皮膚等多層材料的視覺外觀。偶極子的簡單形狀源自單個無限厚層中的散射,導致蠟質外觀。偶極子不能捕獲廣泛散射的真皮層頂部的薄的、窄散射的表皮層的組合反射率。

圖a為偶極子效果,圖b為多層多級子效果

高斯和 [2007]

對於擴散分布 \(R(r)\),用 k 個具有不同權重且不同方差的高斯分布去擬合,即:

\[R(r) \approx \sum_{i=1}^{k} w_{i} G\left(v_{i}, r\right) \]

  • 1個高斯函數可以很好擬合多散射效果,但無法擬合單散射+多散射
  • 2個高斯函數可以勉強擬合單散射+多散射
  • 6個高斯函數可以得到相當高精度的擬合效果

對於三層皮膚建模,一個擬合效果相當好的6層高斯和的參數如下:

14fig13.jpg

該 6 層高斯和對應的函數圖:

14fig14.jpg

Burley Normalized Diffusion [2015]

放棄物理,直接用純數學(一個數學公式)的方法擬合 diffusion profile:

\[R_{d}(r)={A}\frac{e^{-r / d}+e^{-r / 3 d}}{8 \pi d r} \]

其中,A 是 Surface Albedo(或者說單散射 Albedo),d 是用來控制這條曲線的參數。

我們希望 diffusion profile 有這么一個好的性質:當 Surface ,調低單散射 Albedo 時,

img

上面這張圖是 Burley 他們使用這篇文論中 [6] 的着色模型得到的參考數據,參數的模型選用的是 A(Surface Albedo)和 Diffuse Mean Free Path Length[公式]

實際上還有很多因素影響最終的散射結果,包括入射光的角度,介質本身是否 isotropic 等。不過為了簡化近似復雜度,有些因素會被舍棄掉。

所以,我們通過調整 d,來讓整個近似的曲線可以根據 A 的變化達到正確的近似結果。這里多說一句,論文中也提到這個擬合曲線的背后來源,正是受到了業界越來越多的使用簡單曲線擬合復雜曲線的案例啟發,比如我們熟知的菲涅爾項等。

想要“正確的”得到 d 值,我們可以根據上面的曲線算出一張 d 表,然后根據實際的 A 值插值出求出 d。這樣做雖然有誤差,但從結果來看,范圍大概在 4.9% 左右,是一個很不錯的結果。

當然,除了查表以外,還可以使用簡單的函數來擬合出 A 和 d 的對應關系。論文中給出了幾種不同的版本,每個版本假設的前提條件稍微有些區別,我挑了其中一個函數,對應上 A 之后,曲線大概是這樣:

preview

Burley Normalized Diffusion 的特點是:

  • 開銷低,精確度卻相當逼近基於蒙特卡洛暴力積分的無偏解
  • CDF 有解析解,可進行重要性采樣(importance sampling)優化
  • 和高斯和擬合相比,Normalized Diffusion 不能使用分離核方法,也就是說它必須得老老實實進行 2D 卷積 Pass,因此性能要求更高

可以看到這個擬合效果比起偶極子好上很多:

7e1c50f8956fc87ee61fda566f09c5f8

基於模糊的 SSS 方法

重溫一遍上面得到的基於 BSSRDF 渲染方程:

\[L_{o}\left(p_{o}, \omega_{o}\right)=\int_{A} \int_{2\pi} S\left(p_{o}, \omega_{o}, p_{i}, \omega_{i}\right) L_{i}\left(p_{i}, \omega_{i}\right)\left|\cos \theta_{i}\right| d \omega_{i} d A \]

\[S\left(p_{o}, \omega_{o}, p_{i}, \omega_{i}\right)=\frac{1}{\pi} F_{t}\left(\eta_{o}, \omega_{o}\right) R_{d}\left(\left\|p_{i}-p_{o}\right\|\right) F_{t}\left(\eta_{i}, \omega_{i}\right) \]

就會發現對表面積分和卷積(模糊)基本就是一回兒事,只不過每個 sample 的權重基本上取決於 diffusion profile,因此我們可以通過 Blur 方法來實現 BSSRDF 的渲染。

紋理空間模糊(Texture Space Blur) [2003]

img

總體流程:

  1. (可預計算)計算出一張 stretch texture(拉伸校正貼圖),表示每個 texel 應該進行多大范圍的 blur

  2. 渲染出一張 irradiance texture

  3. 紋理空間模糊:

    • 卷積核的權重:由高斯和擬合的 diffusion profile 確定
    • 卷積核的半徑:由 stretch texture 提供半徑拉伸系數
    • 根據每個高斯核來對 irradiance texture 進行 Blur 得到一些模糊好的 textures 並保存起來
  4. 對皮膚 Mesh 進行渲染時:

    • 根據 texcoord 分別采樣這些模糊好的 textures 以給定的權重混合起來得到 diffuse 結果
    • 根據每個光源給添加 specular 結果

屏幕空間模糊(Screen Space Blur) [2009]

img

核心思路:

  • 只需要對屏幕中 Stencil 標記過的 Skin 像素進行若干卷積操作,極大地降低了 Blur 的像素數目
  • 卷積核的大小:根據當前像素的深度 z(x,y) 及其深度兩個方向的導數來確定

Pre-Integrated Skin(預積分的皮膚着色)[2010]

img

Pre-Integrated Skin 是一個遠遠脫離物理基礎的算法,基於 Texture Space Blur,其特點主要是高效、簡單、視覺可接受

核心思路:

  • 預先對紋理進行卷積,而不用運行時卷積
  • 查找表的參數分別是dot(N,L)和曲率,這兩者結合就可以反映出光照隨着曲率的變化

Separable SSS(可分離的次表面散射)[2015]

Separable Subsurface Scattering [2015]

BSSRDF 實質就是進行一次 2D 卷積運算,可分離的卷積核就是在尋找一個可分離的核來表示的 diffusion profile 的近似,然后轉成兩個1D 卷積 Pass ,讓時間復雜度從O(n^2)=>O(n)

如圖,先經過一次 X 方向的卷積 Pass ,再經過一次 Y 方向的卷積 Pass 就能得到相當於 2D 卷積的效果,最后再添加 Specular 就能得到很好的 SSS 材質效果。

注:不可以先添加 specular 再進行卷積,不然會出現明顯的 artifact (例如高光處被卷積成十字形狀)

高斯和函數的卷積核:傳統擬合方法;1個2D高斯雖然可分離,6個2D高斯和卻是不可分離的,除非使用6*2個1D卷積 Pass ,或者老老實實 2D 卷積,但都比較耗性能

基於SVD分解的可分一維卷積核:有局限

藝術家易用的卷積核:分解為近距離散射和遠距離散射兩個部分,兩個高斯函數先相加后相乘,相當於四個高斯函數單獨作用再相加

\[a_{m}(x)=w G\left(x, \sigma_{n}\right)+(1-w) G\left(x, \sigma_{f}\right) \]

\[A_{m}(x, y)=a_{m}(x) a_{m}(y) \]

增加引導函數的可分一維卷積核:給每個位置增加了一個重要性系數,用戶可自定義,但沒有直接的物理意義

預積分可分離核(Pre-integrated Separable Kernel):paper主要推薦的卷積核。

前提是假設 \(E\) 可分離:

\[E(x, y)=E_{1}(x)+E_{2}(y) \]

或者換個形式表示就是

\[\frac{\partial E}{\partial x \partial y}=\frac{\partial E}{\partial y \partial x}=0 \]

一個常見的滿足 E 可分離的例子便是曲率為 0 的平面,換句話說,如果一個點的周圍都是平的且不考慮外部的陰影遮蔽關系,那么該點鄰域內各個位置的 E 都是一樣的。

然后根據下列公式推導,2D核 \(R_d\) 就可被分離成兩個1D核 \(a_p\)

\[\begin{aligned} M_{e}(x, y)=& \iint E\left(x^{\prime}, y^{\prime}\right) R_{d}\left(x-x^{\prime}, y-y^{\prime}\right) d x^{\prime} d y^{\prime} \\=& \int E_{1}\left(x^{\prime}\right) \underbrace{\int R_{d}\left(x-x^{\prime}, y-y^{\prime}\right) d y^{\prime} d x^{\prime}}_{a_{p}\left(x-x^{\prime}\right)} \\ &+\int E_{2}\left(y^{\prime}\right) \underbrace{\int R_{d}\left(x-x^{\prime}, y-y^{\prime}\right) d x^{\prime}}_{a_{p}\left(y-y^{\prime}\right)} d y^{\prime} \\=& \iint E\left(x^{\prime}, y^{\prime}\right) \frac{1}{\left\|a_{p}\right\|_{1}} a_{p}\left(x-x^{\prime}\right) a_{p}\left(y-y^{\prime}\right) d x^{\prime} d y^{\prime} \end{aligned} \]

其中,\(\left\|a_{p}\right\|_{1}=\left\|R_{d}\right\|_{1} \quad\|x\|_{1} =\sum_{i}\left|x_{i}\right|\)

這樣可以把2D卷積寫為2個1D卷積:

\[\left(E * R_{d}\right)(x, y) \approx(E * A)(x, y)=\sum_{i=1}^{N}\left(\left(E * a_{i}\right) * a_{i}\right)(x, y) \]

其中,\(A(x, y)=\sum_{i=1}^{N} a_{i}(x) a_{i}(y)\)

具體實現

  1. 需提前有一份較精確的 diffusion profile(如6個高斯和擬合成的 \(R_d\) 函數),然后對 \(R_d\) 進行預先卷積(對距離的積分)得到 \(a_p(offset)\) 函數,換句話說就是一張一維表(輸入一個 \(offset\) 值,輸出一個 \(a_p\) 值)
  2. 在具體實現中,則使用 N 個 sample 來取代這張一維表,規定好每個sample 的 offset 值和計算出對應的 \(a_p\) 輸出值
  3. 將這個 sample list 傳給 shader,讓 shader 根據這些配置好的 sample 進行兩次 1D 卷積 Pass

注:即使E實際不可分,作者認為預計分可分離核的使用效果仍然足以接受,因此目前仍廣泛適用於各類實時BSSRDF皮膚渲染上

額外處理工作:

  • 抖動 jitter: paper 使用的一個可分核的擴散近似,在入射輻射度發生高頻變化的地方會產生人工痕跡。這是因為信號的空間占用(尺寸)比核的寬度更小,從而產生不對稱的星形圖案。因為本文使用的近似核不是完全經向對稱的

    image-20211206153516816
    • 對1D過濾器作用一個隨機旋轉(逐個像素)
    • 這種方式不需要對進行重新預積分,因為核的寬度並沒有變化
    • 為了減少計算負荷,作者只對靠近像素的采樣進行處理(10%),增加區域可以取得更好的效果,看下圖區別:
image-20211206153638984
  • 核的寬度:卷積核的尺寸受一個於深度相關的拉伸因子

\[s_{x}=\frac{a}{d(x, y)+\beta \cdot a b s\left(V_{x} d(x, y)\right)} \]

\[s_{y}=\frac{a}{d(x, y)+\beta \cdot a b s\left(V_{y} d(x, y)\right)} \]

  • 重要性采樣:

    • 為了計算1D函數的卷積,需要對這個函數進行采樣(離散化)
    • 為了計算效率,三個顏色通道使用一樣的重要性采樣,這個重要性采樣由主導通道決定

    Bilateral Filtering [2010]

    絕大部分 BSSRDF 模型有一個很大的缺陷就是假設表面是平面,並且在平面上進行采樣。這顯然錯誤,現在通過 Bilateral Filtering 技術,可以把深度信息考慮進去做采樣。

    \[I \approx \frac{2 \pi}{n} \sum_{i=1}^{n} \frac{R\left(r_{i}, d_{i}\right)}{p\left(r_{i}, d_{i}\right)} L=\frac{2 \pi}{n} \sum_{i=1}^{n} \frac{R(\sqrt{r_{i}^{2}+d_{i}^{2}})}{p\left(r_{i}, d_{i}\right)} L \]

    接下來就碰到困難了,\(p(r_i,d_i)\) 怎么算,之前的pdf是按平面計算的,它們的對應關系很難求。

    Unity 在報告中采用強制能量守恆,添加一個歸一化常數。

    \[I=\frac{\sum_{i=1}^{n} \frac{R\left(\sqrt{r_{i}^{2}+d_{l}^{2}}\right)}{p\left(r_{i}, d_{i}\right)} L}{\sum_{i=1}^{n} \frac{R\left(\sqrt{\left.r_{i}^{2}+d_{l}^{2}\right)}\right.}{p\left(r_{i}, d_{i}\right)}} \]

Participating Media 着色模型

image-20211128170325457

Participating Media 是描述次表面散射最精確的模型,它描述了光線傳播時因散射、吸收而導致的變化率方程:

\[\frac{\partial}{\partial t} L_{o}(p, \omega)=-\sigma_{t}(p, \omega) L_{i}(p,-\omega)+\sigma_{s}(p, \omega) \int_{\delta^{2}} phase \left(p,-\omega^{\prime}, \omega\right) L_{i}\left(p, \omega^{\prime}\right) d \omega^{\prime} \]

image-20211201152655702

\(\sigma_a\) = absorption 系數,\(\sigma_s\) = in/out-scattering 系數,\(\sigma_t=\sigma_a+\sigma_s\) = extinction 系數

散射介質內部的 albedo 定義為:

\[\rho=\frac{\sigma_{s}}{\sigma_{s}+\sigma_{a}}=\frac{\sigma_{s}}{\sigma_{t}} \]

使用這個着色模型就意味着要模擬光線在物體內部空間的隨機游走(Random Walk),相比於只求了表面積分的 BSSRDF 渲染方程,它更加精確但也是計算量最大的方法,基於該方法的基本都是離線的體積渲染方法,如 Volumetric Path Tracing

圖左是 BSSRDF 着色模型做的,圖右是Participating Media 着色模型做的

image-20211128170320424

Phase 函數

phase 函數表示了每對傳入傳出方向的能量分配概率。

各向同性 Phase

相當多的次表面散射的擴散模型假設各向同性,不捕獲各向異性散射。這樣簡化的各向同性 phase 函數:

\[p=\frac{1}{4\pi} \]

各向異性 Phase

image-20211201153141562

常用的各向 phase 函數便是 Henyey-Greenstein (HG) 函數,其中 n 為散射次數:

\[p_{n}\left(\omega \rightarrow \omega^{\prime}\right)=\frac{1-g^{2 n}}{4 \pi\left(1+g^{2 n}-2 g\left|g^{n-1}\right|\left(-\omega \cdot \omega^{\prime}\right)\right)^{3 / 2}} \]

皮膚的真實測量顯示了各向異性值為 g = 0.8,隨着 n 的增長,越來越呈現各向同性。

Schlick Phase 近似

獲得與 HG Phase 函數相似結果的一種更快的方法是使用 Blasi 等人提出的近似方法,通常為第三位作者命名為 Schlick Phase 函數:

\[p(\theta, k)=\frac{1-k^{2}}{4 \pi(1+k \cos \theta)^{2}} \]

其中, \(k \approx 1.55 g-0.55 g^{3}\)

它不包括任何復雜的冪函數,而只是一個平方,這是更快的計算。 為了將該函數映射到原始 HG 相函數,需要從 g 中計算 k 參數。對於具有恆定 g 值的參與介質,只需執行一次。 在實際應用中,Schlick 相位函數是一個很好的能量守恆近似。

Random Walk SSS(Volumetric Path Tracing)

diffusion-based 近似現在仍然廣泛使用,在假設介質是半無限長的平板(semi-infinite slab)的情況下,可以有很好的效果。而 MC 方法才能表現出物理正確,尤其在皮膚邊緣處(例如鼻子邊緣、耳朵邊緣)更加符合現實。

圖左是 normalized diffusion,圖右是 path-traced SSS

image-20211202130146661

Path Sampling 的一些方法 [2016、2017]

Practical and Controllable Subsurface Scattering for Production Path Tracing [2016] [Disney]

Path Traced Subsurface Scattering using Anisotropic Phase Functions and Non-Exponential Free Flights [2017] [Pixar Animation Studios]

距離采樣

  • 固定步長,無重要性

  • 根據單一波長的消散系數,適用於單色介質:\(p(s)=\sigma_{t} e^{-\sigma_{t} s}\)

  • 根據RGB三種波長的 transmittance (spectral MIS):

    • [2016] 累計吞吐量(throughput),權重取決於單散射 albedo。當某個波長吞吐量到達0時,就不需要做更多的采樣了

    • [2017] 使用基於 RGB 三種波長的 MIS:

      \(P(s)=P(\lambda) * P_{\lambda}(s)\)

      \(P_{\lambda}(s)=\sigma_{\lambda} e^{\left(-s \sigma_{\lambda}\right)}\)

      MIS 權重將使用平衡啟發式:\(W_{\lambda}(s)=P(\lambda) /\left(P\left(\lambda_{R}\right)+P\left(\lambda_{G}\right)+P\left(\lambda_{B}\right)\right)\)

      剩下的問題就是選取哪個 \(P(λ)\) ,也就是選擇R、G、B哪個通道的波長來做距離采樣:使用當前吞吐量(throughput)來指導選取某個 \(P(λ)\) 的概率,所謂吞吐量其實就是通道的貢獻度,貢獻度越高的通道更容易被選取

image-20211130180558091

RGB三種波長的消散系數往往是不同的(transimittance是不同的),例如皮膚介質中的紅光比其他波長傳播得更遠

方向性采樣

  • 假設各向同性時,無重要性
  • 假設各向異性時,根據 Phase 函數分布做重要性采樣(皮膚介質的 g 參數大約是0.8)

Dwivedi Sampling

  • 根據介質厚度“bias”一下采樣來增加 random walk 返回到入射平面或者從另一個出射平面射出的機會,從而加速收斂
  • 需要先通過一個探測射線來估計物體厚度,而且需要將該物體假設為曲率為0的平板物體
image-20211202135113978

將這些采樣方法通過 MIS 組合起來使用。最后Pixar的論文實現中的 MIS 共使用了6個采樣方法(for RGB renders)

對藝術家調參友好

  • [2016] 近似公式映射單散射 albedo \(\alpha\) 、表面 diffuse color、多重散射 albedo \(A\) ,減少控制參數數量:

    \[\begin{aligned} \alpha &=1-e^{-5.09406 A+2.61188 A^{2}-4.31805 A^{3}} \\ s &=1.9-A+3.5 *(A-0.8)^{2} \\ \sigma_{t} &=1 /(d * s) \end{aligned} \]

\(d\) 是散射距離。

  • [2017] Numerical Albedo Inversion:支持 diffuse color 來反向計算出 單散射 albedo,對藝術家調參友好 ;主要通過多項式來擬合

先算出輸入單散射 albedo 到輸出 diffuse color 的映射表(40 albedo \(\alpha\) * 40 各向異性系數 \(g\) = 1600 組合的 diffuse color)

  • \(A、C、D、F\) 將使用含 \(g\) 的多項式擬合:\(A(g)=a_{0}+a_{1} g+a_{2} g^{2}+a_{3} g^{3}+a_{4} g^{4}+a_{5} g^{5}+a_{6} g^{6}+a_{7} g^{7}\)
  • \(B、E\) 將使用含 \(g\) 的指數多項式擬合:\(B(g)=a_{0}+a_{1} \exp \left(a_{2} g+a_{3} g^{2}+a_{4} g^{3}+a_{5} g^{4}+a_{6} g^{5}+a_{7} g^{6}+a_{8} g^{7}\right)\)

只要記好了各種 \(a_i\) 系數,之后渲染就可以通過輸入表面顏色 \(x\) 和各向異性系數 \(g\) 來得到單散射 albedo

\(\alpha(x, g)=\left(1-x^{0.25}\right) \cdot A(g) \tan ^{-1}(B(g) x)^{C(g)}+x^{0.25} \cdot D(g) \tan ^{-1}(E(g) x)^{F(g)}\)

  • [2017] Non-Exponential Free Flight:將傳統物理的 Transmittance 公式(即散射傳播距離與剩余光子率的關系)改成非指數的公式,參數更好控制,對藝術家友好

Manifold Next Event Estimation,MNEE [2015]

Manifold Next Event Estimation [2015]

適用於眼球。

核心思路:

  • 已知攝像機到散射介質內表面的折射路徑 \(x_a,x_1,x_b\),然后在面光源上采樣一個點 \(x_c\),連接 \(x_b、x_c\) 為種子路徑 \(Y\),然后根據采樣半程向量 \(h\) 的結果,來不斷迭代讓路徑 \(Y\) 折成可以滿足折射規律的可接受的路徑 \(X\)

image-20211205164205714

Subdivision Next-Event Estimation,SNEE [2016]

Subdivision Next-Event Estimation for Path-Traced Subsurface Scattering [2016]

傳統的游走路徑最終的 BTDF 可能很難打在光源上(圖左),而SNEE的主要想法是通過一條額外的子路徑來滿足折射規律的情況下還能直接打到光源上。

image-20211204210344351

采樣邊界頂點 \(x_k\),兩個采樣子路徑:

  • 一個從光源出發的自頂向下路徑(NEE)
  • 一個根據 Phase 函數分布的自底向上路徑(正常的 Phase 函數分布采樣)

image-20211204215421513

不同散射介質適用不同的 NEE 技術:

  • 高密度介質,如皮膚, 僅需要在最后一個點做 NEE
  • 對於低一些密度的介質,例如水或者液體,需要在內部每個游走點(單散射的)做 NEE,並且使用 transparent shadows 來通過幾何
  • 對於散射介質含內部表面,如眼球,可以使用MNEE產生焦散,隨着在介質的透射距離而減弱

image-20211204221754230

工業界實現方案

UE5 MetaHuman 方案

Base Pass:提供出 G-Buffer: albedo, roughness, normal 等屬性

Lighting 相關 Pass:根據 G-Buffer 計算出 irradiance 和 AO

SSS 相關 Pass

  • InitGroupCounter
  • Setup(Checkerboard)
  • BuildIndirectArgs
  • FillMipsConditionBufferCS
  • GenerateMips
  • PassOne_Burley
  • PassTwo_SepHon
  • PassThree_SepVer
  • PassFour_BVar
  • Recombine(FullRes High Checkerboard Tiled)

使用 Separable SSS/Burley SSS/Both 實現基於屏幕空間的模糊

Separable SSS:

  • 通過6個高斯和預計算profile,再用預積分的可分離核去近似擬合profile,運行時便是2個pass
  • 后處理:基於屏幕的模糊,且僅用兩個pass(橫向、縱向)去實現模糊,時間復雜度 O(n^2)=>O(2*n)
  • 性能更優,但精確度不夠

Burley Normalized SSS:

  • 基於 Burley Normalize Diffusion
  • 后處理:基於屏幕的模糊,使用2D卷積
  • 精確度更好,但性能開銷更大

Both:

  • 尚未看完源碼,還不清楚怎么將這兩種技術結合的

Nvidia 方案 [SIGGRAPH 2021]

Realistic Digital Human Rendering with Omniverse RTX Renderer,基於 Participating Media 着色模型。

image-20211129113728027

Nvidia 的實現中,主要基於以下幾點:

  • 通過散射系數來決定距離采樣
  • 沒有使用 NEE
  • Single-sample spectral MIS
  • Phase 函數使用各向異性 HG 函數(mean cosine is currently non-spectral)
  • 輸入、射出介質表面時,使用 Lambertian BTDF
  • 對藝術家調參友好,支持 diffuse color 來反向計算出 單散射 albedo

實際效果:

image-20211201162455216

雜項

下面是一些可能可以參考的小方案。

皮膚 specular lobe [Unreal]

單一的 Cook-Torrance lobe 可能不夠體現皮膚的 specular lobe,可以采用 雙鏡葉高光(Dual Lobe Specular),即兩個 Cook-Torrance 的 BRDF lobe 按一定比例混合:\(Lobe1⋅0.85 + Lobe2⋅0.15\)

img

改進的 AO [Unreal]

AO 可能意味着被周圍的皮膚遮擋住了環境光,但實際上這些周圍的皮膚也可能會貢獻反射或投射的光照。因此 AO 可以混合 bleed color(通常取紅色),讓皮膚遮蔽處深黑偏紅一些,皮膚暗處的亮度和顏色更真實美觀。

202111261654242

薄物體透射 [Unity] [SIGGRAPH 2018]

圖片1

為了實現薄物體的透射(BTDF)效果,可以這么做:

  • Thickness Map:專門用於記錄物體厚度的紋理
  • Shadow Thickness:兩層shadow 分別記錄最遠、最近深度來表示物體厚度
  • 結合兩種方案,使用 \(max(textureThickness,shadowThickness)\)

參考文獻

施工中


免責聲明!

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



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