3D文件壓縮庫——Draco簡析

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文件包含頂點信息和麪的信息。
這兩者的聯繫如圖所示:
Mesh
頂點信息就是該點的物體座標、法線向量、紋理座標等,如果綁定了骨骼,還有各塊骨骼的權重。
面的信息指怎麼由頂點圍成面,它是一系列頂點索引的集合。如 f1: 0,1,2 表示由 x0, x1, x2 三個點圍成一個面。

但這兩種格式都不滿足3D項目的需求,我們所用的模型文件還需要材質信息,動畫信息等,因此在項目中想用draco,必須將其改造一下。

流程與算法

這裏只列obj文件格式的編碼流程圖:
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相關的資源大頭(圖片)還是一個老大難的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章