【GPU精粹与Shader编程】(六) 《GPU Gems 3》:真实感皮肤渲染技术总结
?
? ? ? ? ?本文由@淺墨_毛星云?出品,首發(fā)于知乎專欄,轉(zhuǎn)載請(qǐng)注明出處??
? ? ? ? ?文章鏈接:?https://zhuanlan.zhihu.com/p/42433792
?
本文是【GPU精粹與Shader編程】系列的第六篇文章。
《GPU Gems 3》中的“Chapter 14. Advanced Techniques for Realistic Real-Time Skin Rendering”一文,自其問世以來,都是皮膚渲染領(lǐng)域經(jīng)常會(huì)被參考到的主要文章,可謂皮膚渲染技術(shù)的集大成者,奠基之作。
本文正好借著系列文章對(duì)《GPU Gems 3》中此章節(jié)進(jìn)行提煉總結(jié)的機(jī)會(huì),對(duì)真實(shí)感皮膚渲染技術(shù),進(jìn)行一個(gè)系統(tǒng)的總結(jié)和提煉。
除了對(duì)《GPU Gems 3》中該篇文章本身內(nèi)容的提煉,本文也會(huì)在其基礎(chǔ)上,結(jié)合這些年真實(shí)感皮膚渲染技術(shù)的發(fā)展,聊一些更多的東西。希望能對(duì)當(dāng)前業(yè)界真實(shí)感皮膚渲染技術(shù)的現(xiàn)狀與發(fā)展,做一個(gè)較為全面系統(tǒng)的總結(jié)與提煉。
?
一、總覽:皮膚渲染技術(shù)發(fā)展史
?
按時(shí)間分布,近20年皮膚主流渲染技術(shù)的發(fā)展可以總結(jié)列舉如下:
- 次表面光照傳輸模型(Subsurface Light Transport, SSLT)[2001]
- 擴(kuò)散剖面(Diffusion Profile) [2001]
- 偶極子(dipole) [2001]
- 紋理空間模糊(Texture Space Blur)[2003]
- 多極子(multipole) [2005]
- 屏幕空間模糊(Screen Space Blur)或屏幕空間次表面散射(SSSSS,Screen Space SubSurface Scattering)[2009]
- 路徑追蹤次表面散射(Path-Traced Subsurface Scattering)與光線步進(jìn)(Ray Marching)[2009]
- 預(yù)積分的皮膚著色(Pre-Integrated Skin Shading)[2010]
- 可分離的次表面散射(SSSS,Separable Subsurface Scattering)[2015]
- 等
需要注意的是,上面列出的時(shí)間點(diǎn),可能并不是嚴(yán)格意義上的該技術(shù)提出的時(shí)間點(diǎn),而是該技術(shù)在論文或會(huì)議上被提出,被大眾熟知,被引入到皮膚渲染技術(shù)中的時(shí)間點(diǎn)。
接下來,先看一些近年游戲中的真實(shí)感皮膚渲染畫面,然后讓我們從皮膚渲染的基礎(chǔ)理論開始講起,對(duì)上面列出的近20年皮膚主流渲染技術(shù),按流派和內(nèi)容分別進(jìn)行介紹。
?
?
二、近年游戲與渲染業(yè)界中的真實(shí)感皮膚渲染畫面
?
首先是一個(gè)《孤島驚魂5》中的演示視頻(預(yù)渲染),有不少人覺得渲染出的畫面已經(jīng)和真人出演的美劇非常相似,主要注意視頻中人物的皮膚渲染表現(xiàn):
https://www.youtube.com/watch?v=4W450G_UR1Q
OK,來看一些近幾年,游戲中真實(shí)感皮膚渲染的典型效果圖。
從《孤島驚魂5》開始:
?
圖《孤島驚魂5》中的皮膚渲染
圖《孤島驚魂5》中的皮膚渲染
?
《神秘海域4》:
圖 《神秘海域4》中的皮膚渲染
圖 《神秘海域4》中的皮膚渲染
?
《底特律:變?nèi)恕?#xff1a;
圖 《底特律:變?nèi)恕分械钠つw渲染
圖 《底特律:變?nèi)恕分械钠つw渲染
?
當(dāng)然,怎么都不能少了今年的熱門 UE4的Siren:
圖 數(shù)字人Siren的皮膚渲染 @UE4
圖 數(shù)字人Siren的皮膚渲染 @UE4
?
?
三、皮膚渲染基礎(chǔ)理論
?
皮膚的渲染一直是渲染領(lǐng)域的難點(diǎn)之一:皮膚具有許多微妙的視覺特征,而觀察者對(duì)皮膚的外觀,特別是臉部的外觀會(huì)非常敏感。皮膚的真實(shí)感渲染模型須包括皺紋,毛孔,雀斑,毛囊,疤痕等細(xì)節(jié)的模擬,而真實(shí)還原人體皮膚上的這些細(xì)節(jié)則是一個(gè)較大的挑戰(zhàn)。
皮膚作為一種屬性復(fù)雜的材質(zhì),其物理結(jié)構(gòu)由多層結(jié)構(gòu)組成,其表面油脂層主要貢獻(xiàn)了皮膚光照的反射部分,而油脂層下面的表皮層和真皮層則主要貢獻(xiàn)了的次表面散射部分。實(shí)驗(yàn)測(cè)試表明,光線接觸到皮膚時(shí),有大約94%被皮膚各層散射,只有大約6%被反射。
?
圖 多層皮膚結(jié)構(gòu)
對(duì)于皮膚而言,圖形學(xué)研究學(xué)者們已經(jīng)制作了使用多達(dá)五個(gè)獨(dú)立層[Krishnaswamy and Baranoski 2004]的非常細(xì)致的模型,用于描述皮膚中的光學(xué)散射現(xiàn)象,而真正的皮膚則更加復(fù)雜。在醫(yī)學(xué)上,僅皮膚表皮(epidermis)即被認(rèn)為包含五個(gè)不同的層[Poirer 2004]。在這種復(fù)雜性下對(duì)散射進(jìn)行模擬可能是過度和沒有必要的,但是真實(shí)的渲染需要在油質(zhì)層下面建模至少兩個(gè)不同的層,因?yàn)橹辽儆幸粋€(gè)層要用于鏡面反射(specular)項(xiàng)。Donner和Jensen[Donner and Jensen 2005]在2005年證明了單層模型不足以對(duì)真實(shí)感皮膚進(jìn)行渲染,并展示了使用三層建模的改進(jìn)方案。
圖 多層皮膚模型
因?yàn)槠渚哂邪胪该鲗傩怨饩€會(huì)在皮膚的表層進(jìn)行多次散射,散射根據(jù)其通過的路徑衰減,簡(jiǎn)單來說就是光線會(huì)擴(kuò)散到周圍,這對(duì)于表現(xiàn)皮膚的質(zhì)感起到很大作用。
一般的材質(zhì)采用BRDF(bidirectional reflectance distribution function)可以很好的表達(dá),但皮膚往往需要更加復(fù)雜的建模,如BSSDF。
圖 多層皮膚對(duì)光的散射和吸收
經(jīng)驗(yàn)表明,皮膚渲染的渲染過程可由兩個(gè)分量組成:
- 鏡面反射(specular reflection)
- 次表面散射(subsurface scattering)
下文將對(duì)上述兩個(gè)分量分別進(jìn)行說明。
?
3.1 鏡面反射(specular reflection)
?
鏡面反射項(xiàng)(specular reflection)相對(duì)而言很簡(jiǎn)單,Gems 3中推薦Kelemen and Szirmay-Kalos specular BRDF用于皮膚鏡面反射項(xiàng)的計(jì)算。因?yàn)镵elemen and Szirmay-Kalos specular BRDF在實(shí)現(xiàn)和Torrance-Sparrow模型一樣的渲染效果時(shí),計(jì)算量要小得多。而現(xiàn)階段基于物理的一些其他高光模型或改進(jìn)方案也應(yīng)該會(huì)得到不錯(cuò)的效果。
?
3.2 次表面散射(Subsurface Scattering)
?
3.2.1 半透明材質(zhì)與次表面散射(Translucent and Subsurface Scattering)
?
首先,半透明材質(zhì)在生活中無處不在:樹葉、紙、蠟燭、牛奶、布料、生物的皮膚、貝殼、瑪瑙等。事實(shí)上,幾乎所有非金屬物體都存在一定程度的次表面光傳輸(Subsurface Light Transport,SSLT)現(xiàn)象[Pharr 2010],皮膚猶是如此。
上文提到,皮膚是一個(gè)多層結(jié)構(gòu),其表面油脂層主要貢獻(xiàn)了皮膚光照的反射部分(約占入射光中的6%),而油脂層下面的表皮層和真皮層則主要貢獻(xiàn)了次表面散射部分(約占入射光中的94%)。任何沒有直接從皮膚表面反射出去的光,都會(huì)直接進(jìn)入次表面層。這種占主要主導(dǎo)因素的次表面散射屬性,決定了皮膚半透明的特征以及柔軟的視覺外觀。
入射光與皮膚進(jìn)行交互的過程中,被部分吸收(獲取顏色)并經(jīng)過多次散射,返回并從進(jìn)入點(diǎn)周圍的3D鄰域處表面離開。而有時(shí)光線會(huì)完全穿過像耳朵這樣的薄薄區(qū)域,形成透射(Transmittance)。
?
圖 多層皮膚對(duì)光的散射和吸收
對(duì)于次表面散射而言,Jensen在2001年的論文《A Practical Model for Subsurface Light Transport》是次表面材質(zhì)建模最重要的一篇論文,推導(dǎo)了許多重要的物理公式,計(jì)算模型,渲染時(shí)的參數(shù)轉(zhuǎn)換,以及測(cè)量了許多生活中常見材質(zhì)的散射系數(shù)等等。大部分后來的論文都是在基于這篇文章中的理論的一些提升。
?
3.2.2 BRDF與BSSRDF
?
模擬半透明物體的方法有很多,例如Volumetric Path Tracing,Volumetric Photon Mapping和BSSRDF。
其中,BSSRDF(Bidirectional Surface Scattering Reflectance Distribution Function,雙向表面散射反射分布函數(shù))是目前的主流技術(shù)。
簡(jiǎn)單來說,傳統(tǒng)的 BRDF 模型是 BSSRDF的一種簡(jiǎn)化。BSSRDF和BRDF的不同之處在于,BSSRDF可以指定不同的光線入射位置和出射的位置。
圖: BRDF和BSSRDF與皮膚交互,光散射的對(duì)比
對(duì)于BRDF模型來說,一次反射光照的計(jì)算是在光線交點(diǎn)的法線半球上的球面積分。而對(duì)于BSSRDF來說,每一次反射在物體表面上每一個(gè)位置都要做一次半球面積分,是一個(gè)嵌套積分。
其中BSSRDF的定義是:
R_d?只接受一個(gè)標(biāo)量參數(shù),這個(gè)參數(shù)的意義是光線入射位置和初設(shè)位置的曼哈頓距離。直觀的理解就是,BSSRDF嘗試將光線在物體表面內(nèi)部中數(shù)千次的散射后所剩余的能量用一個(gè)基于入射點(diǎn)和出射點(diǎn)之間距離的函數(shù)去近似只接受一個(gè)標(biāo)量參數(shù),這個(gè)參數(shù)的意義是光線入射位置和初設(shè)位置的距離。也就是說,BSSRDF嘗試將光線在物體表面內(nèi)部中數(shù)千次的散射后所剩余的能量用一個(gè)基于入射點(diǎn)和出射點(diǎn)之間距離的函數(shù)去近似。這個(gè)近似則是基于幾個(gè)假設(shè):
1. 次表面散射的物體是一個(gè)曲率為零的平面
2. 這個(gè)平面的厚度,大小都是無限
3. 平面內(nèi)部的介質(zhì)參數(shù)是均勻的
4. 光線永遠(yuǎn)是從垂直的方向入射表面。
正因?yàn)橛羞@些假設(shè),所以很容易把出射光的強(qiáng)度與出射點(diǎn)和入射點(diǎn)之間的距離用一個(gè)函數(shù)去近似。而真實(shí)的模型往往比理想中要復(fù)雜的多,光線也有可能從各個(gè)角度入射,因此通過BSSRDF渲染的結(jié)果會(huì)有一定誤差。
R_d?的求解非常復(fù)雜,通過近似可以得到,具體過程如下:
,有了??可以得到?
其中??,可以看出和自然指數(shù)相互聯(lián)系。
?
?
3.2.3 BTDF與透射(Transmittance)
?
有時(shí)光線會(huì)完全穿過像耳朵這樣的薄薄區(qū)域。這是因?yàn)?#xff0c;光線經(jīng)過一部分次表面后,最終沒有在入射側(cè)進(jìn)行出射,而是從入射側(cè)另一側(cè)透出來,形成透射(Transmittance)。透過光的手會(huì)產(chǎn)生桔紅色視覺外觀同理。
圖 透射(Transmittance)的圖示
?
圖 透過光的手會(huì)產(chǎn)生桔紅色視覺外觀
透射一般可以通過BTDF(雙向透射分布函數(shù), Bidirectional Transmittance Distribution Function)來描述。
這里先對(duì)幾種分布函數(shù)的全稱進(jìn)行列舉:
- BRDF(雙向反射分布函數(shù),Bidirectional Reflectance Distribution Function)
- BSSRDF(雙向表面散射反射分布函數(shù), Bidirectional Surface Scattering Reflectance Distribution Function)
- BTDF(雙向透射分布函數(shù), Bidirectional Transmittance Distribution Function)
- BSDF(雙向散射分布函數(shù),Bidirectional Scattering Distribution Function)
作為講解內(nèi)容,之前有一篇文章(https://zhuanlan.zhihu.com/p/27014447)關(guān)于BRDF、BTDF、BSDF的描述非常精煉,這邊直接引用到本文中來。
當(dāng)光線從一種介質(zhì)射向另外一種介質(zhì)時(shí),根據(jù)其行進(jìn)路線,可以被分為兩個(gè)部分:
- 一部分光線在介質(zhì)交界處發(fā)生了反射, 并未進(jìn)入另外一種介質(zhì)。
- 另外一部分光線則進(jìn)入了另一種介質(zhì)。
其中:
- BRDF:反射部分的光照的輻射亮度(radiance)和入射光照的輻射照度(irradiance)的比例是一個(gè)和入射角度、出射角度相關(guān)的函數(shù),這個(gè)函數(shù)就被稱之為雙向反射分布函數(shù)(BRDF)。
- BTDF:相應(yīng)的,穿越介質(zhì)的那部分光照的輻射亮度和輻射照度的比例就被稱之為雙向透射分布函數(shù)(BTDF)。
- BSDF:上述兩部分出射光的輻射亮度總和和入射光的輻射照度的比例就被叫做雙向散射分布函數(shù)(BSDF),即BSDF = BRDF + BTDF。
圖 BSDF = BRDF + BTDF
透射的實(shí)現(xiàn)思路比較直觀,可以分為三步:
(1)計(jì)算光照在進(jìn)入半透明介質(zhì)時(shí)的強(qiáng)度
(2)計(jì)算光線在介質(zhì)中經(jīng)過的路徑長(zhǎng)度
(3)根據(jù)路徑長(zhǎng)度和BTDF來計(jì)算出射光照的強(qiáng)度,這里BTDF可以簡(jiǎn)化為一個(gè)只和光線路徑長(zhǎng)度相關(guān)的函數(shù)
另外,《GPU Gems 3》中,有提到通過改進(jìn)半透明陰影貼圖(Translucent Shadow Maps,TSMs)來實(shí)現(xiàn)皮膚渲染中透射效果的模擬,下文中也有一些更詳細(xì)的簡(jiǎn)略說明。
?
3.2.4 關(guān)于BRDF、BSSRDF、BTDF、BSDF的關(guān)系
另外,下面的這張PPT,能很好地解釋BRDF、BSSRDF、BTDF、BSDF的關(guān)系。
圖 BRDF、BSSRDF、BTDF、BSDF的關(guān)系
?
下面用一些補(bǔ)充說明,理清幾者的關(guān)系。
如上圖,光線從一種介質(zhì)射向另外一種介質(zhì)時(shí),有反射,次表面散射、透射三種交互形態(tài):
- 其普通反射的行為用BRDF描述
- 其次表現(xiàn)散射的行為用 BSSRDF描述
- 其透射的行為用BTDF描述
四者的聯(lián)系:
- 總體來說,BRDF 為 BSSRDF 的一種簡(jiǎn)化
- BSDF可分為反射和透射分量?jī)刹糠?#xff0c;即BSDF = BRDF + BTDF
?
?
四、擴(kuò)散剖面(Diffusion Profile)
?
擴(kuò)散剖面(Diffusion Profile),是早年間渲染次表面散射比較熱門的大方向。
首先,需要說明一下關(guān)于Diffusion Profiles這個(gè)詞翻譯相關(guān)的問題。按Diffusion Profiles其含義,可被譯作擴(kuò)散剖面,也可以被譯作漫散射剖面、漫射剖面。(Diffusion Profiles目前還沒有比較公認(rèn)和共識(shí)的翻譯,大多數(shù)文章中都直接使用英文原詞組,上述翻譯僅供參考。文章后文盡量會(huì)統(tǒng)一使用“擴(kuò)散剖面”作為Diffusion Profiles的翻譯)另外,有些文獻(xiàn)中會(huì)將Diffusion 寫作Diffuse Scattering,他們都是表示漫散射,或一種光線在材質(zhì)內(nèi)部擴(kuò)散的現(xiàn)象。
簡(jiǎn)而言之,擴(kuò)散剖面(diffusion profile)是描述光線如何在半透明物體中進(jìn)行擴(kuò)散和分布的函數(shù)。
擴(kuò)散剖面(diffusion profile),相當(dāng)于一個(gè)記錄次表面散射細(xì)節(jié)的“地圖”。你可以將其理解為一個(gè)LUT,一個(gè)記錄了答案的索引,或者一張標(biāo)記高度的“高度圖”,他會(huì)告訴你什么地方的像素,應(yīng)該進(jìn)行什么程度的模糊。
也有文章指出,可以簡(jiǎn)單理解擴(kuò)散剖面為一張權(quán)重查找表,不同的皮膚渲染方法,通常就是對(duì)擴(kuò)散剖面的不同近似。
需要說明的是,與擴(kuò)散剖面(diffusion profile)的概念往往一起出現(xiàn)的偶極子(Dipole)方法,多級(jí)子(Multipole)方法,高斯和(Sum-of-Gaussians)方法,都是更好地描述出擴(kuò)散剖面(Diffusion Profiles)的一些策略。
對(duì)于一個(gè)平面來說當(dāng)激光垂直照射它時(shí)會(huì)發(fā)現(xiàn)光擴(kuò)散到周圍,形成以照射點(diǎn)為中心的光暈,如果物體的材質(zhì)各項(xiàng)均勻其散射行為和角度無關(guān),我們就可以用一個(gè)一維函數(shù)來描述,對(duì)于不同的材質(zhì)RGB根據(jù)距離衰減的行為是不一樣的。擴(kuò)散剖面(diffusion profile)就是用來描述光在物體內(nèi)部的擴(kuò)散(散射)行為。
具體來說,擴(kuò)散剖面(diffusion profile)提供了光在高度散射的半透明材質(zhì)表面下散射方式的近似。具體而言,它描述了以下簡(jiǎn)單實(shí)驗(yàn)的結(jié)果。
在暗室中使用非常薄的白色激光束照亮一個(gè)平坦的表面。我們將看到激光束照射到表面的中心點(diǎn)周圍的光暈,因?yàn)橐恍┕饩€在表面下方并在附近返回,如下(a)所示。
擴(kuò)散剖面(diffusion profile)告訴我們有多少光作為角度和激光中心距離的函數(shù)出現(xiàn)。 如果我們只考慮均勻材質(zhì),則散射在所有方向上都是相同的,即散射行為和角度無關(guān)。
而每種顏色都有自己的剖面,我們可以將其繪制成一維曲線,如下圖(b)所示。
圖 可視化擴(kuò)散剖面(diffusion profile)
另外值得注意的是,RGB擴(kuò)散的范圍是不一樣的,即擴(kuò)散剖面具有很強(qiáng)的顏色相關(guān)性:紅光比綠色和藍(lán)色散射得更遠(yuǎn)。而正因?yàn)榧t色擴(kuò)散得更遠(yuǎn)一些,所以耳朵和鼻子的部位通常會(huì)更有紅彤彤的感覺。
時(shí)間方面,在2001年,Jensen 等人提出的散射模型[Jensen et al.2001]基于幾種材質(zhì)屬性引入了擴(kuò)散剖面,奠定了此流派的基礎(chǔ)。并提出了使用偶極子(dipole)方程計(jì)算出擴(kuò)散剖面的思想。
該方法簡(jiǎn)單地使用表面上兩點(diǎn)之間的空間距離r來評(píng)估擴(kuò)散剖面。其決定了任何兩個(gè)位置之間的漫散射的描述問題,且無論兩者之間的幾何形狀如何,如下圖所示。
圖 用r進(jìn)行曲面中漫散射(diffusion)的有效估算
給定幾種屬性,可以使用偶極子(dipole)方程計(jì)算出擴(kuò)散剖面。而偶極子(dipole)也是較為常見的評(píng)估擴(kuò)散剖面的方法。而有些文獻(xiàn)中提到的偶極子剖面(Dipole Profiles),即是用偶極子(dipole)來表示的擴(kuò)散剖面(diffusion profile)。
圖 將入射光線轉(zhuǎn)換為偶極子源以進(jìn)行漫散射的近似[Jensen 2001]
我們可以將擴(kuò)散剖面用R(r)表示。一般而言,所有材質(zhì)都存在次表面散射現(xiàn)象,區(qū)別只在于其密度分布函數(shù)R(r)的集中程度,可分為兩種情況:
(1)如果該函數(shù)的絕大部分能量都集中在入射點(diǎn)附近(r=0),就表示附近像素對(duì)當(dāng)前像素的光照貢獻(xiàn)不明顯,次表面散射現(xiàn)象不明顯,可以忽略,則在渲染時(shí)我們就用漫反射代替。
(2)如果該函數(shù)分布比較均勻,附近像素對(duì)當(dāng)前像素的光照貢獻(xiàn)明顯,次表面散射現(xiàn)象明顯,則需要單獨(dú)計(jì)算次表面散射。
據(jù)此次表面散射的計(jì)算可以分為兩個(gè)部分:
(1)對(duì)每個(gè)像素進(jìn)行一般的漫反射計(jì)算。
(2)根據(jù)擴(kuò)散剖面(diffusion profile)和(1)中的漫反射結(jié)果,加權(quán)計(jì)算周圍若干個(gè)像素對(duì)當(dāng)前像素的次表面散射貢獻(xiàn)。
?
4.1 多級(jí)子(Multipole)方法
?
上文提到,與擴(kuò)散剖面(diffusion profile)概念往往一起出現(xiàn)的偶極子(Dipole),多級(jí)子(Multipole),高斯和(Sum-of-Gaussians),都是更好地描述出擴(kuò)散剖面(Diffusion Profiles)的一些方案。
2005年,Donner and Jensen通過論文《Light Diffusion in Multi-Layered Translucent Materials》[Donner and Jensen 2005]將多極子(multipole)引入擴(kuò)散剖面(diffusion profiles),來解決多層半透明材質(zhì)中的次表面散射的渲染問題。
需要知道的是,多極子是偶極子概念的推廣。在物理學(xué)中,對(duì)于含有2\^n個(gè)大小相等的點(diǎn)電荷,其中正負(fù)各半數(shù),排列成有規(guī)律的點(diǎn)陣。n=0時(shí),稱為點(diǎn)電荷;n=1,稱為偶極子(Dipole);n=2,稱為四極子;n≥2,統(tǒng)稱為多極子(Multipole)。
圖 半無限幾何圖形的偶極子配置(左)和薄材質(zhì)的多極子配置(右)[Donner 2005]
關(guān)于多極子擬合擴(kuò)散剖面(diffusion profile)的具體方法,可見論文《Light Diffusion in Multi-Layered Translucent Materials》。http://jbit.net/~sparky/layered.pdf
?
4.2 高斯和的擴(kuò)散剖面(Sum-of-Gaussians Diffusion Profile)
?
不難發(fā)現(xiàn),對(duì)擴(kuò)散剖面繪制的輪廓線類似于眾所周知的高斯函數(shù)e^-r2,如下圖。雖然單個(gè)高斯分布不能精確地?cái)M合任何擴(kuò)散分布,但實(shí)踐表明多個(gè)高斯分布在一起可以對(duì)擴(kuò)散剖面提供極好的近似。因此我們可以通過高斯函數(shù)來擬合擴(kuò)散剖面(diffusion profile)。
圖 可視化擴(kuò)散剖面(diffusion profile)
高斯函數(shù)表達(dá)式具有一些很好的特性,在當(dāng)我們將擴(kuò)散剖面表示為高斯和時(shí),可以讓我們非常有效地求解次表面散射。高斯函數(shù)是獨(dú)特的,因?yàn)樗鼈兺瑫r(shí)是可分離的和徑向?qū)ΨQ的,并且它們可以相互卷積來產(chǎn)生新的高斯函數(shù)。
這需要從偶極子或基于多極子的擴(kuò)散剖面映射到高斯和。
對(duì)于每個(gè)擴(kuò)散分布R(r),我們找到具有權(quán)重w i和方差v i的k個(gè)高斯函數(shù):
我們?yōu)楦咚购瘮?shù)的方差v選擇以下定義:
選擇常數(shù)1/(2v)使得G(v,r)在用于徑向2D模糊時(shí)不會(huì)使輸入圖像變暗或變亮(其具有單位脈沖響應(yīng)(unit impulse response))。
下圖顯示了擴(kuò)散剖面(diffusion profile)(用于大理石中綠光的散射)和使用兩級(jí)和四級(jí)高斯和的近似剖面。
我們使用[Jensen et al. 2001]中提出的散射參數(shù):
圖 用多個(gè)高斯和擬合偶極子剖面(Dipole Profile)
從上圖可以看出2個(gè)高斯函數(shù)和的Profile的誤差較大,而4個(gè)高斯和已可以可以很好的逼近Profile。上述的四級(jí)高斯和為:
R(r) = 0.070G(0.036, r) + 0.18G(0.14, r) + 0.21G(0.91, r) + 0.29G(7.0, r)
?
那么,如何確定這幾個(gè)高斯函數(shù)的權(quán)重和方差?
這是一個(gè)很經(jīng)典的問題,即給定一條曲線,如何用多項(xiàng)式或者三角函數(shù)去擬合。
自己求解是十分費(fèi)事的事情,對(duì)于經(jīng)典的問題往往有現(xiàn)成的工具可以直接運(yùn)用,不用重復(fù)造輪子。文章(http://gad.qq.com/article/detail/33372)提到,Matlab有一個(gè)曲線擬合功能即可滿足我們的要求,詳見https://cn.mathworks.com/help/curvefit/gaussian.html
Matlab通過高斯函數(shù)擬合最多可以支持8個(gè)高斯函數(shù)下圖1,而下圖2和圖3是用2個(gè)高斯函數(shù)進(jìn)行擬合的例子。
圖 Matlab中多個(gè)高斯擬合
?
圖 Matlab中多個(gè)高斯擬合
?
圖 通過2個(gè)高斯函數(shù)擬合曲線的例子
?
4.3 對(duì)皮膚的擴(kuò)散剖面高斯和擬合(A Sum-of-Gaussians Fit for Skin)
?
上一節(jié)講到了高斯和的擴(kuò)散剖面(Sum-of-Gaussians Diffusion Profile),并沒有將其運(yùn)用于皮膚渲染。本節(jié)將講到適于皮膚的高斯和擴(kuò)散剖面擬合。
對(duì)于大部分透明物體像牛奶,大理石一個(gè)偶極子剖面(Dipole Profile)足以,但是對(duì)于皮膚的這樣多層結(jié)構(gòu)的材質(zhì),用一個(gè)偶極子剖面(Dipole Profile)不能達(dá)到理想的效果。以一層材質(zhì)配置一個(gè)偶極子(Dipole)的思路,通過3個(gè)偶極子(Dipole)即可模擬三層皮膚材質(zhì)。實(shí)踐表明,3個(gè)偶極子(Dipole)確實(shí)可以接近Jensen論文中的根據(jù)測(cè)量得出的皮膚Profile數(shù)據(jù)。
而3個(gè)偶極子剖面(Dipole Profile)通過前面描述的,對(duì)應(yīng)于單個(gè)剖面的4個(gè)高斯函數(shù)不能得到很好的逼近結(jié)果。實(shí)踐表明,通過6個(gè)高斯函數(shù)可以得到很不錯(cuò)的結(jié)果。
同樣地,可以用前面提到的Matlab的擬合功能求解。下圖是通過6個(gè)高斯擬合皮膚3層Dipole Profile的RGB對(duì)應(yīng)的衰減,可以看出在紅色比綠色和藍(lán)色擴(kuò)散的遠(yuǎn)得多。而得到的擴(kuò)散曲線如下圖所示。
圖 三層皮膚模型的高斯和參數(shù)
圖 適用于三層皮膚模型的高斯和擬合
這里需要注意的是,對(duì)于每個(gè)剖面,高斯項(xiàng)的權(quán)重和為1.0。這是由于我們是用一個(gè)漫反射顏色貼圖來定義皮膚的顏色,而不是用一個(gè)與之相符的漫反射剖面。通過對(duì)這些剖面進(jìn)行歸一化來得到白色的漫反射顏色,確保在散射入射光之后,平均結(jié)果能保持白色。然后,將此結(jié)果乘以基于圖像的顏色貼圖以獲得膚色的色調(diào)即可。
?
五、常規(guī)基于模糊的次表面散射方法
?
上文提到,擴(kuò)散剖面(diffusion profile)是描述光線如何在半透明物體中進(jìn)行擴(kuò)散和分布的函數(shù)。
得到擴(kuò)散剖面(diffusion profile),即光線是如何在半透明物體中進(jìn)行擴(kuò)散和分布之后,接下來就可以對(duì)附近的像素進(jìn)行加權(quán)求和,以模擬次表面散射的效果。
這個(gè)求和的過程其實(shí)是根據(jù)擴(kuò)散剖面(diffusion profile)的指導(dǎo),對(duì)周圍像素進(jìn)行模糊操作。按操作空間劃分,比較常規(guī)的思路有兩種:
- 紋理空間模糊(Texture Space Blur)
- 屏幕空間模糊(Screen Space Blur)
下面分別對(duì)其進(jìn)行說明。
?
5.1 紋理空間模糊(Texture Space Blur)
?
紋理空間漫散射(Texture-Space Diffusion),也常被稱作Texture Space Blur(紋理空間模糊)方法,由[Borshukov and Lewis 2003]提出,首次用于進(jìn)行《黑客帝國(guó)》續(xù)集中的面部渲染技術(shù),可用于精確模擬次表面散射(subsurface scattering)。
其言簡(jiǎn)意賅的思路是利用皮膚中散射的局部特性,通過使用紋理坐標(biāo)作為渲染坐標(biāo)展開3D網(wǎng)格,在2D紋理中有效地對(duì)其進(jìn)行模擬。
圖 用于進(jìn)行《黑客帝國(guó)》續(xù)集中的紋理空間模糊(Texture Space Blur)面部渲染方法
?
GDC 2007有一場(chǎng)來自NVIDIA的talk “Advanced Skin Rendering”
(http://developer.download.nvidia.com/presentations/2007/gdc/Advanced_Skin.pdf.)中,其采用Texture Space Blur的技術(shù)即為《GPU Gems 3》中所描述的方案。
該技術(shù)在紋理空間做了6次高斯模糊,每一次高斯模糊即為偶極子(Dipole)近似所采用的高斯模糊的參數(shù),如下圖。Texture Space Blur有一個(gè)很嚴(yán)重的問題,需要較高的紋理分辨率,這導(dǎo)致每做一次高斯模糊都是很費(fèi)的操作,更不要說6次高斯模糊。雖然當(dāng)年這個(gè)技術(shù)取得的效果很不錯(cuò),但是因?yàn)橛?jì)算量等原因,很少有人實(shí)際去采用。
圖 《GPU Gems 3》中改進(jìn)的紋理空間模糊(Texture Space Blur)算法綜述
紋理空間模糊(Texture Space Blur)進(jìn)行Combining blurs操作的相關(guān)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標(biāo)記過的Skin的像素,極大地降低了Blur的像素?cái)?shù)目,可以很大程度的提升性能。
該算法計(jì)算過程中會(huì)對(duì)Stencil標(biāo)記出的皮膚材質(zhì)進(jìn)行若干次卷積操作,卷積核的權(quán)重由擴(kuò)散剖面(Diffusion Profile)確定,而卷積核的大小則需要根據(jù)當(dāng)前像素的深度(d(x,y))及其導(dǎo)數(shù)(dFdx(d(x,y))和dFdy(d(x,y)))來確定。
圖 屏幕空間模糊(Screen Space Blur)思路概覽
?
圖 屏幕空間模糊(Screen Space Blur)算法流程圖
?
圖 屏幕空間模糊(Screen Space Blur)
?
從原理上來說,圖像空間的方法和屏幕空間的方法很大程度上都是通過周邊像素對(duì)當(dāng)前像素的光照貢獻(xiàn)來實(shí)現(xiàn)次表面散射的效果,區(qū)別不大,方法之間的區(qū)別通常只是在于如何去近似擴(kuò)散剖面(Diffusion Profile),在性能和效果上有一個(gè)較好平衡。
?
六、其他皮膚渲染技術(shù)
?
6.1 半透明陰影貼圖(Translucent Shadow Maps,TSMs)
?
《GPU Gems 3》中,通過改進(jìn)半透明陰影貼圖(Translucent Shadow Maps,TSMs)來實(shí)現(xiàn)皮膚渲染中透射效果的模擬。
考慮到紋理空間漫散射(Texture-Space Diffusion)不會(huì)很好地模擬在三維空間中非常接近的表面光通過透光區(qū)域的完全透射效果(如耳朵和鼻孔處桔紅色的視覺外觀)。《GPU Gems 3》改進(jìn)了半透明陰影貼圖(Translucent Shadow Maps,TSMs)(Dachsbacher and Stamminger 2004)方法,通過重用卷積過的輻照度紋理,能非常有效地估計(jì)通過較薄區(qū)域的漫散射。
圖 《GPU Gems 3》中改進(jìn)的Translucent Shadow Maps思路圖示
?
圖 在陰影區(qū)域計(jì)算透射光
另外,ShaderX7中的“Real-Time Subsurface Scattering using Shadow Maps”也介紹了類似的使用陰影貼圖(Shadow Maps)來進(jìn)行次表面散射模擬的方法。
圖 Rendering AAA-QualityCharacters of Project ‘A1’ @ NDC 2016 Programming Session
?
6.2 預(yù)積分的皮膚渲染(Pre-Integrated Skin Rendering)
?
預(yù)積分的皮膚著色(Pre-Integrated Skin Shading)在《GPU Pro 2》的” Pre-Integrated Skin Shading”一文中正式進(jìn)入大家的視野。
預(yù)積分的皮膚著色(Pre-Integrated Skin Shading),其實(shí)是一個(gè)從結(jié)果反推實(shí)現(xiàn)的方案,具體思路是把次表面散射的效果預(yù)計(jì)算成一張二維查找表,查找表的參數(shù)分別是dot(N,L)和曲率,因?yàn)檫@兩者結(jié)合就能夠反映出光照隨著曲率的變化。
圖 預(yù)積分的皮膚著色(Pre-Integrated Skin Shading)思路。
【左上:如何使用兩個(gè)導(dǎo)數(shù)同時(shí)繪制曲率的圖示。|右上:通過曲率(球面半徑)和N·L索引的漫反射BRDF查找(The diffuse BRDF lookup)|下:使用該方法新的BRDF查找不同r大小,渲染渲染出的多個(gè)球體】
通過下圖可以發(fā)現(xiàn),預(yù)積分方法和紋理空間漫散射(Texture-Space Diffusion)的渲染效果在肉眼觀察下看不出太多差別,但預(yù)積分的方法計(jì)算量卻要小很多。
圖 預(yù)積分方法對(duì)比紋理空間漫散射(Texture-Space Diffusion)方法
另外,最終幻想15中的人物皮膚渲染,大量用到了預(yù)積分的皮膚渲染,如下圖中的希德妮的渲染效果:
圖 基于 Pre-Integrated Skin Shading的《最終幻想15》希德妮渲染圖【(左圖:離線渲染,右圖:游戲?qū)崟r(shí)渲染】
關(guān)于預(yù)積分的皮膚渲染(Pre-Integrated Skin Rendering)的更多細(xì)節(jié),可見《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個(gè)高斯模糊需要12個(gè)pass(一個(gè)高斯模糊對(duì)應(yīng)一個(gè)水平和垂直模糊)。
暴雪的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個(gè)Pass來近似,效率更進(jìn)一步提升,這是目前游戲里采用的主流技術(shù),Unreal也對(duì)其進(jìn)行了集成。
?
圖 可分離卷積(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)與光線步進(jìn)(Ray Marching)
?
路徑追蹤次表面散射(Path-Traced Subsurface Scattering)也有時(shí)被稱作蒙特卡洛次表面散射(Monte-Carlo Subsurface Scattering),區(qū)別于傳統(tǒng)的光柵圖形學(xué),是光線追蹤流派下模擬次表面散射的技術(shù),主要是基于Ray Marching的實(shí)現(xiàn)方案。
在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’也有一些介紹,相關(guān)PPT頁(yè)面如下:
圖 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
?
另外也有結(jié)合延遲渲染的方法,具體思路可見如下PPT:
圖 Rendering AAA-QualityCharacters of Project ‘A1’ @ NDC 2016 Programming Session
?
七、本文內(nèi)容總結(jié)
?
以下是本文內(nèi)容總結(jié),即對(duì)當(dāng)前業(yè)界真實(shí)感皮膚渲染技術(shù)的總結(jié):
1. 皮膚渲染建模
皮膚渲染過程可由兩個(gè)分量組成:
- 鏡面反射(specular reflection)
- 次表面散射(subsurface scattering)
其中,次表面散射的真實(shí)感模擬,是主要難點(diǎn)。
2. 鏡面反射部分
鏡面反射(specular reflection)部分的光照模型可用:
- Torrance-Sparrow
- Kelemen and Szirmay-Kalos specular BRDF
- 基于物理其他高光模型
其中,Kelemen and Szirmay-Kalos specular BRDF在實(shí)現(xiàn)和Torrance-Sparrow模型一樣的渲染效果時(shí),計(jì)算量要小得多。
3. 次表面散射部分
3.1 擴(kuò)散剖面(Diffusion Profile)
擴(kuò)散剖面(diffusion profile)是描述光線如何在半透明物體中進(jìn)行擴(kuò)散和分布的函數(shù)。
與擴(kuò)散剖面常一起出現(xiàn)的三種方法:
- 偶極子(Dipole)方法
- 多級(jí)子(Multipole)方法
- 高斯和(Sum-of-Gaussians)方法
它們都是更好地描述出擴(kuò)散剖面(Diffusion Profiles)的一些策略。得到擴(kuò)散剖面(diffusion profile),即光線是如何在半透明物體中進(jìn)行擴(kuò)散和分布之后,接下來就可以對(duì)附近的像素進(jìn)行加權(quán)求和,以模擬次表面散射的效果。這個(gè)求和的過程其實(shí)是根據(jù)擴(kuò)散剖面(diffusion profile)的指導(dǎo),對(duì)周圍像素進(jìn)行模糊操作。
按操作空間劃分,常規(guī)的思路有兩種:
- 紋理空間模糊(Texture Space Blur)
- 屏幕空間模糊(Screen Space Blur),也稱屏幕空間次表面散射(Screen Space SubSurfaceScattering)或SSSSS。
3.2 其他皮膚渲染技術(shù)
- 半透明陰影貼圖(Translucent Shadow Maps,TSMs)
- 預(yù)積分的皮膚渲染(Pre-Integrated Skin Rendering)
- 可分離的次表面散射(SSSS , Separable Subsurface Scattering)
- 路徑追蹤次表面散射(Path-Traced Subsurface Scattering)與光線步進(jìn)(Ray Marching)
- Deferred Single Scattering
?
4. 皮膚渲染技術(shù)發(fā)展史
- 次表面光照傳輸模型(Subsurface Light Transport, SSLT)[2001]
- 擴(kuò)散剖面(Diffusion Profile) [2001]
- 偶極子(dipole) [2001]
- 紋理空間模糊(Texture Space Blur)[2003]
- 多極子(multipole) [2005]
- 屏幕空間模糊(Screen Space Blur)或屏幕空間次表面散射(SSSSS,Screen Space SubSurface Scattering)[2009]
- 路徑追蹤次表面散射(Path-Traced Subsurface Scattering)與光線步進(jìn)(Ray Marching)[2009]
- 預(yù)積分的皮膚著色(Pre-Integrated Skin Shading)[2010]
- 可分離的次表面散射(SSSS,Separable Subsurface Scattering)[2015]
- 等
?
八、本文的GitHub版
不少朋友們喜歡看GitHub版本的文章,我也很喜歡。
首先,MarkDown可以很方便地插入快捷導(dǎo)航目錄,能進(jìn)行瞬間跳轉(zhuǎn)到指定子章節(jié)。其次,GitHub版本的文章中沒有單篇文章的字?jǐn)?shù)限制,少了很多篇幅方面的桎梏。而且因?yàn)镚it的便利性,版本管理的優(yōu)勢(shì),最新的勘誤和修訂,以及新文章的更新,第一時(shí)間會(huì)在GitHub的Repo中進(jìn)行。
【本文的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
?
九、參考文獻(xiàn)
?
[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
總結(jié)
以上是生活随笔為你收集整理的【GPU精粹与Shader编程】(六) 《GPU Gems 3》:真实感皮肤渲染技术总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Burp Suite使用介绍说明
- 下一篇: UIView转UIimage