【GPU精粹與Shader編程】(六) 《GPU Gems 3》:真實感皮膚渲染技術總結

 

         本文由@淺墨_毛星雲 出品,首發於知乎專欄,轉載請註明出處  

         文章鏈接: https://zhuanlan.zhihu.com/p/42433792

 

本文是【GPU精粹與Shader編程】系列的第六篇文章。

《GPU Gems 3》中的“Chapter 14. Advanced Techniques for Realistic Real-Time Skin Rendering”一文,自其問世以來,都是皮膚渲染領域經常會被參考到的主要文章,可謂皮膚渲染技術的集大成者,奠基之作。

本文正好藉着系列文章對《GPU Gems 3》中此章節進行提煉總結的機會,對真實感皮膚渲染技術,進行一個系統的總結和提煉。

除了對《GPU Gems 3》中該篇文章本身內容的提煉,本文也會在其基礎上,結合這些年真實感皮膚渲染技術的發展,聊一些更多的東西。希望能對當前業界真實感皮膚渲染技術的現狀與發展,做一個較爲全面系統的總結與提煉。

 

一、總覽:皮膚渲染技術發展史

 

按時間分佈,近20年皮膚主流渲染技術的發展可以總結列舉如下:

  • 次表面光照傳輸模型(Subsurface Light Transport, SSLT)[2001]
  • 擴散剖面(Diffusion Profile) [2001]
  • 偶極子(dipole) [2001]
  • 紋理空間模糊(Texture Space Blur)[2003]
  • 多極子(multipole) [2005]
  • 屏幕空間模糊(Screen Space Blur)或屏幕空間次表面散射(SSSSS,Screen Space SubSurface Scattering)[2009]
  • 路徑追蹤次表面散射(Path-Traced Subsurface Scattering)與光線步進(Ray Marching)[2009]
  • 預積分的皮膚着色(Pre-Integrated Skin Shading)[2010]
  • 可分離的次表面散射(SSSS,Separable Subsurface Scattering)[2015]

需要注意的是,上面列出的時間點,可能並不是嚴格意義上的該技術提出的時間點,而是該技術在論文或會議上被提出,被大衆熟知,被引入到皮膚渲染技術中的時間點。

接下來,先看一些近年遊戲中的真實感皮膚渲染畫面,然後讓我們從皮膚渲染的基礎理論開始講起,對上面列出的近20年皮膚主流渲染技術,按流派和內容分別進行介紹。

 

 

二、近年遊戲與渲染業界中的真實感皮膚渲染畫面

 

首先是一個《孤島驚魂5》中的演示視頻(預渲染),有不少人覺得渲染出的畫面已經和真人出演的美劇非常相似,主要注意視頻中人物的皮膚渲染表現:

https://www.youtube.com/watch?v=4W450G_UR1Q

OK,來看一些近幾年,遊戲中真實感皮膚渲染的典型效果圖。

從《孤島驚魂5》開始:

 

圖《孤島驚魂5》中的皮膚渲染

圖《孤島驚魂5》中的皮膚渲染

 

《神祕海域4》:

圖 《神祕海域4》中的皮膚渲染

圖 《神祕海域4》中的皮膚渲染

 

《底特律:變人》:

圖 《底特律:變人》中的皮膚渲染

圖 《底特律:變人》中的皮膚渲染

 

當然,怎麼都不能少了今年的熱門 UE4的Siren:

圖 數字人Siren的皮膚渲染 @UE4

圖 數字人Siren的皮膚渲染 @UE4

 

 

三、皮膚渲染基礎理論

 

皮膚的渲染一直是渲染領域的難點之一:皮膚具有許多微妙的視覺特徵,而觀察者對皮膚的外觀,特別是臉部的外觀會非常敏感。皮膚的真實感渲染模型須包括皺紋,毛孔,雀斑,毛囊,疤痕等細節的模擬,而真實還原人體皮膚上的這些細節則是一個較大的挑戰。

皮膚作爲一種屬性複雜的材質,其物理結構由多層結構組成,其表面油脂層主要貢獻了皮膚光照的反射部分,而油脂層下面的表皮層和真皮層則主要貢獻了的次表面散射部分。實驗測試表明,光線接觸到皮膚時,有大約94%被皮膚各層散射,只有大約6%被反射。

 

圖 多層皮膚結構

對於皮膚而言,圖形學研究學者們已經制作了使用多達五個獨立層[Krishnaswamy and Baranoski 2004]的非常細緻的模型,用於描述皮膚中的光學散射現象,而真正的皮膚則更加複雜。在醫學上,僅皮膚表皮(epidermis)即被認爲包含五個不同的層[Poirer 2004]。在這種複雜性下對散射進行模擬可能是過度和沒有必要的,但是真實的渲染需要在油質層下面建模至少兩個不同的層,因爲至少有一個層要用於鏡面反射(specular)項。Donner和Jensen[Donner and Jensen 2005]在2005年證明了單層模型不足以對真實感皮膚進行渲染,並展示了使用三層建模的改進方案。

圖 多層皮膚模型

因爲其具有半透明屬性光線會在皮膚的表層進行多次散射,散射根據其通過的路徑衰減,簡單來說就是光線會擴散到周圍,這對於表現皮膚的質感起到很大作用。

