Animoji模型優(yōu)化方案總結

Animoji已在上線,第一個版本完成了表情跟蹤记某、模型變換矩陣動態(tài)更新畅姊、光照優(yōu)化壤追、骨骼動畫與關鍵變形動畫等技術贿堰,但Animoji模型仍然存在兩個凸出的問題:

  1. 模型體積大纵搁。如BabyQ有23M(包括靜態(tài)模型、表情、動畫热押、貼圖)抡驼,壓縮后仍有8.7M。
  2. 表面不光滑。在模型做表情時,會出現(xiàn)坑坑洼洼的情況,最終只能靠光照和貼圖優(yōu)化來彌補,但導致表情不夠生動胚想。
  3. 色彩不夠真實琐凭。由于過度依賴貼圖彌補上一個不足,模型無法實現(xiàn)動態(tài)的真實陰影與色彩變化浊服。

針對在三個問題统屈,本期對黃臉、多福兩個模型使用了新的優(yōu)化方案牙躺。

優(yōu)化結果

體積優(yōu)化結果

優(yōu)化后模型大小

表情與靜態(tài)文件減小85.2%愁憔,同時得益于動態(tài)增加三角面的技術,貼圖也減小了78.4%孽拷。
除此以外吨掌,由于優(yōu)化了變形動畫的存儲方式與模型文件的壓縮方式,使得表情文件的大小在上面的基礎上減小了30%脓恕。
最終多福的壓縮后體積為1.9M(多福的貼圖會多一些)膜宋,而之前BabyQ的壓縮后體積是8.7M。

模型表面優(yōu)化結果

優(yōu)化后模型

由于哈士奇的模型表情光滑炼幔,在方向光源下產(chǎn)生的陰影非常尷尬秋茫,最后不得不是用高強度點光源與陰影貼圖(在貼圖上畫假陰影)、法線貼圖這么一套復雜的組合消除這些尷尬的陰影乃秀。
多福采用了幾何著色器肛著,在渲染管線圖元裝配之后圆兵,動態(tài)增添三角面以獲得更加光滑的表面。由于這種方法在渲染管線的前端就改造了幾何體枢贿,所以不影響骨骼動畫和后續(xù)的著色殉农,能夠兼容現(xiàn)有的實現(xiàn)方案。

視覺效果優(yōu)化結果

對比蘋果的Animoji局荚,我們發(fā)現(xiàn)统抬,即使在我們獲得了光滑的模型,做表情時依然有顏色死板的感覺危队,視覺上質(zhì)感不夠,動畫形象不夠靈動钙畔。
研究發(fā)現(xiàn)茫陆,蘋果應該是在shader中加入了fresnel效果,同時在shader中放大了光照的影響面積擎析。依此我在shader中加入了這些效果簿盅,并依據(jù)反射和環(huán)境光遮擋貼圖,實現(xiàn)了令人舒適的視覺效果揍魂。

添加shader后

技術方案

動態(tài)細分技術

在Vertex shader與Fragment shader之間桨醋,現(xiàn)代的GPU渲染管線加入了可選的Geometry shader,與Vertex shader不同现斋,它是處理頂點集合喜最,即圖元。他最大的優(yōu)勢是庄蹋,它不僅可以更改頂點瞬内,還可以增加頂點,由此三角面會增加限书。

由于它在管線中的位置處于光柵化之前虫蝶,所以它對模型的處理實際上是在渲染之前就已經(jīng)完成,所以可以和已有的變形倦西、骨骼動畫相兼容能真。

普通的分段由于是在渲染管線末端才增加三角面,會導致變形動畫Crash的問題(頂點不一致)扰柠,這也是哈士奇無法一直無法光滑的原因粉铐。

得益于動態(tài)細分,下發(fā)的模型可以是非常粗糙的幾何體耻矮,也因此模型大小大大減小秦躯。


渲染管線

但使用Geometry shader細分網(wǎng)格時,若細分算法選擇不佳裆装,依舊會導致模型即使增加三角面后依然不夠光滑踱承。

使用合適的細分算法

原始網(wǎng)格如下倡缠,若使用蘋果默認的Catmull-Clark算法,則結果會導致細分后的頂點分布位置茎活,導致三角面分布不均勻昙沦。


原始網(wǎng)格

Catmull-Clark算法結果如下。


Catmull-Clark算法細分后

由于Catmull-Clark算法在增加頂點與邊后载荔,會依據(jù)他們計算原有頂點的新位置盾饮。
原始頂點的新位置

其中F為新增加的面頂點,R為新增加的邊中點懒熙,n為相鄰邊數(shù)丘损,P為原有頂點位置。計算得到的就是新位置工扎,這在靜態(tài)模型上沒有問題徘钥,但是在有動畫的模型上,由于三角面不均勻肢娘,依然會導致不光滑呈础。


Catmull-Clark細分后仍不光滑

而我想要的結果是三角面均勻分布的細分方案,即網(wǎng)格邊二分法的效果橱健,如下


邊二分法后的網(wǎng)格

遺憾的是蘋果并不提供細分算法的選擇而钞,大量實踐發(fā)現(xiàn),若使用Maya導出的模型是四邊面拘荡,雖然蘋果依然會將網(wǎng)格三角面化臼节,但在細分時會選擇邊二分法,這也是個比較Trick的方法珊皿,在最新的iOS beta也有效官疲。

動態(tài)細分后貼圖的優(yōu)勢

