孫正忠
(1.中國科學院上海微系統與信息技術研究所上海200050;2.上海科技大學信息科學與技術學院,上海201210;3.中國科學院大學北京100049)
在計算機圖形學和三維人體重建領域,頭發的建模和渲染一直以來都是最具有挑戰性的部分。近年來,隨著虛擬現實(Virtual Reality,VR)和增強現實(Augmented Reality,AR)的崛起,虛擬人物越來越多的出現在我們的移動設備中。利用數十臺相機搭建的360度光場環拍系統可以對真人進行動態的采集和重建,使人體的三維模型可以栩栩如生的呈現在人們面前[1]。但是頭發由于其數量眾多,纖細以及半透明等特點,在人體的三維重建中一直都是最難重建的部分之一,往往最終也只能以面片和貼圖的形式來進行渲染呈現。這就大大影響了人物模型在移動端中的顯示效果。
而在電影和動畫片的制作中,為了得到高質量的頭發渲染效果,通常需要對發絲來進行高精度的人工建模,并結合基于物理的頭發渲染算法,通過多重反射和折射,歷時幾個小時最終才能渲染出一張高質量的圖像[2]。這在對實時性要求很高的VR和AR應用中是難以接受的,尤其要放到移動端的話,這更是不可能的事情。
文中將提出一種適用于移動端的頭發建模和基于發絲的實時渲染的解決方案。開發者可以利用瑪雅(Maya)等常見的三維建模軟件,快速建模發絲,并直接導入移動端進行高質量的實時渲染。
如今最常用的三維建模軟件主要有3dsMax和Maya。在3ds Max中主要以Cem Yuksel博士的Hair Farm毛發制作插件最具代表性[3]。而Maya匯集了當今最先進的頭發建模方法[4],并提供了多種多樣的頭發建模插件和工具。例如 nHair,Shave,Yeti,XGen,XGen交互式修飾等。這些插件建模頭發的主要思路總結起來有兩種方式[5-9]:
1)選定一塊頭皮,在該頭皮上建模主頭發線條,以此來確定發型的基本形狀,軟件會根據主頭發線條自動插值出更多的發絲,進而形成較為濃密的頭發。例如nHair,XGen等工具。這種方法比較適用于長發的建模。
2)軟件根據所選定頭皮自動生成頭發,用戶可以改變頭發的長度和濃密,并利用提供的筆刷像理發一樣對生成的頭發進行修剪和造型,將其塑造成自己想要的樣子。例如XGen交互式修飾。這種方法對于短發的建模非常好用。
目前移動端用到的頭發往往是面片加貼圖的形式[10],如圖1所示。雖然比較生硬,效果不夠真實,但是由于其建模簡單,渲染速度快等優點,目前仍是移動端頭發渲染的首選。而通過發絲渲染出來的頭發,能夠看到一根根發絲飄逸的效果,具有極佳的視覺效果[11-12],如圖2所示。但由于其巨大的計算量,在移動端往往無法支撐如此高質量的渲染。因此,如何在移動端實現快速的發絲渲染就成了眾多圖形學開發者研究的方向。
目前基于發絲的頭發渲染使用最廣泛的光照模型是Kajiya-Kay[13]和Marschner[14]兩種模型。

圖1 游戲天劍中的頭發

圖2 通過發絲渲染出來的頭發效果
2.2.1 Kajiya-Kay光照模型
Kajiya-Kay光照模型是最早提出的針對頭發的光照模型,由于其良好的渲染效果而被廣泛應用。該光照模型把頭發的光照看成由漫反射和鏡面反射兩部分共同作用的結果,并用一個光滑的、半徑很小的圓柱體來近似表征一根發絲。

圖3 Kajiya-Kay光照模型
Kajiya-Kay光照模型中重要的向量和角度,如圖3所示。其中,單位切線向量(t)表示頭發的切線方向,光線向量(l)指向光源的方向,反射向量(r)指向反射光的方向,即最大鏡面反射的方向。眼睛向量(e)指向觀察者眼睛的方向。角度θ和φ分別是切線向量和光線向量的夾角,切線向量和眼睛向量的夾角。
根據Lambert光照模型,漫反射部分的光強可以通過以下公式來計算:

其中,Kd表示漫反射的系數。
由于頭發表面具有光滑的特質,光線在頭發表面會形成高光。Kajiya-Kay光照模型給出的鏡面反射強度計算公式如下:

其中,Ks表示鏡面反射的系數。
將漫反射和鏡面反射部分結合起來,再加入環境光的部分就是頭發完整的光照計算公式:

其中,Li表示光照的強度,Ka表示環境光的反射系數,La表示環境光的強度。
2.2.2 Marschner光照模型
Marschner光照模型是在對頭發物理結構進行研究的基礎上,測量出3維空間中光線在頭發上發生散射后不同方向上的輻射強度,根據光線在頭發上的散射規律,推導出的一種可行的光照模型。
Marschner光照模型把入射光線分成3部分:第一部分是反射光線(R),這一部分光線并沒有進入頭發,而是在頭發表面直接反射。第二部分是折射-折射光線(TT),這一部分光線進入頭發中,在頭發表面發生了兩次折射。第三部分光線是折射-反射-折射光線(TRT),這一部分光線在頭發表面發生了兩次折射,在頭發內部表面發生了一次反射。光強的計算公式如下:

其中,PathR,PathTT和PathTRT分別對應上述入射光線的3種情況。這雖然近似模擬了真實光線照射到頭發上可能發生的3種情況,但也大大增加了光照渲染的計算量,令人遺憾的是,渲染效果提升并不明顯。
因而,由于Kajiya-Kay光照模型計算相對簡單,在效果和速度上能取得很好的平衡,所以本文將采取Kajiya-Kay光照模型在移動端進行渲染。
早在2013年,顯卡廠家AMD就在游戲《古墓麗影》中推出了基于發絲的頭發實時渲染技術。
TressFX技術通過DirectCompute接口進行編程,能夠充分發揮出真正全新下一代圖形架構(Graphics Core Next,GCN)的大規模并行計算能力,從而獲得以往需要預先渲染才能實現的圖像品質[15]。同時TressFX基于當前的次序無關透明技術(Order Independent Transparency,OIT)工作,這種方法使用了單像素鏈接列表(Per-Pixel Linked-List,PPLL)數據結構來管理復雜的渲染過程及內存使用[16]。是否開啟TressFX的渲染效果對比,如圖4所示。

圖4 游戲《古墓麗影》中未使用(左)和使用(右)TressFX的渲染效果圖
雖然TressFX具有極佳的頭發渲染效果,能夠渲染出很好的自陰影和半透明效果。但是復雜的運算也對GPU的性能提出來很高的要求,目前只能在高性能獨立顯卡上運行,不能在移動端使用。
本文將以XGen交互式修飾為例,這種方法是Maya近兩年推出的一種建模頭發的方法,因其使用簡單快捷,受到廣大開發者的青睞。
XGen交互式修飾提供了一系列專用于創建所有頭發和毛發樣式的完整工具,其中包括雕刻筆刷、修改器和雕刻層。
交互式修飾描述和修改器是基于Maya的節點,因此它們可以在節點編輯器中進行操縱。這些節點在系統的圖形處理單元(GPU)上進行計算,使筆刷筆劃可以實時顯示,從而提供無需預覽生成的交互式工作流。雖然交互式修飾頭發的所有數據都將保存到Maya場景文件中,但用戶還可以將修飾保存到基于Alembic的緩存文件。
使用XGen交互式修飾建模頭發的流程可總結如下,其中每一步對應的結果如圖5所示。
1)確定虛擬角色模型的待生成頭發區域,即表示頭皮的部分網格模型,本文稱作頭皮網格(可以是三角形網格或四邊形網格);
2)為選取的頭皮網格創建交互式修飾樣條線;
3)使用XGen自帶的修改器和修飾筆刷,對頭發進行造型。同時,可以利用Maya自帶的Arnold渲染器實時預覽頭發。
4)為頭發添加噪聲,設置卷曲程度,使其更加逼真。