一般的材質採用BRDF(bidirectional reflectance distribution function)可以很好的表達,但皮膚往往需要更加複雜的建模,如BSSDF。

圖 多層皮膚對光的散射和吸收

經驗表明,皮膚渲染的渲染過程可由兩個分量組成:

  • 鏡面反射(specular reflection)
  • 次表面散射(subsurface scattering)

下文將對上述兩個分量分別進行說明。

 

3.1 鏡面反射(specular reflection)

 

鏡面反射項(specular reflection)相對而言很簡單,Gems 3中推薦Kelemen and Szirmay-Kalos specular BRDF用於皮膚鏡面反射項的計算。因爲Kelemen and Szirmay-Kalos specular BRDF在實現和Torrance-Sparrow模型一樣的渲染效果時,計算量要小得多。而現階段基於物理的一些其他高光模型或改進方案也應該會得到不錯的效果。

 

3.2 次表面散射(Subsurface Scattering)

 

3.2.1 半透明材質與次表面散射(Translucent and Subsurface Scattering)

 

首先,半透明材質在生活中無處不在:樹葉、紙、蠟燭、牛奶、布料、生物的皮膚、貝殼、瑪瑙等。事實上,幾乎所有非金屬物體都存在一定程度的次表面光傳輸(Subsurface Light Transport,SSLT)現象[Pharr 2010],皮膚猶是如此。

上文提到,皮膚是一個多層結構,其表面油脂層主要貢獻了皮膚光照的反射部分(約佔入射光中的6%),而油脂層下面的表皮層和真皮層則主要貢獻了次表面散射部分(約佔入射光中的94%)。任何沒有直接從皮膚表面反射出去的光,都會直接進入次表面層。這種佔主要主導因素的次表面散射屬性,決定了皮膚半透明的特徵以及柔軟的視覺外觀。

入射光與皮膚進行交互的過程中,被部分吸收(獲取顏色)並經過多次散射,返回並從進入點周圍的3D鄰域處表面離開。而有時光線會完全穿過像耳朵這樣的薄薄區域,形成透射(Transmittance)。

 

圖 多層皮膚對光的散射和吸收

對於次表面散射而言,Jensen在2001年的論文《A Practical Model for Subsurface Light Transport》是次表面材質建模最重要的一篇論文,推導了許多重要的物理公式,計算模型,渲染時的參數轉換,以及測量了許多生活中常見材質的散射係數等等。大部分後來的論文都是在基於這篇文章中的理論的一些提升。

 

3.2.2 BRDF與BSSRDF

 

模擬半透明物體的方法有很多,例如Volumetric Path Tracing,Volumetric Photon Mapping和BSSRDF。

其中,BSSRDF(Bidirectional Surface Scattering Reflectance Distribution Function,雙向表面散射反射分佈函數)是目前的主流技術。

簡單來說,傳統的 BRDF 模型是 BSSRDF的一種簡化。BSSRDF和BRDF的不同之處在於,BSSRDF可以指定不同的光線入射位置和出射的位置。

圖: BRDF和BSSRDF與皮膚交互,光散射的對比

對於BRDF模型來說,一次反射光照的計算是在光線交點的法線半球上的球面積分。而對於BSSRDF來說,每一次反射在物體表面上每一個位置都要做一次半球面積分,是一個嵌套積分。

其中BSSRDF的定義是:

R_d 只接受一個標量參數,這個參數的意義是光線入射位置和初設位置的曼哈頓距離。直觀的理解就是,BSSRDF嘗試將光線在物體表面內部中數千次的散射後所剩餘的能量用一個基於入射點和出射點之間距離的函數去近似只接受一個標量參數,這個參數的意義是光線入射位置和初設位置的距離。也就是說,BSSRDF嘗試將光線在物體表面內部中數千次的散射後所剩餘的能量用一個基於入射點和出射點之間距離的函數去近似。這個近似則是基於幾個假設:

1. 次表面散射的物體是一個曲率爲零的平面

2. 這個平面的厚度,大小都是無限

3. 平面內部的介質參數是均勻的

4. 光線永遠是從垂直的方向入射表面。

正因爲有這些假設,所以很容易把出射光的強度與出射點和入射點之間的距離用一個函數去近似。而真實的模型往往比理想中要複雜的多,光線也有可能從各個角度入射,因此通過BSSRDF渲染的結果會有一定誤差。

R_d 的求解非常複雜,通過近似可以得到,具體過程如下:

,有了 \phi (x) 可以得到 R_d(x)

其中 r=||x_s-x_i|| ,可以看出和自然指數相互聯繫。

 

 

3.2.3 BTDF與透射(Transmittance)

 

有時光線會完全穿過像耳朵這樣的薄薄區域。這是因爲,光線經過一部分次表面後,最終沒有在入射側進行出射,而是從入射側另一側透出來,形成透射(Transmittance)。透過光的手會產生桔紅色視覺外觀同理。

圖 透射(Transmittance)的圖示

 

圖 透過光的手會產生桔紅色視覺外觀

