3D文件壓縮庫——Draco簡析
今年1月份時,google發佈了名爲“Draco”的3D圖形開源壓縮庫,下載了其代碼來看了下,感覺雖然暫時用不到,但還是有前途的,故簡單做下分析。
注:Draco 代碼地址:
https://github.com/google/draco
基本使用
編譯
cmake . + make 編譯源碼,生成 draco_encoder 和 draco_decoder 兩個可執行文件
編碼/壓縮
使用 draco_encoder 壓縮 obj 或 ply 的文件:
./draco_encoder -i torusknot.obj
結果如下:
Encoder options:
Compression level = 5
Positions: Quantization = 14 bits
Texture coordinates: Quantization = 12 bits
Normals: Quantization = 10 bits
Encoded mesh saved to torusknot.obj.drc (3 ms to encode)
Encoded size = 2272 bytes
(1)Compression level:這個決定後續選用什麼算法進行壓縮,值越高,速度越慢,壓縮效果越好。
(2)Positions: Quantization = 14 bits:頂點屬性值是由浮點轉換爲整數再編碼的,14位表示用(1<<14)(即2的14次方)去乘浮點數,然後取整。
解碼
./draco_decoder -i torusknot.obj.drc -o torusknot.obj
這裏必須指定obj的輸出文件,不然會解成ply格式,這樣 面 的信息就沒了。
原理
3D文件格式
一個3D模型文件,一般包含頂點、面、材質、動畫等各種引擎渲染所需要的信息。
ply文件格式只包含頂點信息,而obj文件包含頂點信息和麪的信息。
這兩者的聯繫如圖所示:
頂點信息就是該點的物體座標、法線向量、紋理座標等,如果綁定了骨骼,還有各塊骨骼的權重。
面的信息指怎麼由頂點圍成面,它是一系列頂點索引的集合。如 f1: 0,1,2 表示由 x0, x1, x2 三個點圍成一個面。
但這兩種格式都不滿足3D項目的需求,我們所用的模型文件還需要材質信息,動畫信息等,因此在項目中想用draco,必須將其改造一下。
流程與算法
這裏只列obj文件格式的編碼流程圖:
這裏面採用的是如下文獻的算法:
http://www.cc.gatech.edu/~jarek/papers/CornerTableSMI.pdf
它用 edge breaker 算法去壓縮面的信息,併產生 CornerTable,用平行四邊形差分方式壓縮頂點屬性信息。
Draco 裏面還有其他的壓縮頂點屬性值的算法,如kd-tree、差分等,詳細見各種 PredictionScheme,不多述。
Draco作用
1、Draco 在當前的VR、AR生態下,基本上沒有直接使用的價值,想用它必須理解原理並修改源碼。
2、Draco 裏面有比較好的mesh壓縮方案,有利於遊戲引擎公司基於該代碼優化自己的模型設計。
3、Draco 所能壓縮的只是3D模型文件中的一部分,而3D相關的資源大頭(圖片)還是一個老大難的問題。