實時&離線面板渲染技術(Real-time&Offline Skin Rendering)
- 現實面板模型
- BSSRDF 渲染模型 [2001]
- Diffusion Profile(擴散剖面)[2001]
- 基於模糊的 SSS 方法
- Participating Media 渲染模型
- Phase 函式
- Random Walk SSS(Volumetric Path Tracing)
- 工業實現方案
最近在做一個數字人渲染DEMO,本部落格將用於記錄蒐集到的 Skin Rendering 技術,持續更新中。
現實面板模型
在渲染面板時主要關注以下光照路徑:
- 鏡面反射:6%入射面板的光被面板最上層油脂菲涅爾反射
- 實現例子:Dual Specular BRDF
-
次表面散射(Subsurface Scattering,SSS):94% 的光進入面板次表層,在圍繞進入點的 3D 鄰域中返回和離開表面。現實的面板介質是多層的,而較物理的渲染一般建模成至少兩個不同的層。散射路徑還可進一步細分為單次散射和多次散射的路徑:
- 單散射:在介質內部只散射了一次的光照貢獻,與光線角度相關性大
- 多散射:在介質內部散射了2次或更多次的光照貢獻(也是diffuse現象的主要來源,而面板主要貢獻便是多散射)
- 實現例子:BSSRDF
-
透射 [可選]:對於較薄的物體(如耳朵邊緣、鼻子邊緣),光射入的平面和射出的平面很可能是不一樣的。實際上如果次表面散射的路徑實現的足夠物理,自然而然也會包含透射現象,因此該光路是可選的
- 實現例子:BTDF with Thickness Map & Shadow Thickness
BSSRDF 渲染模型 [2001]
光線進入 shading point 周圍的畫素後經過在散射介質內部的隨機遊走(Random Walk),可能會從 shading point 射出。但 SSS 的光線在散射介質中的遊走行為難以模擬,為了達成實時渲染的效能要求,便有了以下思路:
- 提供一個類似於 BRDF 的函式(也就是 BSSRDF),但輸入引數從4D(入射方向、出射方向)變成了8D(入射點位置、入射方向、出射點位置、出射方向)
- 太遠的畫素對 shading point 的散射光貢獻極小,因此可以忽略它們,只對一定範圍內的表面 A 進行積分
圖左是 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)\)
其實就是一個記錄了 BSSRDF 答案的二維 LUT ,輸入引數是單散射的albedo和距離。
實際上 Diffusion Profile 就是預計算散射光線在介質內部的 Random Walk 行為,然後做成 LUT 以供 BSSRDF 快速查詢結果,從而達成實時渲染的效能需求。
常見有計算 Diffusion Profile 的方法:
- 偶極子(Dipole)[2002]
- 多級子(Multipole)[2005]
- 高斯和(Sum-of-Gaussians)擬合 [2007]
- Burley Normalized Diffusion 擬合 [2015]
偶極子 [2002]
將 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)}}\)
漫反射近似:假設兩次及以上的散射事件導致了光分佈的均勻,因此這部分散射視為漫反射。使用偶極子來表示入射光源分佈,上面為正的真實光源,下面為負的虛擬光源。
仍然採用蒙特卡洛方法,取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}\)
偶極子方法實在太老而且極子部分涉及的物理知識完全沒學過,沒什麼參考價值還是跳過把。
高斯和 [2007]
用若干個高斯函式去擬合 Diffusion Profile:
- 1個高斯函式可以很好擬合多散射效果,但無法擬合單散射+多散射
- 2個高斯函式可以勉強擬合單散射+多散射
- 6個高斯函式可以得到相當高精度的擬合效果
Burley Normalized Diffusion [2015]
放棄物理,直接擬合。
- 開銷低,精確度卻相當逼近基於蒙特卡洛暴力積分的無偏解
- CDF 有解析解,可進行重要性取樣優化
\(R_{d}(r)=\frac{e^{-r / d}+e^{-r / 3 d}}{8 \pi d r}\)
基於模糊的 SSS 方法
紋理空間模糊(Texture Space Blur) [2003]
-
渲染任何陰影貼圖
-
渲染拉伸校正貼圖(可以是預先計算的)
-
渲染輻照度紋理
-
紋理模糊:
- 卷積核的權重:由高斯和擬合的 Diffusion Profile 確定
- 卷積核的半徑:由拉伸矯正貼圖提供半徑拉伸係數
- 對每個高斯核進行可分離的模糊 Pass,並儲存對應高斯卷積紋理
-
在 3D 中渲染網格:
- 訪問每個高斯卷積紋理併線性組合
- 為每個光源新增鏡面反射
螢幕空間模糊(Screen Space Blur) [2009]
- 只需要對螢幕中 Stencil 標記過的 Skin畫素進行若干卷積操作,極大地降低了 Blur 的畫素數目
- 卷積核的大小:根據當前畫素的深度 z(x,y) 及其深度兩個方向的導數來確定
Pre-Integrated Skin(預積分的面板著色)[2010]
Pre-Integrated Skin 是一個遠遠脫離物理基礎的演算法,其特點主要是高效、簡單、視覺可接受
核心思路:
- 預先對紋理進行卷積,而不用執行時卷積。
- 查詢表的引數分別是dot(N,L)和曲率,這兩者結合就可以反映出光照隨著曲率的變化。
Separable SSS(可分離的次表面散射)[2015]
BSSRDF 實質就是進行一次2D卷積運算,可分離的卷積核就是在尋找一個可分離的核來表示的 Diffusion Profile 的近似,然後轉成兩個1D 卷積 Pass ,讓時間複雜度從O(n^2)=>O(n)
如圖,先經過一次 X 方向的卷積 Pass ,再經過一次 Y 方向的卷積 Pass 就能得到相當於 2D 卷積的效果,最後再新增 Specular 就能得到很好的 SSS 材質效果。
注:不可以先新增 Specular 再進行卷積,不然會出現明顯的 aritifact (例如高光處被卷積成十字形狀)
- 高斯和函式的卷積核:傳統擬合方法;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\) 可分(相當於假設平面曲率為0),然後根據下列公式推導,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) = ((E * a_p)*a_p)(x, y)\)
具體實現 :
- 需提前有一份較精確的 diffusion profile(如6個高斯和擬合成的 \(R_d\) 函式),然後對 \(R_d\) 進行預先卷積(對距離的積分)得到 \(a_p(offset)\) 函式,換句話說就是一張一維表(輸入一個 \(offset\) 值,輸出一個 \(a_p\) 值)
- 在具體實現中,則使用若干個 sample 來取代這張一維表,規定好每個sample 的 offset 值 和計算出對應的 \(a_p\) 輸出值
- 將這個 sample list 傳給 shader,讓 shader 根據這些配置好的 sample 進行兩次 1D 卷積 Pass
注:即使E實際不可分,作者認為預計分可分離核的使用效果仍然足以接受,因此目前仍廣泛適用於各類實時BSSRDF面板渲染上
額外處理工作:
-
抖動 Jittering:paper 使用的一個可分核的擴散近似,在入射輻射度發生高頻變化的地方會產生人工痕跡。這是因為訊號的空間佔用(尺寸)比核的寬度更小,從而產生不對稱的星形圖案。因為本文使用的近似核不是完全經向對稱的
- 對1D過濾器作用一個隨機旋轉(逐個畫素)
- 這種方式不需要對進行重新預積分,因為核的寬度並沒有變化
- 為了減少計算負荷,作者只對靠近畫素的取樣進行處理(10%),增加區域可以取得更好的效果,看下圖區別:
- 核的寬度:卷積核的尺寸受一個於深度相關的拉伸因子
\(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 渲染模型
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}\)
\(\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
- Volumetric Photon Mapping
- 等等
圖左是 BSSRDF 渲染模型做的,圖右是Participating Media 渲染模型做的
Phase 函式
phase 函式表示了每對傳入傳出方向的能量分配概率。
各向同性 Phase
相當多的次表面散射的擴散模型假設各向同性,不捕獲各向異性散射。這樣簡化的各向同性 phase 函式:
\(p=\frac{1}{4\pi}\)
各向異性 Phase
常用的各向 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-infinte slab)的情況下,可以有很好的效果。而 MC 方法才能表現出物理正確,尤其在面板邊緣處(例如鼻子邊緣、耳朵邊緣)更加符合現實。
圖左是 normalized diffusion,圖右是 path-traced SSS
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\)
Subdivision Next-Event Estimation,SNEE [2016]
- Subdivision Next-Event Estimation for Path-Traced Subsurface Scattering [2016]
傳統的遊走路徑最終的 BTDF 可能很難打在光源上(圖左),而SNEE的主要想法是通過一條額外的子路徑來滿足折射規律的情況下還能直接打到光源上。
取樣邊界頂點 \(x_k\),兩個取樣子路徑:
- 一個從光源出發的自頂向下路徑(NEE)
- 一個根據 Phase 函式分佈的自底向上路徑(正常的 Phase 函式分佈取樣)
不同散射介質適用不同的nee技術:
- 高密度介質,如面板, 僅需要在最後一個點做NEE
- 對於低一些密度的介質,例如水或者液體,需要在內部每個遊走點(單散射的)做NEE,並且使用 transparent shadows 來通過幾何
- 對於散射介質含內部表面,如眼球,可以使用MNEE產生焦散,隨著在介質的透射距離而減弱
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(λ)\) 的概率,所謂吞吐量其實就是通道的貢獻度,貢獻度越高的通道更容易被選取
-
RGB三種波長的消散係數往往是不同的(transimittance是不同的),例如面板介質中的紅光比其他波長傳播得更遠
方向性取樣
- 假設各向同性時,無重要性
- 假設各向異性時,根據 Phase 函式分佈做重要性取樣(面板介質的 g 引數大約是0.8)
Dwivedi Sampling
- 根據介質厚度“bias”一下采樣來增加 random walk 返回到入射平面或者從另一個出射平面射出的機會,從而加速收斂
- 需要先通過一個探測射線來估計物體厚度,而且需要將該物體假設為曲率為0的平板物體
將這些取樣方法通過 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 公式(即散射傳播距離與剩餘光子率的關係)改成非指數的公式,引數更好控制,對藝術家友好
工業實現方案
Nvidia 方案 [Siggraph 2021]
Realistic Digital Human Rendering with Omniverse RTX Renderer,基於 Participating Media 渲染模型。
Nvidia 的實現中,主要基於以下幾點:
- 通過散射係數來決定距離取樣
- 沒有使用 NEE
- 僅單次取樣的 spectral MIS(Single-sample spectral MIS)
- Phase 函式使用各向異性 HG 函式(mean cosine is currently non-spectral)
- 輸入、射出介質表面時,使用 Lambertian BTDF
- 對藝術家調參友好,支援 diffuse color 來反向計算出 單散射 albedo
實際效果:
UE4 方案 [Metahuman]
Skin Pipeline
- 幾何處理 Pass:根據各種貼圖及某些混合計算方式來算出每個畫素點的 BaseColor、Specular、Roughness、Normal 等屬性(G-Buffer)
- Lighting Pass:根據光源到表面的 diffuse transmission 和表面的 BaseColor 等屬性計算出該畫素點的 diffuse radiance
- SSS Pass:使用 Separable SSS/Burley SSS/Both 實現基於螢幕空間的模糊
- 其它 Pass:
- 增加高光效果,即 Dual Specular
- 改進的 SSAO
- 其他後處理效果
面板毛孔
面板毛孔及其它面板表面細節導致了面板的各向異性,對於不同的地方應該有不同的specular、roughness等引數,一般是混合額外的細節貼圖,這樣就可以增加鏡頭很近時的面板細節
- Specular:微觀高光度貼圖,與全域性specular混合
- Roughness:微觀粗糙度貼圖,與全域性roughness混合,此外還通過Fresnel節點加強了角色視角邊緣的粗糙度
- Normal:微觀法線貼圖,主法線與微觀法線按一定比例混合規範化
接近物理真實的渲染:\(cavity \cdot Specular(gloss) \cdot Fresnel(reflectance)\)
近似渲染: \(Specular(gloss) \cdot Fresnel(cavity \cdot reflectance)\)
cavity是凹陷度,可從cavity map(下圖)中取樣獲得;Specular(gloss) 表明高光項;Fresnel(reflectance) 是與視覺角度相關的反射
面板反射
-
直接反射:採用 雙鏡葉高光(Dual Lobe Specular),即兩個 Cook-Torrance 的 BRDF Lobe 按一定比例混合:\(Lobe1⋅0.85 + Lobe2⋅0.15\)
-
間接反射:Specular IBL
BSSRDF 渲染
Separable SSS:
- 通過6個高斯和預計算profile,再用預積分的可分離核去近似擬合profile,執行時便是2個pass
- 後處理:基於螢幕的模糊,且僅用兩個pass(橫向、縱向)去實現模糊,時間複雜度 O(n^2)=>O(2*n)
Burley Normalized SSS:
- 基於 Burley Normalize Diffusion
Both:
- 尚未看完原始碼,還不清楚怎麼將這兩種技術結合的
改進的 SSAO
- AO 貼圖混合了Bleed Color(面板通常取紅色),使得面板渲染更加貼切,面板暗處的亮度和顏色更真實美觀
Unity 方案 [Siggraph 2018]
薄物體透射
- Thickness Map:專門用於記錄物體厚度的紋理
- Shadow Thickness:兩層shadow 分別記錄最遠、最近深度來表示物體厚度
- 結合兩種方案,使用 \(max(textureThickness,shadowThickness)\)
作者:KillerAery
出處:http://www.cnblogs.com/KillerAery/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。