今年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 bitsEncoded 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次方)去乘浮點數,然后取整。
這里必須指定obj的輸出文件,不然會解成ply格式,這樣 面 的信息就沒了。
一個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,不多述。
1?Draco 在當前的VR、AR生態下,基本上沒有直接使用的價值,想用它必須理解原理并修改源碼。 2?Draco 里面有比較好的mesh壓縮方案,有利于游戲引擎公司基于該代碼優化自己的模型設計。 3?Draco 所能壓縮的只是3D模型文件中的一部分,而3D相關的資源大頭(圖片)還是一個老大難的問題。
新聞熱點
疑難解答