遊戲角色寫實頭髮製作

遊資網發表於2020-02-13
貼圖

本系列以UE4引擎為例,介紹遊戲角色寫實頭髮的製作。首先介紹貼圖製作技法。

UE4的hair shading model採用PBR計算,所以只需要4張Mask貼圖通道,不再需要美術手繪顏色資訊。這四張貼圖通道分別是Alpha, Depth, ID, Root,作用分別是:

  • Alpha通道用作透貼
  • Depth通道用作提取頭髮先後遮擋關係資訊
  • ID通道用來區分不同的髮絲屬性
  • Root通道用來計算髮根到髮梢的漸變效果

所有的貼圖通道都是通過工具生成,工具包括Maya, Xgen, XNormal, 以及自己用Python開發的兩個Maya Tool。具體步驟如下:

  • Maya裡新建所需的XGen Hair Description,數量依據具體效果確定。每個Description生成造型疏密不同的髮束。

遊戲角色寫實頭髮製作
Xgen Hair

·Pipeline中有部分工作,現有的工具無法完成,需要自己開發兩個Python工具。第一個工具是Mesh生成工具。因為XGen匯出的Curve不能渲染,必須通過工具轉換成所需要的可渲染烘培髮絲幾何模型。第二個工具是隨機選擇工具。為了生成ID Map,髮絲的幾何模型必須隨機分成N組,每一組指定不同的ID。

遊戲角色寫實頭髮製作
Python工具和隨機選擇效果

遊戲角色寫實頭髮製作
Python工具生成的髮絲Mesh

  • 準備好XNormal所需的Bake Texture。Bake Texture的目的是生成Alpha,Root,ID。Bake Texture分別是
  • Alpha:一張白色貼圖。
  • Root:一張黑色到白色的漸變貼圖
  • ID:根據分組準備N張不同灰度的純色貼圖。

遊戲角色寫實頭髮製作
漸變和ID純色貼圖

  • 最後一步,XNormal烘培輸出貼圖。
  • 把分好組的髮絲幾何模型分別High Definition Meshes.
  • 匯出兩個Plane作為Low Definition Meshes和External Cage File.
  • 指定白色貼圖到Base texture to bake, 烘焙Alpha通道.


遊戲角色寫實頭髮製作
Alpha Map

  • 指定漸變貼圖到Base texture to bake, 烘焙Root通道.

遊戲角色寫實頭髮製作
Root Map

  • XNormal裡烘培height map作為Depth通道.


遊戲角色寫實頭髮製作
Depth Map

  • 指定不同灰度的純色貼圖到Base texture to bake, 烘焙ID通道.


遊戲角色寫實頭髮製作
ID Map

遊戲角色寫實頭髮製作

材質

寫實頭髮材質部分,也就是講下Shading Model實現.

Kajiya-Kay[1989]關於頭髮的Shading Model沿用至今,已經快30年。Kajiya模型的優點是:

  • 演算法簡單,便於理解,計算量小
  • Primary Specular的價效比高,效果明顯,方便美術使用

但Kajiya模型又被稱作Painter's Illusion, 難以獲取真實的頭髮材質效果,其不足在於:

  • Kajiya的模型過於簡單,只簡單模擬了Primary Speucular, 沒有處理Light Transport的其他情況,比如光線在頭髮纖維內的傳播過程。
  • Kajiya假設頭髮纖維是光滑的圓柱體,而電子顯微鏡下顯示頭髮纖維是由表面粗糙的鱗片層疊形成的不規則幾何體,鱗片之下還有色素髓質。鱗片和髓質對光線的傳播,染色和衰減吸收作用,都沒有在Kajiya模型裡體現。

遊戲角色寫實頭髮製作
頭髮纖維表面結構

遊戲角色寫實頭髮製作
頭髮纖維橫截面

因為以上的問題,導致Kajiya Model是non-physically based。 經驗值引數導致光照能量不守恆。弊端是在Artist在特定的光照情況調出來的頭髮效果,光照發生變化之後,可能會出現明顯的瑕疵,很多時候需要Artist把頭髮的顏色預先畫在貼圖上。

針對Kajiya模型的不足,Marschner[2003]提出了一個新的模型,其特點:

  • Light Transport更完善,不僅有Primary Specular(R mode) , 還包括光線在頭髮纖維髓質內折射後再次出射Transmission(TT mode), 光線在頭髮纖維髓質內多次反射後再次出射Secondary Specular(TRT mode),TRRT, GLINT等

遊戲角色寫實頭髮製作
R TRT Mode

遊戲角色寫實頭髮製作
TT Mode

  • Marschner模型考慮到頭髮纖維的微觀結構,纖維外層的鱗片會對R, TT, TRT的路徑產生影響,光線在纖維內部的傳播也會受到菲尼爾,染色,吸收衰減的影響。另外,頭髮纖維的橫截面是橢圓,這個結構的設定可以通過微分方程的奇點計算出頭髮Glint效果。

遊戲角色寫實頭髮製作
Marschner Hair Model

遊戲角色寫實頭髮製作
Glint

這個模型基本模擬了所有較明顯的頭髮光照效果,因此在CG和遊戲領域被廣泛採用。

下面以Marschner. 2002. Light Scattering from Human Hair Fibers的論文以及UE4.20的實現來詳細介紹Marschner Hair Model的近似解析解。