圖5 XGen交互式修飾工具建模頭發過程
利用XGen交互式修飾建模出來的頭發,由于所有數據都保存在Maya場景文件之中,因而只能在Maya中進行渲染和使用。但Maya本身是支持腳本語言的,這為我們導出頭發數據創造了可能。Maya主要支持的腳本有兩種[17],分別是MEL和Python。前者是Maya自己的腳本語言,有著自己的語法規則,而對Python語言的支持則使更多的開發者可以通過使用腳本來處理Maya中的數據。
為了可以在移動端的渲染程序中使用建模的發絲模型,首先需要利用Maya自帶的工具將其保存到基于Alembic的緩存文件。然后,使用Maya打開剛剛存下來的緩存文件(abc格式),我們可以看到里面的發絲是非均勻有理B樣條(Non-Uniform Rational BSplines,NURBS)曲線的形式。現在,我們就可以在Maya中運行編寫好的提取發絲的Python腳本,將一根根NURBS曲線以自定義的頂點數和格式存下來,以供渲染程序使用。
為了實現在移動平臺上進行實時渲染的目的,我們使用OpenGL ES來進行渲染。OpenGL ES是OpenGL三維圖形API的子集,針對手機、PDA和游戲主機等嵌入式設備而設計。與只可以在iOS中使用的Metal不同,OpenGL ES在Android和iOS等移動設備中均可以使用,這將大大方便我們將代碼移植到其他移動平臺[18-19]。
使用OpenGL ES進行對發絲進行渲染的總體流程如表1所示。
如圖6所示,分別是在移動端對基于發絲的長直發,長卷發和短發的渲染效果。我們可以清楚的看到頭發反光的高光部分以及發尾一絲絲的頭發,當轉動頭發模型的時候,高光也會隨之產生相應的改變,十分真實。尤其是在短發模型中,同時載入利用光場重建出來的人體頭部模型和Maya中建模的頭發模型,分別對二者進行渲染,在實現了極佳的頭發渲染效果的同時,也增強了頭部模型的真實性。上述3個頭發模型的發絲數和頂點數如下:

表1 使用OpenGL ES進行渲染的總體流程

圖6 不同發型的移動端實時渲染效果
1)長直發:10 000根發絲,160 000個頂點。
2)長卷發:10 000根發絲,687 532個頂點。
3)短發:33 636根發絲,538 176個頂點。
我們在自iPhone 5s以來的多款蘋果手機上對于圖6所示的3種頭發模型進行了渲染速度的測試。
由于垂直同步的原因,在iPhone上渲染幀率最高為60幀每秒(Frame Per Second,FPS)。從表2可以看出,在iPhone 5s以后的這幾款機型,即便是對于具有上萬根發絲、數十萬個頂點的頭發模型,本文的渲染速度均可保持在25FPS以上,基本可以達到普通應用的渲染要求。尤其是在iPhone 6s以后的機型,渲染速度可以達到60FPS滿幀,這足以滿足移動端VR和AR應用的需求。這就為在移動端VR和AR應用中實時渲染高質量頭發奠定了堅實的基礎。

表2 不同手機渲染幀率對比表
本文提出了一種針對移動端的頭發建模和渲染的方案,使得開發者可以快速在Maya中建模發絲模型并導出到移動端進行高質量的實時渲染。該方案流程相對簡單,同時取得很好的頭發渲染效果,非常具有實用價值。
不過目前的頭發渲染效果與TressFx還有一定差距,主要是沒能處理好頭發的半透明和自陰影的問題。隨著VR和AR技術的發展,Unity3d逐漸成為移動端VR和AR應用最主流的開發工具。后續的工作將針對渲染效果和渲染速度進行優化,并制作頭發建模和渲染的Unity3d插件,便于VR和AR開發者的使用和集成本文的方案。