透射一般可以通過BTDF(雙向透射分佈函數, Bidirectional Transmittance Distribution Function)來描述。

這裏先對幾種分佈函數的全稱進行列舉:

  • BRDF(雙向反射分佈函數,Bidirectional Reflectance Distribution Function)
  • BSSRDF(雙向表面散射反射分佈函數, Bidirectional Surface Scattering Reflectance Distribution Function)
  • BTDF(雙向透射分佈函數, Bidirectional Transmittance Distribution Function)
  • BSDF(雙向散射分佈函數,Bidirectional Scattering Distribution Function)

作爲講解內容,之前有一篇文章(https://zhuanlan.zhihu.com/p/27014447)關於BRDF、BTDF、BSDF的描述非常精煉,這邊直接引用到本文中來。

當光線從一種介質射向另外一種介質時,根據其行進路線,可以被分爲兩個部分:

  • 一部分光線在介質交界處發生了反射, 並未進入另外一種介質。
  • 另外一部分光線則進入了另一種介質。

其中:

  • BRDF:反射部分的光照的輻射亮度(radiance)和入射光照的輻射照度(irradiance)的比例是一個和入射角度、出射角度相關的函數,這個函數就被稱之爲雙向反射分佈函數(BRDF)。
  • BTDF:相應的,穿越介質的那部分光照的輻射亮度和輻射照度的比例就被稱之爲雙向透射分佈函數(BTDF)。
  • BSDF:上述兩部分出射光的輻射亮度總和和入射光的輻射照度的比例就被叫做雙向散射分佈函數(BSDF),即BSDF = BRDF + BTDF。

圖 BSDF = BRDF + BTDF

透射的實現思路比較直觀,可以分爲三步:

(1)計算光照在進入半透明介質時的強度

(2)計算光線在介質中經過的路徑長度

(3)根據路徑長度和BTDF來計算出射光照的強度,這裏BTDF可以簡化爲一個只和光線路徑長度相關的函數

另外,《GPU Gems 3》中,有提到通過改進半透明陰影貼圖(Translucent Shadow Maps,TSMs)來實現皮膚渲染中透射效果的模擬,下文中也有一些更詳細的簡略說明。

 

3.2.4 關於BRDF、BSSRDF、BTDF、BSDF的關係

另外,下面的這張PPT,能很好地解釋BRDF、BSSRDF、BTDF、BSDF的關係。

圖 BRDF、BSSRDF、BTDF、BSDF的關係

 

下面用一些補充說明,理清幾者的關係。

如上圖,光線從一種介質射向另外一種介質時,有反射,次表面散射、透射三種交互形態:

  • 其普通反射的行爲用BRDF描述
  • 其次表現散射的行爲用 BSSRDF描述
  • 其透射的行爲用BTDF描述

四者的聯繫:

  • 總體來說,BRDF 爲 BSSRDF 的一種簡化
  • BSDF可分爲反射和透射分量兩部分,即BSDF = BRDF + BTDF

 

 

四、擴散剖面(Diffusion Profile)

 

擴散剖面(Diffusion Profile),是早年間渲染次表面散射比較熱門的大方向。

首先,需要說明一下關於Diffusion Profiles這個詞翻譯相關的問題。按Diffusion Profiles其含義,可被譯作擴散剖面,也可以被譯作漫散射剖面、漫射剖面。(Diffusion Profiles目前還沒有比較公認和共識的翻譯,大多數文章中都直接使用英文原詞組,上述翻譯僅供參考。文章後文儘量會統一使用“擴散剖面”作爲Diffusion Profiles的翻譯)另外,有些文獻中會將Diffusion 寫作Diffuse Scattering,他們都是表示漫散射,或一種光線在材質內部擴散的現象。

簡而言之,擴散剖面(diffusion profile)是描述光線如何在半透明物體中進行擴散和分佈的函數。

擴散剖面(diffusion profile),相當於一個記錄次表面散射細節的“地圖”。你可以將其理解爲一個LUT,一個記錄了答案的索引,或者一張標記高度的“高度圖”,他會告訴你什麼地方的像素,應該進行什麼程度的模糊。

也有文章指出,可以簡單理解擴散剖面爲一張權重查找表,不同的皮膚渲染方法,通常就是對擴散剖面的不同近似。

需要說明的是,與擴散剖面(diffusion profile)的概念往往一起出現的偶極子(Dipole)方法,多級子(Multipole)方法,高斯和(Sum-of-Gaussians)方法,都是更好地描述出擴散剖面(Diffusion Profiles)的一些策略。

對於一個平面來說當激光垂直照射它時會發現光擴散到周圍,形成以照射點爲中心的光暈,如果物體的材質各項均勻其散射行爲和角度無關,我們就可以用一個一維函數來描述,對於不同的材質RGB根據距離衰減的行爲是不一樣的。擴散剖面(diffusion profile)就是用來描述光在物體內部的擴散(散射)行爲。

具體來說,擴散剖面(diffusion profile)提供了光在高度散射的半透明材質表面下散射方式的近似。具體而言,它描述了以下簡單實驗的結果。

在暗室中使用非常薄的白色激光束照亮一個平坦的表面。我們將看到激光束照射到表面的中心點周圍的光暈,因爲一些光線在表面下方並在附近返回,如下(a)所示。

擴散剖面(diffusion profile)告訴我們有多少光作爲角度和激光中心距離的函數出現。 如果我們只考慮均勻材質,則散射在所有方向上都是相同的,即散射行爲和角度無關。

而每種顏色都有自己的剖面,我們可以將其繪製成一維曲線,如下圖(b)所示。

圖 可視化擴散剖面(diffusion profile)

另外值得注意的是,RGB擴散的範圍是不一樣的,即擴散剖面具有很強的顏色相關性:紅光比綠色和藍色散射得更遠。而正因爲紅色擴散得更遠一些,所以耳朵和鼻子的部位通常會更有紅彤彤的感覺。

時間方面,在2001年,Jensen 等人提出的散射模型[Jensen et al.2001]基於幾種材質屬性引入了擴散剖面,奠定了此流派的基礎。並提出了使用偶極子(dipole)方程計算出擴散剖面的思想。

該方法簡單地使用表面上兩點之間的空間距離r來評估擴散剖面。其決定了任何兩個位置之間的漫散射的描述問題,且無論兩者之間的幾何形狀如何,如下圖所示。

圖 用r進行曲面中漫散射(diffusion)的有效估算

給定幾種屬性,可以使用偶極子(dipole)方程計算出擴散剖面。而偶極子(dipole)也是較爲常見的評估擴散剖面的方法。而有些文獻中提到的偶極子剖面(Dipole Profiles),即是用偶極子(dipole)來表示的擴散剖面(diffusion profile)。

圖 將入射光線轉換爲偶極子源以進行漫散射的近似[Jensen 2001]

我們可以將擴散剖面用R(r)表示。一般而言,所有材質都存在次表面散射現象,區別只在於其密度分佈函數R(r)的集中程度,可分爲兩種情況:

(1)如果該函數的絕大部分能量都集中在入射點附近(r=0),就表示附近像素對當前像素的光照貢獻不明顯,次表面散射現象不明顯,可以忽略,則在渲染時我們就用漫反射代替。

(2)如果該函數分佈比較均勻,附近像素對當前像素的光照貢獻明顯,次表面散射現象明顯,則需要單獨計算次表面散射。

據此次表面散射的計算可以分爲兩個部分:

(1)對每個像素進行一般的漫反射計算。

(2)根據擴散剖面(diffusion profile)和(1)中的漫反射結果,加權計算周圍若干個像素對當前像素的次表面散射貢獻。

 

4.1 多級子(Multipole)方法

 

上文提到,與擴散剖面(diffusion profile)概念往往一起出現的偶極子(Dipole),多級子(Multipole),高斯和(Sum-of-Gaussians),都是更好地描述出擴散剖面(Diffusion Profiles)的一些方案。

2005年,Donner and Jensen通過論文《Light Diffusion in Multi-Layered Translucent Materials》[Donner and Jensen 2005]將多極子(multipole)引入擴散剖面(diffusion profiles),來解決多層半透明材質中的次表面散射的渲染問題。

需要知道的是,多極子是偶極子概念的推廣。在物理學中,對於含有2\^n個大小相等的點電荷,其中正負各半數,排列成有規律的點陣。n=0時,稱爲點電荷;n=1,稱爲偶極子(Dipole);n=2,稱爲四極子;n≥2,統稱爲多極子(Multipole)。

圖 半無限幾何圖形的偶極子配置(左)和薄材質的多極子配置(右)[Donner 2005]

關於多極子擬合擴散剖面(diffusion profile)的具體方法,可見論文《Light Diffusion in Multi-Layered Translucent Materials》。http://jbit.net/~sparky/layered.pdf

 

4.2 高斯和的擴散剖面(Sum-of-Gaussians Diffusion Profile)

 

不難發現,對擴散剖面繪製的輪廓線類似於衆所周知的高斯函數e^-r2,如下圖。雖然單個高斯分佈不能精確地擬合任何擴散分佈,但實踐表明多個高斯分佈在一起可以對擴散剖面提供極好的近似。因此我們可以通過高斯函數來擬合擴散剖面(diffusion profile)。

圖 可視化擴散剖面(diffusion profile)

高斯函數表達式具有一些很好的特性,在當我們將擴散剖面表示爲高斯和時,可以讓我們非常有效地求解次表面散射。高斯函數是獨特的,因爲它們同時是可分離的和徑向對稱的,並且它們可以相互卷積來產生新的高斯函數。

這需要從偶極子或基於多極子的擴散剖面映射到高斯和。

對於每個擴散分佈R(r),我們找到具有權重w i和方差v i的k個高斯函數:

我們爲高斯函數的方差v選擇以下定義:

選擇常數1/(2v)使得G(v,r)在用於徑向2D模糊時不會使輸入圖像變暗或變亮(其具有單位脈衝響應(unit impulse response))。

下圖顯示了擴散剖面(diffusion profile)(用於大理石中綠光的散射)和使用兩級和四級高斯和的近似剖面。

我們使用[Jensen et al. 2001]中提出的散射參數:

圖 用多個高斯和擬合偶極子剖面(Dipole Profile)

從上圖可以看出2個高斯函數和的Profile的誤差較大,而4個高斯和已可以可以很好的逼近Profile。上述的四級高斯和爲:

R(r) = 0.070G(0.036, r) + 0.18G(0.14, r) + 0.21G(0.91, r) + 0.29G(7.0, r)

 

那麼,如何確定這幾個高斯函數的權重和方差?

這是一個很經典的問題,即給定一條曲線,如何用多項式或者三角函數去擬合。

自己求解是十分費事的事情,對於經典的問題往往有現成的工具可以直接運用,不用重複造輪子。文章(http://gad.qq.com/article/detail/33372)提到,Matlab有一個曲線擬合功能即可滿足我們的要求,詳見https://cn.mathworks.com/help/curvefit/gaussian.html

Matlab通過高斯函數擬合最多可以支持8個高斯函數下圖1,而下圖2和圖3是用2個高斯函數進行擬合的例子。

圖 Matlab中多個高斯擬合

 

圖 Matlab中多個高斯擬合

 

圖 通過2個高斯函數擬合曲線的例子

 

4.3 對皮膚的擴散剖面高斯和擬合(A Sum-of-Gaussians Fit for Skin)

 

上一節講到了高斯和的擴散剖面(Sum-of-Gaussians Diffusion Profile),並沒有將其運用於皮膚渲染。本節將講到適於皮膚的高斯和擴散剖面擬合。

對於大部分透明物體像牛奶,大理石一個偶極子剖面(Dipole Profile)足以,但是對於皮膚的這樣多層結構的材質,用一個偶極子剖面(Dipole Profile)不能達到理想的效果。以一層材質配置一個偶極子(Dipole)的思路,通過3個偶極子(Dipole)即可模擬三層皮膚材質。實踐表明,3個偶極子(Dipole)確實可以接近Jensen論文中的根據測量得出的皮膚Profile數據。

而3個偶極子剖面(Dipole Profile)通過前面描述的,對應於單個剖面的4個高斯函數不能得到很好的逼近結果。實踐表明,通過6個高斯函數可以得到很不錯的結果。

同樣地,可以用前面提到的Matlab的擬合功能求解。下圖是通過6個高斯擬合皮膚3層Dipole Profile的RGB對應的衰減,可以看出在紅色比綠色和藍色擴散的遠得多。而得到的擴散曲線如下圖所示。

圖 三層皮膚模型的高斯和參數

圖 適用於三層皮膚模型的高斯和擬合

這裏需要注意的是,對於每個剖面,高斯項的權重和爲1.0。這是由於我們是用一個漫反射顏色貼圖來定義皮膚的顏色,而不是用一個與之相符的漫反射剖面。通過對這些剖面進行歸一化來得到白色的漫反射顏色,確保在散射入射光之後,平均結果能保持白色。然後,將此結果乘以基於圖像的顏色貼圖以獲得膚色的色調即可。

 

五、常規基於模糊的次表面散射方法

 

上文提到,擴散剖面(diffusion profile)是描述光線如何在半透明物體中進行擴散和分佈的函數。

得到擴散剖面(diffusion profile),即光線是如何在半透明物體中進行擴散和分佈之後,接下來就可以對附近的像素進行加權求和,以模擬次表面散射的效果。

這個求和的過程其實是根據擴散剖面(diffusion profile)的指導,對周圍像素進行模糊操作。按操作空間劃分,比較常規的思路有兩種:

  • 紋理空間模糊(Texture Space Blur)
  • 屏幕空間模糊(Screen Space Blur)

下面分別對其進行說明。

 

5.1 紋理空間模糊(Texture Space Blur)

 

紋理空間漫散射(Texture-Space Diffusion),也常被稱作Texture Space Blur(紋理空間模糊)方法,由[Borshukov and Lewis 2003]提出,首次用於進行《黑客帝國》續集中的面部渲染技術,可用於精確模擬次表面散射(subsurface scattering)。

其言簡意賅的思路是利用皮膚中散射的局部特性,通過使用紋理座標作爲渲染座標展開3D網格,在2D紋理中有效地對其進行模擬。

圖 用於進行《黑客帝國》續集中的紋理空間模糊(Texture Space Blur)面部渲染方法

 

GDC 2007有一場來自NVIDIA的talk “Advanced Skin Rendering”

http://developer.download.nvidia.com/presentations/2007/gdc/Advanced_Skin.pdf.)中,其採用Texture Space Blur的技術即爲《GPU Gems 3》中所描述的方案。

該技術在紋理空間做了6次高斯模糊,每一次高斯模糊即爲偶極子(Dipole)近似所採用的高斯模糊的參數,如下圖。Texture Space Blur有一個很嚴重的問題,需要較高的紋理分辨率,這導致每做一次高斯模糊都是很費的操作,更不要說6次高斯模糊。雖然當年這個技術取得的效果很不錯,但是因爲計算量等原因,很少有人實際去採用。

圖 《GPU Gems 3》中改進的紋理空間模糊(Texture Space Blur)算法綜述

紋理空間模糊(Texture Space Blur)進行Combining blurs操作的相關shader源碼如下:

float3 diffuseLight= nonBlur* E1 * pow( diffuseCol, 0.5 );
float3 blur2tap = f3tex2D( blur2Tex, v2f.c_texCoord.xy );
float3 blur4tap = f3tex2D( blur4Tex, v2f.c_texCoord.xy );
float3 blur8tap = f3tex2D( blur8Tex, v2f.c_texCoord.xy );
float3 blur16tap = f3tex2D( blur16Tex, v2f.c_texCoord.xy );
float3 blur32tap = f3tex2D( blur32Tex, v2f.c_texCoord.xy );
diffuseLight+= blur2 * blur2tap.xyz;
diffuseLight+= blur4 * blur4tap.xyz;
diffuseLight+= blur8 * blur8tap.xyz;
diffuseLight+= blur16 * blur16tap.xyz;
diffuseLight+= blur32 * blur32tap.xyz;
// renormalize weights so they sum to 1.0
float3 norm2 = nonBlur+ blur2 + blur4 + blur8 + blur16 + blur32;
diffuseLight/= norm2;
diffuseLight*= pow( diffuseCol, 0.5 );

 

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

 

屏幕空間模糊(Screen Space Blur) [Jimenez et al.2009]也常被稱作屏幕空間次表面散射(Screen Space SubSurfaceScattering)或SSSSS。

圖 基於屏幕空間模糊(Screen Space Blur)的渲染圖

和紋理空間模糊(Texture Space Blur)不同的是,屏幕空間模糊(Screen Space Blur)[Jimenez et al.2009]只需要處理被Stencil標記過的Skin的像素,極大地降低了Blur的像素數目,可以很大程度的提升性能。

該算法計算過程中會對Stencil標記出的皮膚材質進行若干次卷積操作,卷積核的權重由擴散剖面(Diffusion Profile)確定,而卷積核的大小則需要根據當前像素的深度(d(x,y))及其導數(dFdx(d(x,y))和dFdy(d(x,y)))來確定。

圖 屏幕空間模糊(Screen Space Blur)思路概覽

 

圖 屏幕空間模糊(Screen Space Blur)算法流程圖

 

圖 屏幕空間模糊(Screen Space Blur)

 

從原理上來說,圖像空間的方法和屏幕空間的方法很大程度上都是通過周邊像素對當前像素的光照貢獻來實現次表面散射的效果,區別不大,方法之間的區別通常只是在於如何去近似擴散剖面(Diffusion Profile),在性能和效果上有一個較好平衡。

 

六、其他皮膚渲染技術

 

6.1 半透明陰影貼圖(Translucent Shadow Maps,TSMs)

 

《GPU Gems 3》中,通過改進半透明陰影貼圖(Translucent Shadow Maps,TSMs)來實現皮膚渲染中透射效果的模擬。

考慮到紋理空間漫散射(Texture-Space Diffusion)不會很好地模擬在三維空間中非常接近的表面光通過透光區域的完全透射效果(如耳朵和鼻孔處桔紅色的視覺外觀)。《GPU Gems 3》改進了半透明陰影貼圖(Translucent Shadow Maps,TSMs)(Dachsbacher and Stamminger 2004)方法,通過重用卷積過的輻照度紋理,能非常有效地估計通過較薄區域的漫散射。

圖 《GPU Gems 3》中改進的Translucent Shadow Maps思路圖示

 

圖 在陰影區域計算透射光

另外,ShaderX7中的“Real-Time Subsurface Scattering using Shadow Maps”也介紹了類似的使用陰影貼圖(Shadow Maps)來進行次表面散射模擬的方法。

圖 Rendering AAA-QualityCharacters of Project ‘A1’ @ NDC 2016 Programming Session

 

6.2 預積分的皮膚渲染(Pre-Integrated Skin Rendering)

 

預積分的皮膚着色(Pre-Integrated Skin Shading)在《GPU Pro 2》的” Pre-Integrated Skin Shading”一文中正式進入大家的視野。

預積分的皮膚着色(Pre-Integrated Skin Shading),其實是一個從結果反推實現的方案,具體思路是把次表面散射的效果預計算成一張二維查找表,查找表的參數分別是dot(N,L)和曲率,因爲這兩者結合就能夠反映出光照隨着曲率的變化。

圖 預積分的皮膚着色(Pre-Integrated Skin Shading)思路。

【左上:如何使用兩個導數同時繪製曲率的圖示。|右上:通過曲率(球面半徑)和N·L索引的漫反射BRDF查找(The diffuse BRDF lookup)|下:使用該方法新的BRDF查找不同r大小,渲染渲染出的多個球體】

通過下圖可以發現,預積分方法和紋理空間漫散射(Texture-Space Diffusion)的渲染效果在肉眼觀察下看不出太多差別,但預積分的方法計算量卻要小很多。

圖 預積分方法對比紋理空間漫散射(Texture-Space Diffusion)方法

另外,最終幻想15中的人物皮膚渲染,大量用到了預積分的皮膚渲染,如下圖中的希德妮的渲染效果:

圖 基於 Pre-Integrated Skin Shading的《最終幻想15》希德妮渲染圖【(左圖:離線渲染,右圖:遊戲實時渲染】

關於預積分的皮膚渲染(Pre-Integrated Skin Rendering)的更多細節,可見《GPU Pro 2》中的” Pre-Integrated Skin Shading”一文。

 

6.3 SSSS,可分離的次表面散射(Separable Subsurface Scattering)

 

次表面散射(Subsurface Scattering)被稱作SSS,或3S,而可分離的次表面散射(Separable Subsurface Scattering)常被人稱爲SSSS,4S, Separable Subsurface Scattering,是Jimenez等人在2015年提出的新的渲染算法[Jimenez J 2015]。

上文提到,雖然屏幕空間模糊(Screen Space Blur)性能比紋理空間模糊(Texture Space Blur)好很多,但做6個高斯模糊需要12個pass(一個高斯模糊對應一個水平和垂直模糊)。

暴雪的Jorge等人,在GDC 2013,的talk“Next-Generation Character Rendering”(http://www.iryoku.com/images/posts/next-generation-life/Next-Generation-Character-Rendering-Teaser.pptx)中首次展示了SSSS的渲染圖,並在2015年通過論文正式提出了SSSS(可分離的次表面散射,Separable Subsurface Scattering)(http://iryoku.com/separable-sss)其通過水平和垂直卷積2個Pass來近似,效率更進一步提升,這是目前遊戲裏採用的主流技術,Unreal也對其進行了集成。

 

圖 可分離卷積(Separable Convolution)

圖 基於SSSS的皮膚渲染 @GDC 2013 by Activision-Blizzard

圖 基於SSSS的皮膚渲染 @GDC 2013 by Activision-Blizzard

 

圖《Separable Subsurface Scattering》論文中的SSSS渲染圖 @ COMPUTER GRAPHICS forum 2015 by Jorge Jimenez @ Activision-Blizzard

 

6.4 路徑追蹤次表面散射(Path-Traced Subsurface Scattering)與光線步進(Ray Marching)

 

路徑追蹤次表面散射(Path-Traced Subsurface Scattering)也有時被稱作蒙特卡洛次表面散射(Monte-Carlo Subsurface Scattering),區別於傳統的光柵圖形學,是光線追蹤流派下模擬次表面散射的技術,主要是基於Ray Marching的實現方案。

在SIGGRAPH 2017 Course: Physically Based Shading in Theory and Practice課程系列“Volumetric Skin and Fabric Shading at Framestore”(http://blog.selfshadow.com/publications/s2017-shading-course/walster/s2017_pbs_volumetric_notes.pdf)中有一些介紹,不過需要注意,此Course有些血腥,配圖中一些是異形類生物的皮膚渲染。

同樣,NDC 2016 Programming Session中的Rendering AAA-QualityCharacters of Project‘A1’也有一些介紹,相關PPT頁面如下:

圖 Rendering AAA-QualityCharacters of Project ‘A1’ @ NDC 2016 Programming Session

另外一些參考資料也包括:

https://www.cs.rpi.edu/~cutler/classes/advancedgraphics/S11/final_projects/white.pdf

 

6.5 Deferred Single Scattering

 

另外也有結合延遲渲染的方法,具體思路可見如下PPT:

圖 Rendering AAA-QualityCharacters of Project ‘A1’ @ NDC 2016 Programming Session

 

七、本文內容總結

 

以下是本文內容總結,即對當前業界真實感皮膚渲染技術的總結:

1. 皮膚渲染建模

皮膚渲染過程可由兩個分量組成:

  • 鏡面反射(specular reflection)
  • 次表面散射(subsurface scattering)

其中,次表面散射的真實感模擬,是主要難點。

2. 鏡面反射部分

鏡面反射(specular reflection)部分的光照模型可用:

  • Torrance-Sparrow
  • Kelemen and Szirmay-Kalos specular BRDF
  • 基於物理其他高光模型

其中,Kelemen and Szirmay-Kalos specular BRDF在實現和Torrance-Sparrow模型一樣的渲染效果時,計算量要小得多。

3. 次表面散射部分

3.1 擴散剖面(Diffusion Profile)

擴散剖面(diffusion profile)是描述光線如何在半透明物體中進行擴散和分佈的函數。

與擴散剖面常一起出現的三種方法:

  • 偶極子(Dipole)方法
  • 多級子(Multipole)方法
  • 高斯和(Sum-of-Gaussians)方法

它們都是更好地描述出擴散剖面(Diffusion Profiles)的一些策略。得到擴散剖面(diffusion profile),即光線是如何在半透明物體中進行擴散和分佈之後,接下來就可以對附近的像素進行加權求和,以模擬次表面散射的效果。這個求和的過程其實是根據擴散剖面(diffusion profile)的指導,對周圍像素進行模糊操作。

按操作空間劃分,常規的思路有兩種:

  • 紋理空間模糊(Texture Space Blur)
  • 屏幕空間模糊(Screen Space Blur),也稱屏幕空間次表面散射(Screen Space SubSurfaceScattering)或SSSSS。

3.2 其他皮膚渲染技術

  • 半透明陰影貼圖(Translucent Shadow Maps,TSMs)
  • 預積分的皮膚渲染(Pre-Integrated Skin Rendering)
  • 可分離的次表面散射(SSSS , Separable Subsurface Scattering)
  • 路徑追蹤次表面散射(Path-Traced Subsurface Scattering)與光線步進(Ray Marching)
  • Deferred Single Scattering

 

4. 皮膚渲染技術發展史

  • 次表面光照傳輸模型(Subsurface Light Transport, SSLT)[2001]
  • 擴散剖面(Diffusion Profile) [2001]
  • 偶極子(dipole) [2001]
  • 紋理空間模糊(Texture Space Blur)[2003]
  • 多極子(multipole) [2005]
  • 屏幕空間模糊(Screen Space Blur)或屏幕空間次表面散射(SSSSS,Screen Space SubSurface Scattering)[2009]
  • 路徑追蹤次表面散射(Path-Traced Subsurface Scattering)與光線步進(Ray Marching)[2009]
  • 預積分的皮膚着色(Pre-Integrated Skin Shading)[2010]
  • 可分離的次表面散射(SSSS,Separable Subsurface Scattering)[2015]

 

八、本文的GitHub版

不少朋友們喜歡看GitHub版本的文章,我也很喜歡。

首先,MarkDown可以很方便地插入快捷導航目錄,能進行瞬間跳轉到指定子章節。其次,GitHub版本的文章中沒有單篇文章的字數限制,少了很多篇幅方面的桎梏。而且因爲Git的便利性,版本管理的優勢,最新的勘誤和修訂,以及新文章的更新,第一時間會在GitHub的Repo中進行。

【本文的GitHub版本傳送門】:

https://github.com/QianMo/Game-Programmer-Study-Notes/blob/master/Content/%E3%80%8AGPU%20Gems%203%E3%80%8B%E5%85%A8%E4%B9%A6%E6%8F%90%E7%82%BC%E6%80%BB%E7%BB%93/Part1/README.md

 

九、參考文獻

 

[1] Eugene d'Eon, David Luebke. GPU Gems 3, Chapter 14. Advanced Techniques for Realistic Real-Time Skin Rendering,2007.(https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch14.html)

[2] Volumetric Skin and Fabric Shading at Framestore , SIGGRAPH 2017 Course: Physically Based Shading in Theory and Practice(http://blog.selfshadow.com/publications/s2017-shading-course/walster/s2017_pbs_volumetric_notes.pdf

[3] Rendering AAA-QualityCharacters of Project ‘A1’, NDC 2016 Programming Session

[4] https://zhuanlan.zhihu.com/p/27014447

[5] http://gad.qq.com/article/detail/33372

[6] http://gad.qq.com/article/detail/33373

[7] http://www.iryoku.com/next-generation-life

[8] https://gamingbolt.com/final-fantasy-15s-in-game-characters-are-as-impressive-as-the-pre-rendered-ones

[9] Next-Generation-Character-Rendering ,GDC 2013 http://www.iryoku.com/images/posts/next-generation-life/Next-Generation-Character-Rendering-Teaser.pptx

[10] https://en.wikipedia.org/wiki/Bidirectional_scattering_distribution_function

[11] Jensen, Henrik Wann, Stephen R. Marschner, Marc Levoy, and Pat Hanrahan.2001. "A Practical Model for Subsurface Light Transport." In Proceedings of SIGGRAPH 2001.

[12] Matlab online doc https://cn.mathworks.com/help/curvefit/gaussian.html

[13]d'Eon, Eugene."NVIDIA Demo Team Secrets–Advanced Skin Rendering." Presentation at Game Developer Conference 2007. http://developer.download.nvidia.com/presentations/2007/gdc/Advanced_Skin.pdf.

[14] Jorge Jimenez, Károly Zsolnai, etc. Separable Subsurface Scattering(http://iryoku.com/separable-sss/)

[15] Faceworks https://github.com/NVIDIAGameWorks/FaceWorks

[16] Colin Barre-Brisebois,Marc Bouchard. 2011. Presentation at Game Developer Conference 2011. https://colinbarrebrisebois.com/2011/03/07/gdc-2011-approximating-translucency-for-a-fast-cheap-and-convincing-subsurface-scattering-look/

[17] Jorge Jimenez, David Whelan, etc. Real-Time Realistic Skin Translucency(http://iryoku.com/translucency/downloads/Real-Time-Realistic-Skin-Translucency.pdf)

[18] orge Jimenez. Next Gen Character Rendering GDC 2013.

[19] Koki Nagano,Graham Fyffe,Oleg Alexander etc."Skin Microstructure Deformation with Displacement Map Convolution"http://gl.ict.usc.edu/Research/SkinStretch/

[20] RenderDoc. https://github.com/baldurk/renderdoc

[21] Per H. Christensen, Brent Burley. "Approximate Reflectance Profiles for Efficient Subsurface Scattering" Presentation at SIGGRAPH 2015. https://graphics.pixar.com/library/ApproxBSSRDF/paper.pdf

[22] Per H. Christensen, Brent Burley. "Approximate Reflectance Profiles for Efficient Subsurface Scattering" Presentation at SIGGRAPH 2015. https://graphics.pixar.com/library/ApproxBSSRDF/paper.pdf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章