《GPU Gems 3》:真實感皮膚渲染技術總結

2021-02-21 3D遊戲引擎

《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》開始:

圖《孤島驚魂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。

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

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

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

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的定義是:

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

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

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

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

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

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

 的求解非常複雜,通過近似可以得到:

,有了  可以得到 

其中  ,可以看出和自然指數相互聯繫。

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)

作為講解內容,之前有一篇文章(zhuanlan.zhihu.com/p/27)關於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描述

四者的聯繫:

四、擴散剖面(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。上述的四級高斯和為:

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

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

自己求解是十分費事的事情,對於經典的問題往往有現成的工具可以直接運用,不用重複造輪子。文章(https://gameinstitute.qq.com/community/detail/117567)提到,Matlab有一個曲線擬合功能即可滿足我們的要求,詳見https://ww2.mathworks.cn/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)的指導,對周圍像素進行模糊操作。按操作空間劃分,比較常規的思路有兩種:

下面分別對其進行說明。

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的技術即為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」(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」(https://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. 皮膚渲染建模

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

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

2. 鏡面反射部分

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

其中,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)的指導,對周圍像素進行模糊操作。

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

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版本傳送門】:

QianMo/Game-Programmer-Study-Notesgithub.com

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(https://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] https://gameinstitute.qq.com/community/detail/117567

[6] https://gameinstitute.qq.com/community/detail/117568

[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 

(www.iryoku.com/images/posts/next-generation-life/Next-Generation-Character-Rendering-Teaser.pptx)

[10]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 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

相關焦點

  • 基於物理渲染(PBR)的基礎理論
    首先,感謝雨軒帶的分享與總結~PBR是近來一個新的,有意思的實時渲染方式。這個術語已經被傳播得很廣泛,但他的真實含義往往是混淆的。簡單的回答是:這意味著很多。或者:這得看情況。這種回答並不能使人滿意。渲染引擎能基於這些信息來渲染diffuse和reflection信息。    但是這裡還有一個很大的部分被忽略掉了。大部分真實世界的表面都有很多不完美的地方:小凹槽,破損,小突起等細節。這些細節肉眼是看不到的。正常解析度的法線貼圖也不能體現這些小細節。雖然不能被肉眼看到,這種小細節仍然會對光的diffsion和reflection產生影響。
  • 【渲染流程】Cluster_Unity實現概述!
    其實實現Cluster 流程並不困難,只是作為一個習慣了DX11的程式設計師,在Unity 中實現的時候,遇到了很多坑,我將在下篇文章中,結合具體代碼,詳細總結中間走過的彎路。概述首先對Cluster流程做一個概述,如果大家不感興趣,就可以跳過後面的內容,x掉了~渲染流程:前向,延遲均可以【Forwar+, ClusterBasedDeferred】,需要有Early-Z 優化Cluster優勢:相比傳統前向流程:可以支持更多點光源相比延遲渲染流程:解決高解析度下,同像素多個點光源覆蓋,產生的帶寬問題
  • 實踐經驗分享:在深度學習中餵飽GPU
    同時提供每月大咖直播分享、真實項目需求對接、乾貨資訊匯總,行業技術交流。關注 極市平臺 公眾號 ,回復 加群,立刻申請入群~前段時間訓練了不少模型,發現並不是大力出奇蹟,顯卡越多越好,有時候 1 張 v100 和 2 張 v100 可能沒有什麼區別,後來發現瓶頸在其他地方,寫篇文章來總結一下自己用過的一些小 trick,最後的效果就是在 cifar 上面跑 vgg
  • VMware Bitfusion GPU共享技術的應用場景
    我們通過創建4臺虛擬機,每臺虛擬機通過vSphere的直通技術使用2塊GPU V100(32GB顯存)的GPU卡。課程場景的資源,通過Horizon虛擬桌面提供。具體流程如下:老師通過在虛擬機中安裝課程所需的軟體,製作課程模板。
  • 2020年深度學習如何挑選GPU?這篇 GPU 最全攻略請查收
    同時提供每月大咖直播分享、真實項目需求對接、乾貨資訊匯總,行業技術交流。關注 極市平臺 公眾號 ,回復 加群,立刻申請入群~深度學習是一個對計算有著大量需求的領域,從一定程度上來說,GPU的選擇將從根本上決定深度學習的體驗。
  • 基於VMware Bitfusion的GPU共享技術使用場景討論
    我們通過創建4臺虛擬機,每臺虛擬機通過vSphere的直通技術使用2塊GPU V100(32GB顯存)的GPU卡。課程場景的資源,通過Horizon虛擬桌面提供。具體流程如下:老師通過在虛擬機中安裝課程所需的軟體,製作課程模板。
  • Mali GPU: 抽象機器(二) – 基於區塊的渲染
    每一原語渲染結束後再開始下一個,其利用類似於如下所示的算法:  1. foreach( primitive )  2. foreach( fragment )  3. render fragment  由於流中的任何三角形可能會覆蓋屏幕的任何部分,由這些渲染器維護的數據工作集將會很大;通常至少包含全屏尺寸顏色緩衝、深度緩衝,還可能包含模板緩衝。
  • unity 半透明渲染技巧(3則)
    因為通用的解決方案 已經有各種OIT專業方案,比如 gpu 鍊表 和 depth peeling。但還是那個普遍規律越通用的性能就越不夠理想 因為他們不知道你資源的特殊性 可以做哪些極端的簡化。所以這裡只分享些個人針對一些具體開發積累的小小技巧(持續補充中...)。對於 為什麼會出現這個問題本質原因還不清楚的 可以看這篇基礎說明(文章底部參考閱讀).
  • 《賽博朋克2077》技術和渲染分析
    本次的分析就到這,可能總結的比較亂。但是你大體應該是能看出來到底2077為什麼這麼卡頓。這只是截幀了一個非常簡單的場景做分析,如果更複雜的。那麼可能會暴露出更多的問題。希望CDPR好好優化吧。就這樣,結束。
  • 從GPU誕生說起:AMD統一渲染架構回顧及展望-AMD,ATI,統一渲染,顯卡...
    3、 紋理帖圖:頂點單元生成的多邊形只構成了3D物體的輪廓,而紋理映射(texture mapping)工作完成對多邊形表面的帖圖,通俗的說,就是將多邊形的表面貼上相應的圖片,從而生成「真實」的圖形。TMU(Texture mapping unit)即是用來完成此項工作。
  • 【前端技術】react渲染 - 流程概述
    作者:winkchen  騰訊IEG前端開發工程師|導語 web前端技術中
  • 當可視化遇上渲染技術,原來畫面可以如此炫酷
    文/沈毅 整理/胡世龍如果你喜歡玩遊戲,一定有被某些遊戲中的畫面渲染效果驚豔到過。而當這些遊戲級的渲染技術應用到數據的可視化中,又會發生什麼呢?在7月15日的第15期數據俠實驗室活動中,百度ECharts團隊核心開發者之一的沈毅從技術角度分享了如何利用ECharts實現高質量的渲染效果,並展示了幾個酷炫的可視化案例。
  • VRay for SketchUp渲染器GPU渲染優勢的測試及分析
    VRay從3.4版本開始,GPU渲染開始成熟VRay for SketchUp渲染器從2.0開始引入了GPU渲染引擎,不過由於受當時顯卡速度的限制和GPU對很多功能不支持,適用價值並不大,也沒有引人們的太多興趣,不過VRay 從3.4版本開始,改用了全新的界面語言,放棄了Pyhton
  • 居然有免費的GPU可以跑深度學習代碼!
    凌逆戰原文:https://www.cnblogs.com/LXP-Never/p/11614053.html從事深度學習的研究者都知道,深度學習代碼需要設計海量的數據,需要很大很大很大(重要的事情說三遍)的計算量,以至於CPU算不過來,需要通過GPU幫忙,但這必不意味著CPU的性能沒GPU強,CPU是那種綜合性的,GPU是專門用來做圖像渲染的
  • 3dmax效果圖渲染,用VR渲染好還是用CR渲染好?
    VRay(以下簡稱VR)真的很受業界歡迎了,它是一種結合了光線跟蹤和光能傳遞的渲染器,擁有完備的燈光、材質和渲染工具,其真實的光線計算創建了專業的照明效果,為不同領域的優秀CG製作者提供了高質量的圖片和動畫渲染。
  • GPU如何工作:PowerVR/高通Adreno/ARM Mali的渲染模式分析
    在上一篇文章《【技術解析】GPU如何實現三維渲染及非圖形計算?》我們已經了解了GPU工作流程以及作用,但GPU絕無這麼簡單。本文引用地址:http://www.eepw.com.cn/article/201606/292810.htm  PowerVR —— 延後式分塊渲染架構  ImgTec(或者說 Imagination Technologies)的前身是 1985 年在英國成立的VideoLogic公司,在上世紀90年風靡一時的世嘉DreamCast遊戲機就是採用該公司技術授權生產的圖形處理器
  • Nvidia RTX GPU 現身 Adobe MAX,8K 視頻渲染碾壓 CPU
    首先,就與本次 Adobe MAX 直接相關的產品而言,Nvidia 展示了如何利用一塊 GeForce RTX 2080Ti GPU 來加速 Adobe Dimension CC 的渲染。現場展示的 Adobe Dimension CC 渲染案例中,在採用相同的渲染工具的情況下,採用 RTX GPU 來渲染的速度比傳統 CPU 的速度要快得多,而且能夠完美地實現移動光效的效果。
  • 《報復(Get Even)》首曝劃時代真實渲染預告 2015年發售
    真實渲染預告:「What Is Real」  本作動用了與遊戲公司同屬波蘭的Better Reality研發的真實掃描技術,場景和人物貼圖全部來自真實世界,營造一種真實世界的感覺,同時遊戲也是恐怖與驚悚題材。
  • 渲雲GPU升級至P40 與京東雲聯手實現雲端極速渲染
    贊奇公司是一家專注於三維視覺計算雲技術研發與應用的高新技術企業。其自主運營的雲渲染平臺渲云為傳統影視動漫用戶提供自助渲染服務以及項目管理服務,同時提供定製化的三維渲染整體解決方案。目前國內院線上映的電影製作公司60%以上均與渲雲達成合作。渲雲藉助京東雲產品和平臺作技術為輸出口,打造公有雲渲染平臺,為用戶量身制定安全、極速、低成本的渲染解決方案。
  • 深度學習中GPU和顯存分析
    這裡推薦一個好用的小工具:gpustat,直接pip install gpustat即可安裝,gpustat基於nvidia-smi,可以提供更美觀簡潔的展示,結合watch命令,可以動態實時監控GPU的使用情況。watch --color -n1 gpustat -cpu