假設我們要求解的頭髮纖維散射函式為 S(φi,θi,φr,θr)。通過幾何推導和實測資料驗證,S有三個特性:

  • 光線在頭髮纖維中不管經歷多少次反射和折射,入射角和出射角的經度是一樣的。
  • R, TT, TRT mode分佈在圓錐面上,圓錐面的母線和中軸線的夾角等於入射經線角(即入射光線和法線平面投影之間的夾角)。但受到頭髮纖維鱗片的作用,R會向髮根傾斜一定的角度,TT, TRT會向髮梢傾斜一定角度。
  • S函式中經度角θ和方位角φ的依賴關係可以通過多項式分解提取出獨立的M(θ)和N(φ)

因此得到解析解的形式:

S(φi,θi,φr,θr) = ∑pM(θh) * N(φ)* A(p), p∈{R, TT, TRT, TRRT, GLINT........}

M為θ分佈函式,N為φ分佈函式,A = Absorption * Fresnel

(UE4裡只考慮前三項的影響,且只處理圓形橫截面)

  • M項。如果頭髮纖維是光滑的,那麼M項應該是δ distribution。而實際上頭髮纖維的鱗片外層是粗糙的,所以這裡用了gaussian distribution。其中gaussian distribution的標準差對應的是纖維粗糙度,期望值對應鱗片外層會對光線產生的偏移。Digital Weta在後來的實驗中發現M項如果能部分依賴φ, 能更準確的計算backlit。由於對φ的依賴計算複雜,UE4只在最明顯的R mode使用了這個辦法, TT, TRT仍然使用gaussian distribution。

遊戲角色寫實頭髮製作
Mode

  • N項。R的反射分佈使用Kajiya推導的解析解N = 1/4 * cos(φ/2)。Pixar. 2013. A Data-Driven Light Scattering Model for Hair發現柯西分佈和logistic分佈比高斯分佈更利於取樣計算,所以UE4裡嘗試用logistic分佈估算N項: Ntt = exp(-3.65 * cosφ - 3.98), Ntrt=exp(17 * cosφ - 16.78)

遊戲角色寫實頭髮製作
Scattering Geometry (a)

遊戲角色寫實頭髮製作
Scatttering Geometry (b)

遊戲角色寫實頭髮製作
R,TT,TRT Cone

  • A項。Fresnel是Schlick近似求解。R只有一次Fresnel計算, TT有兩次, TRT是三次。Absorption的關鍵是計算入射光線到纖維中心的距離(Scattering Geometry b)根據光線在頭髮纖維橫截面的傳播過程可以推匯出等式:φ(p, h)=2pγt - 2γi + pπ 。φ是入射光線和出射光線的方位角之差。求導以後可以到得TT, TRT的h解。TT的解有一個, TRT的解有一個或者三個。其中htt = sign(φ)cos(φ/2)/√(1 + a*a - 2 * a *sign(φ)sign(φ/2)),htrt沒有解析解。UE4對htt, htrt做了簡化。htt≈(1 + a * (0.6 - 0.8 * cosφ)) * cos(φ/2). 而TRT的lobe只用一個,用√3/2估算。通過h的值便可以得到光線在纖維內部的路徑,從而得出absorption項,當然也是近似值。Ttt = pow(color, 0.5 *√(1 - h*h*a*a) /2 *cos(θd)), Ttrt=pow(color, 0.8/cos(θd))

最後還有scattering diffuse. 這一項的physically based計算非常複雜,UE4對這部分做了最簡單的處理,參考了Kajiaya的diffuse term,同時用經驗值和視線矯正過的NoL做了線性插值。UE4 Hair Shading Model作者也認為這部分的優化空間很大。Marschner.2008.Efficient Multiple Scattering in Hair Using Spherical Harmonics是一個很好的參考改進方案。

遊戲角色寫實頭髮製作
左:Kajiya 中: Marschner 右: 實拍效果

遊戲角色寫實頭髮製作

造型設計

頭髮的造型設計本來是純美術的工作,但是因為操作方式太繁瑣的原因,導致角色美術師普遍不喜歡製作頭髮部分。這一塊可以根據角色美術師常用的建模習慣,在DCC軟體內構建一個快捷環境,視訊是筆者開發的類似功能展示,可以提升角色頭髮造型設計的效率。


遊戲角色寫實頭髮製作

插片製作 A Non-Destructive Method

遊戲角色寫實頭髮製作

接上篇,用Xgen打型輸出的Primitive無法參與實時渲染,最終還是要轉成面片的形式。以第三方外掛Ornatrix為例,介紹一種Non-Destructive插片製作頭髮技法。頭髮插片一般分3層: 打底層,中間過渡層,最外層。下面介紹下最外層頭髮面片生成的流程基本設定。


所謂Non-Destructive是指製作流程中的每個環節都是單獨模組化,對輸入和輸出的任何修改操作,都不會對其他環節造成破壞。而且每個環節對應一個節點,操作直觀簡單,還可以反覆疊加,創作更復雜的效果。

Ornatrix提供有SDK和Python介面,TA更可以在其基礎上開發流程工具,進一步提升效率,大大縮短頭髮製作的時間週期。

附:騰訊光子工作室群技術美術組招聘 Shading Tech Artist(含實習生,長期有效)

作者:大星星
專欄地址:https://zhuanlan.zhihu.com/p/43000575

相關文章