前言:
本文是我在學(xué)習(xí)Marschner毛發(fā)渲染理論時(shí)做的一點(diǎn)梳理阶冈,同時(shí)呢解藻,也有一些對(duì)學(xué)習(xí)過(guò)程中遇到的有意思的公式背后的物理原理的心得理解孝治,如果你和我一樣出于興趣或是別的什么原因损痰,剛開始接觸毛發(fā)渲染理論福侈,那么不妨看看本文,應(yīng)該會(huì)對(duì)你有所幫助卢未。PS. 又是忙碌的一個(gè)月肪凛,各種擠時(shí)間,好在利用封控在家省下的通勤時(shí)間辽社,于月底前趕完進(jìn)度伟墙,提交了本文,也算落下了一件心事 :)
回顧KajiyaKay模型:
Kajiya Kay發(fā)絲模型是一種不透明的單圓柱滴铅,在垂直于發(fā)絲的朝向(fiber direction)上觀察高光走向戳葵。該模型提出由平行入射光束所激發(fā)的散射中(scattering),高光反射部分(specular)遵循圓錐(cone)分布汉匙,圓錐的朝向就是光線沿發(fā)絲軸向的朝向拱烁,圓錐的中心位于入射光束與發(fā)絲表面的接觸位置;而漫反射(diffuse)部分則正比于觀察角度與發(fā)絲表面夾角的余弦噩翠。具體可參考圖[1]戏自。
下面來(lái)說(shuō)說(shuō)Kajiya Kay模型的缺點(diǎn):其一是能量不守恒,也就是說(shuō)渲染方程并非是基于物理的伤锚;其二是無(wú)法利用該渲染方程復(fù)現(xiàn)出發(fā)絲的許多其他光學(xué)特性擅笔,這主要是因?yàn)槔碚撃P捅旧淼娜毕荩炔徽J(rèn)為發(fā)絲是一種透明的電介質(zhì),同時(shí)也沒(méi)有考慮到發(fā)絲表面的特殊幾何構(gòu)造)
Marschner模型基礎(chǔ):
Marschner等人在KajiyaKay的基礎(chǔ)上,結(jié)合自己和同行對(duì)人體發(fā)絲的進(jìn)一步觀察實(shí)驗(yàn)猛们,提出了更為全面和準(zhǔn)確的物理與數(shù)學(xué)模型念脯。
簡(jiǎn)便起見,我們先從解剖學(xué)角度切入阅懦。人體的毛發(fā)可以大體上分為3個(gè)主要成分和二,它們分別是表面的角質(zhì)層(cuticle),填充內(nèi)部大量空間的皮質(zhì)層(cortex)以及最內(nèi)層的髓質(zhì)(medulla)耳胎。首先說(shuō)說(shuō)角質(zhì)惯吕,它是包裹在發(fā)絲最外層的是一種組織,很薄怕午,形如瓦片般層層堆疊废登,互相依附從而構(gòu)成了發(fā)絲的外層幾何形態(tài),上圖是毛發(fā)的經(jīng)向切面郁惜,注意兩側(cè)外沿的鋸齒形太堡距,它們正是角質(zhì)層在2D平面上投影的幾何形狀。相對(duì)于發(fā)絲的軸向(root -> tip)方向兆蕉,這種階梯狀的構(gòu)造會(huì)在局部形成很小的角度偏折α
羽戒,使局部微表面的法線沿著逆發(fā)絲朝向(root到tip為正)同樣偏移α
度。在宏觀上觀察的結(jié)果就是虎韵,頭發(fā)的高光主部(primary specular peak)會(huì)比原先預(yù)計(jì)出現(xiàn)的位置更加靠向發(fā)絲根部一些易稠,偏移的程度按照反射定律推算應(yīng)該在2α
度左右。
實(shí)驗(yàn)顯示包蓝,在入射光的另一側(cè)存在第二波瓣(secondary lobe)驶社,屬于透過(guò)發(fā)絲上下兩個(gè)表面后再次進(jìn)入空氣的光的分量。引入第二波瓣可謂革新了KajiyaKay模型對(duì)發(fā)絲提出的不透明的假設(shè)测萎。實(shí)際上充斥在角質(zhì)層內(nèi)部的大量皮質(zhì)組織是具有透光性的(特別是對(duì)棕色或金色等淺色發(fā)絲而言)亡电,但是皮質(zhì)層內(nèi)部也沉淀有少許色素(pigment),會(huì)對(duì)某些波長(zhǎng)μ
的光波產(chǎn)生吸收作用硅瞧,從而表現(xiàn)出對(duì)出射光的染色份乒。說(shuō)到染色,不得不提在實(shí)驗(yàn)中觀察到的第二高光主部(secondary specular peak)腕唧,它們一般位于入射光的同一側(cè)冒嫡,相較第一高光主部來(lái)說(shuō),會(huì)更靠近發(fā)梢一處(靠近tip)四苇,宏觀上看起來(lái)就像一條染了色的次級(jí)高光帶。論文認(rèn)為這個(gè)第二高光來(lái)自于經(jīng)歷了內(nèi)壁反射后再次折射出的光線分量方咆,具體光路是這樣的:首次折射進(jìn)入皮質(zhì)的光線在發(fā)絲另一個(gè)表面上發(fā)生了反射(角質(zhì)與皮質(zhì)月腋,角質(zhì)與空氣之間),而后再次穿透發(fā)絲外壁,折射進(jìn)入空氣榆骚。由于多次在發(fā)絲內(nèi)部傳播片拍,第二高光的光強(qiáng)會(huì)有所削弱,同時(shí)被皮質(zhì)染色妓肢。此外論文中還提到黑色頭發(fā)這條第二高光帶不明顯(可能是黑色素對(duì)光波吸收能力太強(qiáng)所致吧)捌省。
最后一種頭發(fā)的成分組織叫髓質(zhì)(medulla),它是位于發(fā)絲中心碉钠,且更加致密纲缓,相比皮質(zhì)含有更多的色素。一般認(rèn)為人類發(fā)絲的髓質(zhì)占比較低喊废,因此很多論文在討論毛發(fā)的光照特性時(shí)會(huì)忽略這部分組織祝高,另一方面,近年來(lái)的研究發(fā)現(xiàn)污筷,對(duì)于自然界中的大部分動(dòng)物來(lái)說(shuō)工闺,髓質(zhì)是其毛發(fā)的主要組成部分,也是光照計(jì)算不可忽略的重要成分瓣蛀,這個(gè)后續(xù)有空再說(shuō)陆蟆。
回到圖[2]所示的毛發(fā)橫剖面,Marschner依據(jù)之前的觀察與分析惋增,將毛發(fā)的散射光歸類成三個(gè)最主要的成分叠殷,分別命名為R項(xiàng), TT項(xiàng)以及TRT項(xiàng)。其中字母R代表反射(Reflection)器腋,字母T則代表折射(Transmission)溪猿,字母的排列則代表了光路,非常簡(jiǎn)明形象纫塌。我們知道單獨(dú)一個(gè)R代表了入射既反射的第一高光主部诊县;TT則代表發(fā)絲反面的透射波瓣分部,因?yàn)樗鼇?lái)自入射光經(jīng)過(guò)兩次折射后形成的散射措左;最后TRT表示的是第二高光部依痊,暗示其光路軌跡由一次透射(進(jìn)入皮質(zhì)層)+ 一次反射(在發(fā)絲對(duì)側(cè)的角質(zhì)層前)+ 一次折射(重新進(jìn)入空氣)構(gòu)成。特別注意的是怎披,由于角質(zhì)層微表面固有的傾斜角α
胸嘁,會(huì)讓第一高光和第二高光沿著相反的方向偏移,從而在宏觀視覺(jué)層面顯示出明顯分離開來(lái)的兩種顏色的高光帶凉逛,這在圖[2]中也非常明顯的表示了出來(lái)性宏。
基礎(chǔ)數(shù)學(xué)建模:
在我們真正深入理解Marschner提出毛發(fā)渲染理論前,最好先對(duì)毛發(fā)與光交互的物理過(guò)程有一個(gè)比較清晰的數(shù)學(xué)模型状飞,定義其中的重要符號(hào)與變量毫胜。如圖[3]所示书斜,我們看到右上方有發(fā)絲的3D模型及其橫截面,一張巨大的矩形平面(橫截面或法平面)位于圖[3]中間酵使,此外還有許多分布于其上的矢量和角度荐吉,具體而言它們是:
- u (軸向矢量):表示沿著發(fā)根朝向發(fā)梢的方向,對(duì)于彎曲的頭發(fā)口渔,它代表在當(dāng)前研究的截面所處位置的切線方向样屠。
- v-w 平面 (法平面):該平面和方向矢量u合并構(gòu)成右手坐標(biāo)系,平面中v軸方向沿著發(fā)絲橫截面中的長(zhǎng)軸方向缺脉,w方向沿發(fā)絲截面的短軸方向痪欲。(發(fā)絲截面被認(rèn)為是橢圓)
- ωi(光源方向):定義了計(jì)算過(guò)程中使用的入射光方向,ωi和u共同決定了入射光平面(圖中包括了矢量ωi的矩形邊框)
- θi(入射角枪向,或入射天頂角):定義了入射光與法平面之間的夾角勤揩,該夾角在入射光平面上,從該平面與法平面交線開始秘蛔,轉(zhuǎn)到光源方向?yàn)橹埂?/li>
- φi(入射方位角):定義為從法平面v軸轉(zhuǎn)向入射平面與法平面交線為止陨亡。
- ωr (散射光方向):通常這是我們想要求取的目標(biāo)矢量,我們對(duì)其方向和強(qiáng)度都是感興趣深员,不同情況下负蠕,它可以用來(lái)表示R,TT和TRT中的任意一種出射光矢量。
- θr (散射角倦畅,或散射天頂角):類似θi遮糖,從散射光平面與法平面交線開始,轉(zhuǎn)到散射光矢量為止叠赐。
- φr (散射方位角):類似φi欲账,從法平面v軸轉(zhuǎn)到兩平面交線為止。
如何在宏觀上描述這種既包含了透射又存在反射的物理過(guò)程呢芭概?通常人們使用BRDF和BTDF來(lái)描述在反射與透射光照計(jì)算時(shí)赛不,出射光亮度與入射光輝度之比,這兩個(gè)分量合并在一起也有個(gè)名字罢洲,叫BSDF(雙向散射分布函數(shù))踢故,不妨定義為S:
其中分子中的L表示沿出射方向單位立體角,單位弧長(zhǎng)惹苗,單位時(shí)間內(nèi)發(fā)散出的光能量(通常也叫光強(qiáng)度)殿较;而分母E則是單位弧長(zhǎng)段占有的面積,單位時(shí)間內(nèi)接受到的光能量(也叫輝度)桩蓉。對(duì)于分母E我們還能將其轉(zhuǎn)換為來(lái)自各個(gè)方向入射光亮度的積分淋纲,因此有 dE(ωi) = DL(ωi)cos(θi)dω
的關(guān)系,其中D表示發(fā)絲直徑院究。綜合起來(lái)帚戳,可以得到如下渲染方程的定義:
注意方程的積分區(qū)間是全空域(包含了正面的反射+散射玷或,以及背面的透射+散射)。由于毛發(fā)直徑一般是個(gè)常量片任,該公式中的D一般可以忽略。但是也可以看出蔬胯,更加粗的毛發(fā)會(huì)帶來(lái)更強(qiáng)的反射光澤对供。
構(gòu)建散射方程BSDF:
公式(1)和(2)中的散射方程S(ωi,ωr)
是一個(gè)4維的函數(shù)氛濒,在不考慮強(qiáng)度的前提下产场,任何一個(gè)方向矢量ω都需要天頂角分量θ
和方位角分量φ
來(lái)聯(lián)合表示,畢竟我們的要探討的問(wèn)題和現(xiàn)象發(fā)生在三維空間中的發(fā)絲身上舞竿,當(dāng)然期望散射方程S能夠在三維空間中正確描述光線在R京景,TT,TRT分量上的的散布性質(zhì)骗奖。為了降低函數(shù)S的復(fù)雜度确徙,Marschner一文將三維光場(chǎng)的計(jì)算拆分到了2個(gè)2D平面上:
如式[3]所示,等號(hào)右邊的第一項(xiàng)是狄拉克函數(shù)执桌,只有當(dāng)θi = -θr
時(shí)才返回1鄙皇,其余情況為0。這是基于前人對(duì)勻質(zhì)圓柱體色散研究形成的認(rèn)知:既光束以入射角度θi
照射圓柱體表面時(shí)所形成的高光散射只會(huì)分布在以-θi
為夾角仰挣,中心在入射點(diǎn)的圓錐面上(cone surface)伴逸,可參考圖[1]。由此可知膘壶,在計(jì)算有價(jià)值的反射光線時(shí)错蝴,只需要關(guān)注-θi
附近的反射分布即可,這消除了維度θr
的影響颓芭。上式中間項(xiàng)N表示的是發(fā)絲垂截面上不同方位角散射光線形成的概率分布顷锰,梳理這項(xiàng)稍微復(fù)雜點(diǎn),首先是符號(hào)η'
,它代表修正后的折射系數(shù)(IOR或者Index of Refraction),是關(guān)于投影前折射系數(shù)η
與投影角θ
的一個(gè)簡(jiǎn)單函數(shù)荠雕。因?yàn)锽ravais' Low告訴我們适揉,對(duì)電介質(zhì)表面來(lái)說(shuō),如果入射和折射向量被投影到了一個(gè)包含法線的平面上(此處為垂截面)唯竹,其投影向量仍然滿足Snell定律,只不過(guò)要使用依據(jù)投影角修正過(guò)的折射系數(shù)η'(θ)
替換原有的系數(shù)η
。N項(xiàng)中的另外2個(gè)參數(shù)分別是前面提到的入射方位角和出射方位角良狈,也都是在垂截面上的度量值,如果假設(shè)發(fā)絲截面是正圓形笨枯,那么對(duì)于φi
來(lái)說(shuō)薪丁,也有相應(yīng)的公式可以推導(dǎo)出φr
的方位遇西,這部分是后話了。最后我們看到等式右邊還除以了兩個(gè)cos(θ)
严嗜,這是針對(duì)對(duì)立體角投影的修正粱檀,每個(gè)cos(θ)
各自作用于一個(gè)方向上的投影。
上式是更加一般的形式漫玄,Marschner用M項(xiàng)代替了原先的狄拉克函數(shù)茄蚯,用以專職描述發(fā)絲橫切面(軸向切面,參考圖[2])上的散射分布睦优;另一方面N項(xiàng)維持形式不變渗常,專職描述垂截面(法平面)上光線散射分布的情況,此處不再贅述汗盘。
有意思的地方來(lái)了皱碘,為了找出N項(xiàng)的正確形式,Marschner一文引出了如下圖所示的法平面光路分析:
這張圖有幾層含義隐孽,我們從最簡(jiǎn)明直接的光路傳播開始癌椿。首先注意到光線從點(diǎn)L出發(fā)的,入射到發(fā)絲截面上的一點(diǎn)A后發(fā)生了折射和反射缓醋。其中的反射矢量沿著AR0返回空氣介質(zhì)如失,折射矢量則沿著AB射向發(fā)絲內(nèi)壁的另一側(cè),通過(guò)折射形成TT分量送粱,沿BR1返回空氣褪贵,最后在內(nèi)壁形成的反射矢量BC則于發(fā)絲另一表面C點(diǎn)處形成TRT分量,完成出射任務(wù)抗俄。我們定義入射角為γi
脆丁,折射角為γt
,那么有以下若干關(guān)鍵角度關(guān)系:內(nèi)壁反射角 ∠ABC = 2γt
动雹,形成TT分量的折射出射角為γi
(沿矢量BR1方向出射)槽卫,同樣形成TRT分量的入射和出射角亦是γt
和γi
。
我們定義光源矢量為AL(既從A指向L)胰蝠,順時(shí)針?lè)较驗(yàn)榉轿唤堑呢?fù)方向歼培,那么有:
- R:AL - 2γi
- TT:AL + π + 2*(γt - γi)
- TRT:AL + π + 2*(γt - γi) + (π + 2γt)
簡(jiǎn)單解釋一下,首次的反射方向AR0茸塞,也就是R分量的方向非常容易理解躲庄,它等于在光源矢量AL的基礎(chǔ)上繞著順時(shí)針?lè)较蛐D(zhuǎn)兩倍的γi角度,因?yàn)槎x了順時(shí)針?lè)较驗(yàn)榻嵌蓉?fù)方向钾虐,所以我們得到AR0等于在AL方向上作用一個(gè) -2γi
角度的選擇噪窘。
當(dāng)發(fā)生一次折射時(shí),從圖中可以看出光線會(huì)從折射前的狀態(tài)(入射光線LA)沿著順時(shí)針?lè)较颍ń嵌饶娣较颍┢垡粋€(gè) -(γi - γt)
度效扫,或者記成(γt - γi)
倔监,在形成TT前直砂,光線必然經(jīng)理了2回類似的折射,所以最終TT分量的出射角包含有2*(γt - γi)
浩习,至于上面為何還有一個(gè)落單的π静暂?那是因?yàn)?strong>AL方向是光源方向,要得到入射方向瘦锹,必須對(duì)AL矢量180°掉轉(zhuǎn)朝向籍嘹。
最后的TRT分量類似上面提及的TT,也經(jīng)歷了兩次折射弯院,同時(shí)由于包含了一次反射,需要使用一個(gè)(π + 2γt)
轉(zhuǎn)向操作來(lái)描述泪掀,其意義在于先對(duì)入射光線AB掉頭成為BA听绳,然后讓BA沿著逆時(shí)針(正角度)方向旋轉(zhuǎn)2γt
度,怎么樣异赫,結(jié)合圖示很容易理解吧椅挣!
Marschner使用了一個(gè)非常聰明的公式統(tǒng)一了上式光線路徑的轉(zhuǎn)變:
它的參數(shù)p
代表迭代次數(shù),比如對(duì)于R來(lái)說(shuō)p = 0
塔拳,TT時(shí) p = 1
鼠证,TRT則意味著p = 2
,Marschner在論文里認(rèn)為當(dāng) p > 2
時(shí)產(chǎn)生的影響可以忽略不計(jì)靠抑。至于上式中的變量h
量九,其定義是入射光線到圓心的最短距離,可以參考圖示中的線段h
颂碧。由于預(yù)設(shè)了發(fā)絲半徑為單位1(unit length)荠列,由三角函數(shù)我們可以很容易得到 sin(γi) = h
,同時(shí)通過(guò)Snell定律也能得到 η' * sin(γt) = 1 * sin(γi) = h
载城。由此可知肌似,引入變量h
的意義在于將彼此獨(dú)立的變量γt
和γi
統(tǒng)一到一個(gè)變量名下,以便后續(xù)計(jì)算诉瓦。
反過(guò)來(lái)川队,如果我們已知入射和出射方位角φi
和φr
,那么角度變化量 φ = φr - φi
也是已知的了睬澡,通過(guò)解算方程 Φ(p, h) - φ = 0
固额,可以得到h
的具體數(shù)值。論文中提及猴贰,當(dāng)p = 0 or 1
時(shí)对雪,這樣的方程求解只有一個(gè)根,但是當(dāng) p = 2
時(shí)米绕,方程會(huì)有1個(gè)或3個(gè)根瑟捣,而更多得根代表了更多的有效光路(ray path)馋艺,光路互相疊加會(huì)帶來(lái)能量的不連續(xù),Marschner認(rèn)為這些多光路的解析解在物理上代表了焦散(caustic)現(xiàn)象迈套,同時(shí)也是我們?cè)诤暧^上感到發(fā)絲細(xì)節(jié)處帶有閃爍(glint)的源頭捐祠。
圖[4]中的第二層含義是能量分布的守恒性,既對(duì)于一塊平坦的微表面而言桑李,所有入射光能等于所有出射光能(不考慮吸收的前提下)踱蛀。參考如下公式:
若定義單位弧長(zhǎng)的輝度為ê ,在采用了半徑為單位1的發(fā)絲模型中贵白,單位長(zhǎng)度的輻照度E可以寫作:E(h) = ê/2
率拒,其中 2 = 2 * 1 unit
,既兩倍的圓的半徑禁荒。那么上面雙等式中間項(xiàng)表示的自然是對(duì)投影到發(fā)絲截面“邊條”上(此時(shí)為1維)的輻射照度E在發(fā)絲直徑線段上的微分猬膨,它等于左側(cè)項(xiàng)所表示的:在以h
確立的出射立體角方向上,出射光亮度對(duì)方位角的微分呛伴。多少有點(diǎn)拗口勃痴,但是本質(zhì)意思就是利用了能量守恒定理來(lái)把弧度相關(guān)的出射光亮度與弧度相關(guān)的入射光輝度聯(lián)系在了一起(目前還沒(méi)考慮吸收,當(dāng)然電介質(zhì)一般認(rèn)為吸收不多啦)热康。
有了上述聯(lián)系沛申,再加上吸收系數(shù)T以及菲涅爾項(xiàng)F就能得到比較完整的N項(xiàng)了。增加后大致上上式可轉(zhuǎn)換為如下形式:
當(dāng)p = 0
時(shí)姐军,A項(xiàng)的形式可以方便獲得:
此時(shí)沒(méi)有任何光路經(jīng)過(guò)發(fā)絲內(nèi)部的皮質(zhì)層铁材,故忽略吸收分量,只余下比較傳統(tǒng)的Fresnel項(xiàng)庶弃,它是個(gè)關(guān)于表面介質(zhì)系數(shù)以及入射角度的函數(shù)衫贬,記作F。
當(dāng)p > 0
時(shí)歇攻,Marschner給出了如下近似:
該式模擬了p
次菲涅爾反射的耗損固惯,同時(shí)最后一項(xiàng)T對(duì)進(jìn)入發(fā)絲內(nèi)部的光路長(zhǎng)度做了估算,并據(jù)此對(duì)光能進(jìn)行必要的衰減(模擬吸收)缴守,特別得葬毫,依據(jù)三角函數(shù)可近似獲取內(nèi)部光路長(zhǎng)度的計(jì)算公式,它等于發(fā)絲的半徑乘以 2 + cos(2γt)
屡穗,本文隨后會(huì)詳細(xì)闡明這個(gè)公式的物理意義贴捡,此處先略過(guò)。
綜合起來(lái)村砂,完整的垂截面(法平面)上的散射方程子項(xiàng)N可以做如下表示:
上式第一項(xiàng)告訴我們烂斋,N項(xiàng)將首先按照 p
(折射)次數(shù)劃分為Nr,Ntt以及Ntrt三項(xiàng)。上式中第二項(xiàng)的求和區(qū)間為所有可能的光路汛骂,此處不用h
的原因是因?yàn)榻o定一個(gè)h
可能會(huì)產(chǎn)生多個(gè)解(root)罕模,而每個(gè)解都將對(duì)應(yīng)一條合法的光路,這點(diǎn)前文已經(jīng)提及過(guò)帘瞭。
解釋了略顯麻煩的垂切面分量N之后淑掌,再來(lái)看軸切面分量M會(huì)發(fā)現(xiàn)非常簡(jiǎn)單。前文已經(jīng)說(shuō)過(guò)蝶念,基于圓柱的觀察結(jié)果是所有的散射光線分布在鏡面反射方向的一個(gè)圓椎上抛腕,考慮到角質(zhì)層特有的幾何構(gòu)造會(huì)產(chǎn)生一定量的有向偏移,Marschner等人做了兩件簡(jiǎn)單暴力且有效的事情媒殉,第一就是通過(guò)實(shí)驗(yàn)觀察記錄軸向散射的具體分布担敌,從而解算出若干具有指標(biāo)意義的常量;第二廷蓉,采用歸一化高斯分布函數(shù)作為基礎(chǔ)柄错,采用第一步獲取到的參數(shù)進(jìn)行擬合,從而模擬出預(yù)期散射分布表達(dá)式苦酱。
具體參考上式,其中函數(shù)g
為剛剛提及的歸一化高斯函數(shù)给猾,θh
是入射和出射天頂角的半角值(這再次說(shuō)明圓柱散射只在鏡像反射角附近有意義疫萤,也就是只需要知道入射或反射角中的一個(gè)量即可,此處作者選用了它們二者和的一半來(lái)表征)敢伸,αr
表示軸向單次反射波瓣的偏移角扯饶,一般為-5°
~-10°
之間,αtt表示TT的出射波瓣偏移池颈,大約為-αr/2
尾序,而最后的αtrt
自然是TRT的出射波瓣偏移,被作者定義為大約-3αr/2
左右的度數(shù)躯砰。最后βr
每币,βtt
和βtrt
表示的是相關(guān)標(biāo)準(zhǔn)差(standard deviation)具體物理量亦可通過(guò)原文查詢,此處不再贅述琢歇。
我們來(lái)總結(jié)一下到目前為止梳理的部分重要內(nèi)容:Marschner理論認(rèn)為一束打到發(fā)絲上的光線會(huì)被分散到以入射點(diǎn)為中心兰怠,沿著發(fā)絲軸向的一個(gè)圓錐面上,而在面上的散射光線可以被歸納為三個(gè)主要的分量李茫,它們是來(lái)自一次反射的R分量揭保,經(jīng)過(guò)兩次透射后從另一側(cè)出射的TT分量,以及透射并在內(nèi)部上形成反射而后再次出射的TRT分量魄宏。對(duì)于每一個(gè)分量秸侣,Marschner將復(fù)雜的空間關(guān)系拆分到兩個(gè)2D平面上,它們分別是垂直于發(fā)絲的法平面投影以及平行與發(fā)絲軸向的橫切面投影,各自以N和M表示味榛,控制參數(shù)分別是天頂角θ
和方位角φ
椭坚。于是我們有了如下形式的BSDF方程:
實(shí)時(shí)渲染之路
從理論來(lái)到實(shí)踐還有不少路要走,特別是在實(shí)時(shí)渲染領(lǐng)域励负,我們沒(méi)有那么多資源去逐根逐點(diǎn)計(jì)算光路藕溅,也不會(huì)有很多算力可以分給復(fù)雜的采樣積分運(yùn)算,所有就必須靈活取舍继榆,找到可接受的近似來(lái)加速渲染巾表。
多重散射(Multiple scattering)
這個(gè)概念是之前梳理Marshner論文時(shí)不曾提及的部分,然而對(duì)于非光照模型來(lái)說(shuō)它又至關(guān)重要略吨。多重散射簡(jiǎn)言之就是那些來(lái)自發(fā)絲與發(fā)絲之間的多次彈射并最終落入攝像機(jī)的那部分光能集币。頭發(fā)并不是一根根孤立的個(gè)體,而是一簇簇的發(fā)絲聚合翠忠,多重散射的本質(zhì)就是以發(fā)絲聚合體為單位所發(fā)出的一種漫反射(diffuse)鞠苟,理論上它沒(méi)有特別得傳播方向,理想狀況下就如同普通散射一般秽之,多重散射會(huì)與發(fā)絲簇的宏觀法線以及入射光線方向夾角的余弦相關(guān)当娱,此外還可以納入陰影強(qiáng)度 (shadow),并考慮上頭發(fā)的基礎(chǔ)顏色考榨。業(yè)界相對(duì)流行的模擬方案是UE4提出的基于Kajiya Kay模型改進(jìn)來(lái)的計(jì)算公式:
簡(jiǎn)單羅列下幾個(gè)關(guān)鍵量的含義:
- albedo:頭發(fā)基礎(chǔ)色跨细。
-
n:被UE4定義為fake normal,可用公式
n = normalize(v - N * (N dot v))
計(jì)算得到河质,該公式中的矢量N指代發(fā)絲宏觀法線冀惭。 - shadow:來(lái)自采樣獲得的光照衰減系數(shù),是個(gè)0~1之間的數(shù)值掀鹅。
-
Luma:從albedo中提取的lum值散休,可參考公式:
dot(albedo, (.3,.59,.11))
計(jì)算獲得。
參考代碼實(shí)現(xiàn):
//c(olor) or albedo, m(etallic), l(ight), v(iew), n(ormal), s(hadow)
float3 KajiyaDiffuse(float3 C, float m, float3 l, float3 v, float3 n, float s){
float KajiyaDiffuse = 1 - abs(dot(n, l));
float3 fakeNormal = normalize(v - n * dot(v, n));
n = fakeNormal;
float Wrap = 1;
float NoL = saturate((dot(n ,l) + Wrap) / pow2(1 + Wrap));
//漫反射項(xiàng)的另一種近似乐尊,考慮了表面金屬度
float diffuseScatter = (1 / UNITY_PI) * lerp(NoL, KajiyaDiffuse, 0.33) * m;
float3 Luminance = (0.3f, 0.59f, 0.11f);
float luma = dot(C, Luminance);
float3 ScatterTint = pow(abs(C / luma), 1 - s);
return sqrt(abs(C)) * diffuseScatter * ScatterTint;
}
軸向散射函數(shù)M
文獻(xiàn)里一般會(huì)叫 Longitudinal scattering function戚丸,在Marschner的原文里給出的建議是使用高斯函數(shù)G作為描述散射在圓錐面上光線的分布。UE4在2016的文章里也提到了他們的方案科吭,對(duì)于第一次反射分量Mr昏滴,他們采用了效果更好但是更加昂貴的Weta模型[1],同時(shí)參考如下:
簡(jiǎn)單說(shuō)明下參數(shù):
- v = λ^2
-
I (
cosθicosθr/v
) 是第一類修正貝塞爾函數(shù)(Modified Bessel function of first kind) - λ 一般認(rèn)為是與roughness有關(guān)的參數(shù)对人,也可以認(rèn)為是角質(zhì)層傾斜角寬度(longitudinal width)
UE4之所以不惜代價(jià)在計(jì)算Mr時(shí)采用Weta的方案谣殊,主要在于這個(gè)模型是能量守恒的,對(duì)于基于物理的環(huán)境光牺弄,能給出相比高斯G更加真實(shí)的輻射亮度估計(jì)斜筐。
對(duì)于Mtt和Mtrt這兩項(xiàng),UE4與Unity的HDRP都采用了基于高斯模型饭豹,具體參考如下公式:
同樣說(shuō)明一下參數(shù):
- λ : 與roughness相關(guān)的參數(shù)
- α :軸向的偏移角,一般可以暴露給藝術(shù)家調(diào)節(jié)
基本上就是利用了高斯函數(shù)的一些特性抚恒,例如:
- 連續(xù)性,光線分布不間斷络拌。
- 期望(既偏移角
α
)處達(dá)到極致俭驮,用以模擬高光在角質(zhì)層瓦片結(jié)構(gòu)的驅(qū)使下的角度偏移。 - 用關(guān)聯(lián)粗糙度的參數(shù)控制方差春贸,使得相對(duì)粗糙的發(fā)質(zhì)能夠得到更加均勻的散射混萝,而光滑的發(fā)質(zhì)高光集中的特性。
參考代碼實(shí)現(xiàn):
Mp = Hair_G(roughness, ThetaH - Alpha[0]);
//Gaussian Distribution for M term
//B->λ萍恕, theta->α
inline float Hair_G(float B, float Theta)
{
return exp(-0.5 * square(Theta) / (B*B)) / (SQRT2PI * B);
}
垂面(方位角)散射函數(shù)N
文獻(xiàn)里這部分叫做Azimuthal scattering function逸嘀,這個(gè)函數(shù)與出射,入射光線在垂截面上的投影矢量有關(guān)允粤,如果涉及到透射過(guò)程崭倘,那么還會(huì)和發(fā)絲的折射率相關(guān)(不考慮吸收)。和M項(xiàng)類似类垫,求取N項(xiàng)前會(huì)拆分成Nr司光,Ntt和Ntrt三項(xiàng)分別進(jìn)行。
Nr
Nr在三個(gè)垂面散射函數(shù)中悉患,屬于相對(duì)簡(jiǎn)單同時(shí)很獨(dú)特的一種飘庄,值得單獨(dú)拿出來(lái)說(shuō)說(shuō)。以UE4為例:Nr(φ) ∝ cos(φ/2)
购撼,既入射光線經(jīng)表面的直接反射(R)分量在法平面上的投影所形成的概率分布,將正比于方位角φ
一半的余弦值谴仙,具體有如下公式:
參數(shù):
- φ = φr - φi迂求, 既入射和出射光線在法平面上投影線段的夾角
在討論上述公式的幾何意義前首先需要明確一個(gè)之前沒(méi)有清晰闡明的認(rèn)知:我們所考察的每一條入射光束(如下圖矢量LO)在到達(dá)發(fā)絲表面后都將會(huì)以入射點(diǎn)(o)為中心,向四周散射開去晃跺,形成一個(gè)圓錐揩局,如下圖所示:
首先我們引出三條典型的反射光線oa,ob和oc掀虎,同時(shí)定義入射光線Lo與發(fā)絲軸線u這兩個(gè)向量構(gòu)成平面A凌盯。假設(shè)中間的反射光線oa也位于平面A內(nèi),說(shuō)明向量Lo, oa和軸線u共面烹玉,又因?yàn)檩S線u垂直于法平面驰怎,說(shuō)明平面A也垂直于法平面,從而我們可以判斷:入射光線Lo與出射光線oa在垂截面(法平面)上投影矢量形成的方位角將會(huì)完全相等二打,也就是:φr - φi = 0
. 依據(jù)Nr的定義(cos(0) = 1
)县忌,反射光線oa在它的眾多兄弟姐妹中(ob,oc等)是亮度最高的那一個(gè)(取到極大值)。至于圖中向左右側(cè)偏移的反射光線ob和oa症杏,它們必然不在平面A上装获,且隨著向左右偏移得越遠(yuǎn),反射矢量在法平面上的投影向量所形成的方位角也會(huì)慢慢遠(yuǎn)離它們的兄弟oa所形成的方位角厉颤,結(jié)果就是φ = φr - φi
將會(huì)逐漸增大穴豫,直到發(fā)絲的另一側(cè),此時(shí)φ = π
逼友,對(duì)應(yīng)cos(φ/2) = cos(π/2) = 0
精肃,從而形成最弱的反射強(qiáng)度(取到極小值)。這就是為什么Nr使用cos(φ/2)
近似是可行的翁逞,它模擬了光線隨方位角變化而衰減的物理現(xiàn)象肋杖,雖然不一定精確。
Ntt和Ntrt
一旦折射光進(jìn)入發(fā)絲內(nèi)部后挖函,光路解算起來(lái)就會(huì)變得相對(duì)復(fù)雜許多状植,相信大家在讀Marschner原文有關(guān)內(nèi)容時(shí)就有所體會(huì)≡勾總體來(lái)說(shuō)提升的復(fù)雜度落在兩處津畸,其一是衰減項(xiàng)(Attenuation term),其二是方位角分布函數(shù)Dp:
上式積分號(hào)中的A就是衰減項(xiàng)必怜,它通橙馔兀可以拆分為兩部分,一部分因折射定律引起梳庆,通過(guò)折射率η
和入射角計(jì)算光線折射或反射的占比暖途,可由菲涅爾項(xiàng)F定義;另一部分作為吸收項(xiàng)(absorption term)膏执,用于估算光能在發(fā)絲內(nèi)部傳播時(shí)被色素吸收從而衰減的程度驻售,它是一個(gè)由光線波長(zhǎng)μ
與長(zhǎng)度h
(入射光所在直線到圓心的距離)定義的函數(shù)T,后續(xù)會(huì)展開更米。
至于積分式中的方位角分布函數(shù)Dp欺栗,我們可以認(rèn)為它是一個(gè)均值為0的高斯分布,當(dāng)D的入?yún)?征峦,既 φ - Phi(p, h) = 0
時(shí)取到極大值迟几。這里被減數(shù)φ
表示待測(cè)的方位角變化量(φr - φi
),減數(shù)是一個(gè)函數(shù)栏笆,它通過(guò)確定內(nèi)部反射次數(shù)(由p
確定)以及原始入射角度(由h
確定)类腮,可以計(jì)算出當(dāng)前光路的實(shí)際出射方向。于是在一次積分片段中蛉加,當(dāng)給定一個(gè)h
存哲,我們能通過(guò)Dp估算出該光路對(duì)我們的目標(biāo)方位角φr
的貢獻(xiàn)度因宇,將全部的光路加總起來(lái)(通過(guò)對(duì)h
在-1到1區(qū)間積分來(lái)實(shí)現(xiàn))后,就能獲得目標(biāo)出射方向的最終光場(chǎng)分布了祟偷。以上就是d‘Eon在[1]中通過(guò)Weta模型求解發(fā)絲內(nèi)部光路所得的積分表達(dá)式察滑,已經(jīng)非常的簡(jiǎn)潔了,只是對(duì)于實(shí)時(shí)渲染的需求來(lái)說(shuō)任然太過(guò)復(fù)雜和昂貴修肠,我們需要更簡(jiǎn)潔近似贺辰。
菲涅爾衰減F
先說(shuō)菲涅爾衰減F,這里主要參考UE4的經(jīng)驗(yàn)嵌施,在對(duì)比了兩種相近的模型:d'Eon對(duì)Cook Torrence標(biāo)準(zhǔn)模型適用于圓柱形坐標(biāo)系的修改版饲化,和Marschner利用Bravais指數(shù)進(jìn)行推導(dǎo)的模型,最終選擇了標(biāo)準(zhǔn)模型:
f作為經(jīng)典菲涅爾計(jì)算公式吗伤,具有如下入?yún)⑿问剑?/p>
其中cos(arcsin(h))
是為了計(jì)算h邊對(duì)角的余弦值吃靠,即為求直角三角形另一條直角邊的值,因此計(jì)算公式也可以寫成這樣:
當(dāng)然在實(shí)際計(jì)算中足淆,一般選擇Schlick近似來(lái)模擬菲涅爾公式f:
其中η
為頭發(fā)的IOR巢块,具有測(cè)定值1.55,故F0
大約為0.0465巧号。
為了能求取h
族奢,我們需要先定義和推導(dǎo)以下公式:
符號(hào)η'
參考上文梳理Marschner投影折射率的段落,它是在法平面投影上的折射率丹鸿。上式第一項(xiàng)α
是給出的一個(gè)定義越走,后續(xù)會(huì)用。而中間項(xiàng)η'
的定義則是UE4提出的改良版折射率計(jì)算公式靠欢,從中我們可以看出廊敌,η'
是有關(guān)原始折射系數(shù)η
意思入射出射角關(guān)系θd
的函數(shù)。鑒于η = 1.55
门怪,η'
可以近似成(c/X) + c'X
這樣兩項(xiàng)之和庭敦,X
~cosθd
。
float eta_prime = 1.19 / CosThetaD + 0.36 * CosThetaD;
UE4依據(jù)Weta模型用于計(jì)算htt
的表達(dá)式:
應(yīng)用了一些我們熟悉的三角函數(shù)技巧(主要是二倍角公式)薪缆,將之變化為如下形式,注意此時(shí)等式兩倍皆為正值:
然而這個(gè)形式UE4任然不滿足伞广,認(rèn)為其既復(fù)雜又昂貴拣帽,于是一頓擬合和近似后給出了如下的最終形式:
這個(gè)公式中的所有參數(shù)我們或者已知,或者在上面已經(jīng)有了近似的獲取方法嚼锄,所以此時(shí)我們完成了在p = 1
情況下h
求解的梳理减拭,雖然這個(gè)近似htt
無(wú)法在負(fù)數(shù)域正確表示(近似過(guò)程中舍棄了符號(hào)sign),好在后續(xù)對(duì)h
的應(yīng)用中并沒(méi)有出現(xiàn)對(duì)符號(hào)的任何需求区丑,相安無(wú)事拧粪。
float a = rcp(eta_prime);
float Htt = CosHalfPhi * (1 + a * (0.6 - 0.8 * CosPhi));
至于p = 2
時(shí)修陡,也就是Htrt
,UE4直接給了個(gè)常量 Htrt = sqrt(3) /2
來(lái)參與Fresnel衰減計(jì)算可霎。
總結(jié)一下魄鸦,各部分菲涅爾項(xiàng)計(jì)算代碼可參考如下:
//R
//補(bǔ)充說(shuō)下,R項(xiàng)不涉及折射癣朗,所以無(wú)需考慮投影折射率η'和間距h的影響拾因,只需回歸純粹的BRDF公式中F項(xiàng)在三維空間中的定義即可
//入?yún)qrt(0.5f + 0.5f * LdotV)計(jì)算所得是VdotH的值,既cos(L與V夾角的一半)旷余,符合Schlick Fresnel關(guān)于cos(angle)參數(shù)的定義
float FRValue = Fresnel(sqrt(saturate(0.5f + 0.5f * LdotV)));
//TT
//通過(guò)計(jì)算獲得的Htt和cosθd構(gòu)成投影方向cos(angle)
float FTTValue = FAttenTT(Fresnel(cosThetaD * sqrt(saturate(1 - Htt * Htt))));
//TRT
//可見這種情況下Htrt被常數(shù)替代了
float FTRTValue = FAttenTRT(Fresnel(cosThetaD * 0.5f));
//Fp in Ap
//p = R, FR = fresnel. p = TT, FTT = fattentt. p = TRT, FTRT = fattentrt
float Fresnel(float cosAngle, float ior = 1.55){
float F0 = pow2((1 - ior) / (1 + ior));
return F0 + (1 - F0) * pow5(1 - cosAngle);
}
float FAttenTT(float Fresnel){
return pow2(1 - Fresnel);
}
float FAttenTRT(float Fresnel){
return pow2(1 - Fresnel) * Fresnel;
}
體積吸收項(xiàng)T
這項(xiàng)的最主要作用是為頭發(fā)提供染色绢记。我們回顧下電介質(zhì)固有色的物理意義:當(dāng)光線入射到電介質(zhì)表面,少部分光能被直接反射正卧,大量的光線會(huì)通過(guò)折射進(jìn)入物質(zhì)內(nèi)部蠢熄,其中一部分波長(zhǎng)的光子容易被散布在物體內(nèi)部的金屬離子或其他組織(色素)吸收從而完成染色,最后在若干次反射后再次折射出物體表面炉旷,形成散射光被人眼或攝像機(jī)捕捉到签孔。由此可見,吸收項(xiàng)T一定會(huì)帶有光波長(zhǎng)μ相關(guān)的參數(shù)以便對(duì)輸出的顏色進(jìn)行控制砾跃,此外T項(xiàng)還需要考慮在物質(zhì)內(nèi)傳播的路徑長(zhǎng)度骏啰,這和入射角相關(guān)(θ
和h
),也和反射次數(shù)有關(guān)(TT或TRT)抽高。最后非常明確的一點(diǎn)判耕,R項(xiàng)的體積吸收項(xiàng) T = 1
,沒(méi)有衰減翘骂!
以下是Marschner在論文中提出的吸收項(xiàng)T的形式:
結(jié)合圖[4]并利用余弦函數(shù)我們可以很輕易知道在垂截面上壁熄,單支投影光路的長(zhǎng)度為 2cos(γt)
,單次入射的最大光路(只考慮到p = 2
)為 2 * 2cos(γt) = 4cos(γt)
碳竟。這個(gè)函數(shù)隨著γ變化有正有負(fù)會(huì)比較麻煩草丧,所以Marschner使用 2 + 2cos(2γt)
做了近似,確保γ
無(wú)論處于什么角度莹桅,光路的長(zhǎng)度總是處在0~4倍的發(fā)絲半斤之間昌执。這部分投影光路長(zhǎng)度的估計(jì)對(duì)應(yīng)上式冪指數(shù)的分子上:1+cos(2γt)
部分,注意嘗試2已經(jīng)被提出诈泼。分子上的cos(θt)
也很好理解懂拾,因?yàn)閯偛诺拈L(zhǎng)度只是法平面投影長(zhǎng)度,考慮到光路在軸向上的傾角必然造成實(shí)際光路長(zhǎng)度的放大铐达,我們自然需要此彌補(bǔ)上這些軸向長(zhǎng)度損失岖赋。
上式中的σ
被Marschner定義為體積吸收因子,也就是路徑傳播越長(zhǎng)瓮孙,對(duì)顏色中某些分量的衰減就越大的意思唐断。
至于EXP
這種指數(shù)形式选脊,可以參考下圖對(duì)T(σ,h)
的模擬結(jié)果脸甘,橫軸為γt
恳啥,縱軸為輸出的衰減系數(shù):
當(dāng)折射角γt = 0
時(shí),表示光線垂直入射斤程,光線經(jīng)過(guò)圓形到另一側(cè)內(nèi)部后原路返回角寸,整個(gè)過(guò)程走了4 * radius
的長(zhǎng)度,認(rèn)為吸收幅度最大忿墅,所有輸出的衰減系數(shù)最低扁藕。當(dāng)入射角γt = π/2
時(shí),代表入射光線是以掠射角度照射頭發(fā)的疚脐,此時(shí)可以認(rèn)為折射不發(fā)生亿柑,或者只在很小的局部發(fā)生,故沒(méi)有顏色衰減棍弄,返回值如圖所示為1望薄。
OK,明白了原理之后呼畸,我們?cè)倏纯碪E4對(duì)此項(xiàng)做出的改進(jìn)痕支,首先他們做優(yōu)化的起點(diǎn)是皮克斯(Pixar)提出的簡(jiǎn)化版T項(xiàng):
其中ζ(C)
是輸入顏色的整體波長(zhǎng)。
UE4認(rèn)為折射角γt是可以進(jìn)一步求解和替換的蛮原,參考如下公式使其變成包含已知量h
和η'
的方程:
然后使用頭發(fā)的基礎(chǔ)色(baseColor)C
替換ζ(C)
卧须,并且?guī)肷鲜胶蟮玫搅艘粋€(gè)新的T項(xiàng)(只針對(duì)tt分量):
帶入γt
有些技巧,需要構(gòu)建一個(gè)對(duì)邊是h
儒陨,臨邊是η'
花嘶,斜邊為sqrt(h^2 + η'^2)
的三角形,而且要帶入之前α = 1/η'
的定義蹦漠,此處不再贅述椭员。
對(duì)于p = 2
,既TRT分量來(lái)說(shuō)笛园,UE4直接舍去了冪指數(shù)分子的部分隘击,改用常數(shù)項(xiàng)模擬:
最終計(jì)算所得的T項(xiàng)是一個(gè)三維的衰減系數(shù),結(jié)合[9]式所示研铆,它與菲涅爾衰減組成了我們?cè)赱17]式中的A項(xiàng)埋同。
工程中相關(guān)shader代碼如下:
float3 Ttt(float h, float3 thetaD, float cosPhi, float cosHalfPhi, float3 C){
float power = sqrt(1 - pow2(hTT(cosPhi, cosHalfPhi, thetaD)) * pow2(1 / ModifiedIor(thetaD))) / (2 * cos(thetaD));
return pow(C, power);
}
float3 Ttrt(float3 thetaD, float3 C){
float power = 0.8 / cos(thetaD);
return pow(C, power);
}
方位角分布函數(shù)Dp
有關(guān)方位角分布函數(shù)的具體物理意義前文已經(jīng)詳細(xì)描述過(guò),此處不再贅述蚜印,對(duì)其的實(shí)現(xiàn)有很多種:基于正態(tài)分布的,基于Cauchy分布的留量,也有基于Logistic分布的窄赋,UE4在2016年的文章中提出了自己的分布公式哟冬,據(jù)說(shuō)靈感來(lái)自于觀察皮克斯先前提出的基于Logistic分布的分布函數(shù),通過(guò)產(chǎn)生各種高斯函數(shù)的逼近忆绰,最終確定下了如下以cosφ
為變量的近似高斯分布表達(dá)式浩峡,分別是當(dāng)p = 1
和p = 2
時(shí)的形式:
而下圖是原文給出的Ntt輸出曲線:
不難發(fā)現(xiàn)函數(shù)大約在φ = π
時(shí)取到極大值,也就是當(dāng)入射方位角φi
與出射方位角φr
相差了一個(gè)π
時(shí)错敢,可以想象翰灾,此情況屬于光線直接對(duì)穿發(fā)絲,最終能夠透射出光能確實(shí)是最大的稚茅。
Ntt和Ntrt這兩個(gè)分布函數(shù)代碼實(shí)現(xiàn)如下:
//Ntt & Ntrt
//UE4 approx
float NTT(float cosPhi){
return exp(-3.65 * cosPhi - 3.98);
}
float NTRT(float cosPhi){
return exp(17 * cosPhi - 16.78);
}
總結(jié)
本文梳理了基于Marschner模型的理論依據(jù)和部分工程實(shí)現(xiàn)纸淮,但對(duì)毛發(fā)渲染來(lái)說(shuō)仍然是管中窺豹,后續(xù)有時(shí)間我會(huì)跟進(jìn)毛發(fā)渲染的一些其他領(lǐng)域亚享,如毛發(fā)幾何生成(卡帶,線段等)咽块,毛發(fā)頂點(diǎn)/骨骼動(dòng)畫,毛發(fā)面片之間AlphaBlend欺税,以及一些其他比較流行的渲染理論(如基于KajiyaKay模型對(duì)Marschner的逼近等)侈沪。總之一家之談晚凿,有錯(cuò)是必然的亭罪,歡迎各位讀者指正錯(cuò)誤。
Reference
[1] An Energy-Conserving Hair Reflectance Model, d’Eon(Weta) 2011
[2] Light Scattering from Human Hair Fibers, Marschner 2003
[3] Rendering Fur With Three Dimensional Texture, Kajiya, Kay 1989
[4] Physically Based Hair Shading in Unreal, Karis 2016
[5] Marschner-Hair-Unity
[6] Marschner-Hair-UE4