最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

理論和工程之間,差了一個TA

2018-08-19 14:24 作者:AICDG  | 我要投稿

      文章開始之前先提一下,最近建了一個渲染技術討論群,群號。歡迎喜歡鉆研渲染技術,引擎技術,特效開發(fā)的朋友加群啊。

      最近兼職TA做了個“小”功能,大概體驗了一下TA的工作。給大家,特別是想入職TA的同學分享一下。


上個月,某策劃突發(fā)奇想,要在手機上做個全戰(zhàn)。要求:在手機上實現上千人同屏作戰(zhàn),而且不許卡。

       一般情況下,這種無理取鬧的需求我是直接要懟回去的,但是引擎的老大發(fā)話,這個功能可以試著做一做。我還能說什么呢,我只能用任天堂開發(fā)氣球大戰(zhàn)時坂本賀勇那句話:“我就試著做一做讓你死心”。

老大發(fā)話其實我很能理解,兩個原因,一個是unity有一個Animation-Instancing插件,所以實現骨骼動畫實例化肯定是可行的,只不過在UE4上實現工作量未知。另一個就是我所在的公司是一個比較慣著策劃的公司,盡最大可能滿足策劃的各種不合理需求

       既然要做那就先補一些理論吧,然后就真的找到了相關的文章。推薦一下 GPU Gems 3 中的 Part I: Geometry Chapter 2. Animated Crowd Rendering。

       接下來搜索一下UE4有沒有前人實現過Animation Instancing,仔細搜索的話還真的發(fā)現有,就是這個項目。這個項目基于4.15的改版引擎。拿到這個demo之后,我也改改引擎,改改項目,終于在4.19版本上把demo跑起來了。

這個東西性能還是很好的。也就是說,理論上,超千人同屏問題不大。那么接下來的步驟,就是在自己的工程使用。

       設計思路: 將模型頂點色的r和b通道填寫該頂點所受影響的骨骼索引,在g和a通道存儲骨骼的權重。將模型的骨骼變換矩陣烘焙到一張貼圖上,在頂點著色器中根據頂點色采樣骨骼變換矩陣完成蒙皮。

其實同時還發(fā)現一個悲劇,就是無論Unity官方提供的animation instance插件,還是之前的nextRTS demo,都是使用的morph而非skinning,烘焙的貼圖是模型中每個頂點的位置變換而非骨骼的變換。這個效率很高,但是動畫貼圖會非常的大,和模型的定點數成正比。而用骨骼貼圖的話,骨骼貼圖可以很小,之和骨骼根數相關。

       我首先想到的思路,是在3DS MAX中完成頂點色繪制以及骨骼動畫貼圖的制作。因為3DS MAX中進行頂點操作非常容易,動畫信息也很容易獲取。而且導入到UE4的過程中,SkeletalMesh和StaticMesh都能獲得無續(xù)在UE4中額外轉換。

       用了一下午學習3DS MAX的基本操作,用了一天時間學習maxscript的語法。然后磕磕絆絆用了不到一周時間完成了在3DS MAX中將骨骼索引和權重烘焙到頂點色的功能。

       骨骼動畫在maxscript中制作的想法在同時被否決,原因:1.3DS MAX制作貼圖只能是位圖,精度僅有8位。2.3DS MAX中不支持顏色為負值或者大于1的值。所以拿出UE4,開始編寫插件吧。精度不止8位,允許負值,允許大于1的值,這個就是HDR貼圖嘛。所以在UE4中生成一張有符號HDR貼圖,將骨骼動畫寫到其中。其實這個步驟挺超級復雜簡單的。

       之后編寫頂點著色器,這個和普通的GPU蒙皮的思路差不多,就是以前是傳骨骼矩陣,現在是采樣骨骼貼圖6次來獲得骨骼矩陣(采樣一次是一個vec4,三次是一個3x4骨骼矩陣,6次是兩個)。

       初次運行,果然如同群魔亂舞。在修正所有細節(jié)bug之后,確定了一個問題:UE4中的骨骼索引和3DS MAX中的模型的骨骼索引完全不同,在3DS MAX中將骨骼索引和權重刷到頂點色的方法走不通。所以只能繼續(xù)編寫UE4的插件。擴展SkeletalMesh Editor,使之能導出靜態(tài)模型的同時將骨骼的索引權重刷到頂點色上。這步本身應該非常復雜,但是UE4提供了MeshUtility工具,可以將SkeletalMesh轉換為StaticMesh。將生成的靜態(tài)模型刷頂點色即可。

UE4提供的MeshUtility有一些小bug,需要修復一下。

       至此運行,播放一個實例的骨骼動畫已經沒有問題,但是大量實例卻有BUG,性能也不是很理想。閱讀UE4的VertexFacoty實現邏輯就可以知道原因。

       修改UE4頂點著色器源碼(MaterialTemplate,BasePassVertexShader),添加新的宏,在使用skinning instance的時候,讓材質中的worldposition節(jié)點其實是初始的local position,讓world position offset輸出變?yōu)槊善ず蟮膌ocal position輸入。就可以獲得正確的skinning instance。

       完成這個之后,其實還有很多后續(xù)優(yōu)化。比如優(yōu)化骨骼動畫貼圖的排列邏輯使之能容納更多動作,寫一個簡易動畫狀態(tài)機可以控制多個動作播放,編寫接口可以單獨控制某個實例的動作。

       這次去兼職TA,真的辛苦,,但是收獲也著實不小。在此向所有TA致敬,感謝你們的辛苦付出。


理論和工程之間,差了一個TA的評論 (共 條)

分享到微博請遵守國家法律
潼关县| 新河县| 静乐县| 和硕县| 河间市| 芷江| 扎囊县| 开江县| 恩平市| 德保县| 望谟县| 林州市| 乌拉特后旗| 九龙坡区| 平原县| 辽宁省| 开原市| 灵石县| 平利县| 自治县| 浮梁县| 承德市| 宣汉县| 隆子县| 肥西县| 江孜县| 和硕县| 玛纳斯县| 枣阳市| 东乌| 广饶县| 西藏| 华坪县| 和龙市| 雅江县| 通州区| 新郑市| 石棉县| 吴忠市| 定兴县| 绥棱县|