測試不易,機會難尋。轉載請帶連接配接:https://www.cnblogs.com/onsummer/p/13543826.html;全網@秋意正寒
轉換思路
同樣一個模型,分别取如下轉換思路:
- 原始模型👉fbx👉gltf
- 原始模型👉obj👉gltf
但是我在打開中間格式fbx和obj時,發現這兩者雖然頂點數量一緻,三角形數量一緻,但是使用 Windows 3D 檢視器檢視時,發現前者的繪圖調用次數高達1600多次,而後者的繪圖調用次數隻有217次,效果是完全相同的。
遂打開gltf檔案進行分析,對比gltf資料對象如下:
對比gltf對象 | fbx | obj |
---|---|---|
node數量 | 1600多+2500多 | 1 |
mesh數量 | 1600多 | |
primitive總量(每個mesh的primitive數量和) | 217 | |
特點 | 1個mesh存1個primitive,有2500多個node用于記錄層級關系 | 用1個node包裹1個mesh,mesh下有217個primitive |
是以,故推斷影響 gltf、3dtiles(b3dm格式)渲染性能的一個重要名額,就是 primitive 的數量,primitive 是 GL 庫繪制圖形的最小單元。
在上表中看到有2500多虛node其實是不直接引用 mesh 的,是以即使 node 的總數有 3700 多個,但是實際上隻複現了 1600 多次 mesh,且由于 1個 mesh 隻有 1個 primitive,是以繪制次數等于1600多次很正常。
要性能還是要邏輯?
這是一個很難取舍的話題,如果需要在 gltf 層面組織好屬性資料、資料邏輯分層,那麼要盡可能控制好 node 的樹狀結構,控制好負責引用mesh的node的數量,控制好 primitive 的總數,盡量把材質一樣的 primitive 合并。
而如果要追求極緻的性能,就不用太在意 node、mesh的組織,隻要遇到材質一樣的 primitive,合并就是,遇到相對坐标不一樣,上轉換矩陣算它。
空間換時間
三維渲染是一個極其昔時的話題,因為現在似乎磁盤容量是足夠的——什麼你跟我說檔案大了下載下傳慢?你搞辣麼大的模型幹啥?有大模型不會分拆嗎嗎嗎嗎
是以,很多時候要用空間換時間。
gltf 允許 1個mesh 由多個node 引用,那麼這個 mesh 的繪制次數就會累加,雖然複用了mesh下轄的 primitive所指向的資料,不用存儲多份mesh可以達到“隻存一份資料重複繪制多次”的效果,但是這對性能毫無卵用,因為總的 primitive 數量還是上去了。
這個時候可以把需要重複的頂點根據 node 的坐标轉換資訊計算出來,重複塞到盡量少的primitive中去。
有人說你這樣頂點數量上去了,檔案體積也上去了:朋友,普通的750ti亮機卡繪制100w個點沒什麼壓力的~,檔案體積這個,就需要資料轉換者自己權衡到底是重複mesh的引用,還是把重複的圖形多存一份(位置不一樣)塞到 primitive 中了。