由于模型已經(jīng)做到了動態(tài)細分,那么貼圖可以選擇低質(zhì)量的圖片亮隙。之前是因為需要在貼圖上畫出細膩的陰影途凫,所以不能過渡壓縮導致模糊。而新模型是使用動態(tài)陰影的溢吻,所以貼圖壓縮78.4%维费,且理論上可以進一步壓縮。

自適應與性能提高

動態(tài)細分能做到在管線光柵化之前就增加三角面促王,但這意味每一次渲染都會使用Geometry shader犀盟。
而對比發(fā)現(xiàn)GPU的使用率提高了9%左右,GPU的性能雖然可以做到無壓力蝇狼,但進一步的優(yōu)化也不是無意義的阅畴。
由于透視造成的近大遠小,那么離我們較遠時迅耘,細分可以盡量低級贱枣,在很近是监署,可以盡量高級。依據(jù)此思想纽哥,我加入了自適應的細分能力來降低性能損耗钠乏。
同時我考慮在模型不使用時,將細分后的模型保存下來春塌,第二次使用時就不用在渲染管線中每一次都細分晓避,但這個需要進一步測試,因為細分后的模型數(shù)據(jù)量大大增加只壳,對內(nèi)存和CPU又會有挑戰(zhàn)俏拱,如何將CPU與GPU做一個均衡優(yōu)化也一直是個難題,這里后期跟進吼句。

Shader著色優(yōu)化

fresnel效果

fresnel效果能夠產(chǎn)生更合理的反射效果彰触,在渲染時會將不同材質(zhì)的折射考慮進去。強烈的反射會讓材質(zhì)顯得更通透命辖。
數(shù)學公式不復述了,即代碼實現(xiàn)了fresnel公式分蓖。

float Mask = _surface.specular.b;
float basis = saturate(dot(_surface.view, _surface.normal));
float fresnel = saturate(pow(1.-fresnelBasis , edgeDark_rimLight.w)) * pow(AO,5.0);

float fresnelDarkening = saturate(pow(1.-fresnelBasis , edgeDark_rimLight.y)) * pow(AO,5.0);
vec3 darkeningcolor = EdgesDarkeningColor.rgb;
color = mix(color, color * darkeningcolor, fresnelDarkening * lightWrapMask * edgeDark_rimLight.x);

改善光照效果

使用AO貼圖和反射貼圖尔艇,營造更柔和的光照效果。這里使用了常用的圖形模糊掩膜么鹤,讓反射效果更柔和终娃。

vec4 Wrap = vec4(0,0,0,0);

float diffuse =  saturate(dot(_surface.normal, _light.direction) );
diffuse = pow(diffuse, Wrap.x + 1);



vec3 halfVec = normalize(_light.direction + _surface.view);

// the roughness texture control the shininess :

float roughness = _surface.specular.g;
float shininess = mix (_surface.shininess, 15.0 + Wrap.z, roughness);
vec3 specular = pow(max(dot(_surface.normal, halfVec), 0.0), 0.1);
specular =max(dot(_surface.normal, halfVec), 0.0);
specular = pow(specular, shininess) * _light.intensity.rgb;
specular *= _surface.specular.r;

_lightingContribution.diffuse.rgb = _light.intensity.rgb  * diffuse  * (1.4 + Wrap.y)+ _lightingContribution.ambient;

_lightingContribution.specular = specular;

總結

Animoji模型優(yōu)化后達到了工業(yè)級使用的級別,但渲染方案依然有優(yōu)化的空間蒸甜,而跨平臺的實現(xiàn)方案亦在觀察之列棠耕。

圖形學博大精深,我時常感覺自己像個小學生對面對的問題不知所措柠新,時常對相關知識閱讀三遍也不能理解∏嫌現(xiàn)在我也只是了解了其中冰山一角,工作就像求學恨憎,得保持對未知的好奇和渴望蕊退,同時要保有敬畏之心。

相關文章

Animoji實現(xiàn)方案分享

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末憔恳,一起剝皮案震驚了整個濱河市瓤荔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钥组,老刑警劉巖输硝,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異程梦,居然都是意外死亡点把,警方通過查閱死者的電腦和手機橘荠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愉粤,“玉大人砾医,你說我怎么就攤上這事∫吕澹” “怎么了如蚜?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長影暴。 經(jīng)常有香客問我错邦,道長,這世上最難降的妖魔是什么型宙? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任撬呢,我火速辦了婚禮,結果婚禮上妆兑,老公的妹妹穿的比我還像新娘魂拦。我一直安慰自己,他們只是感情好搁嗓,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布芯勘。 她就那樣靜靜地躺著,像睡著了一般腺逛。 火紅的嫁衣襯著肌膚如雪荷愕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天棍矛,我揣著相機與錄音安疗,去河邊找鬼。 笑死够委,一個胖子當著我的面吹牛荐类,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茁帽,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼掉冶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脐雪?” 一聲冷哼從身側響起厌小,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎战秋,沒想到半個月后璧亚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年癣蟋,在試婚紗的時候發(fā)現(xiàn)自己被綠了透硝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡疯搅,死狀恐怖濒生,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情幔欧,我是刑警寧澤罪治,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站礁蔗,受9級特大地震影響觉义,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浴井,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一晒骇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧磺浙,春花似錦洪囤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至呵曹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間何暮,已是汗流浹背奄喂。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留海洼,地道東北人跨新。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像坏逢,于是被迫代替她去往敵國和親域帐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容