3D文件压缩库——Draco简析

原创 2017年02月24日 14:21:26

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相关的资源大头(图片)还是一个老大难的问题。

版权声明:本文为博主原创文章,转载请注明出处:http://blog.csdn.net/jxt1234and2010

相关文章推荐

基于谷歌draco项目的测试---三维模型数据压缩方案

1、非常感谢google的分享,今天花了点时间下载编译测试,使用默认压缩率做了一个简单的对比,文件大小优化的非常明显。 项目下载地址:https://github.com/google/draco 我...

Draco:谷歌开源3D数据压缩工具

Draco是一个3D图形压缩工具,由Chrome Media团队开发。它用来压缩复杂3D模型上的数据,使其在浏览器中更快下载和更易显示,而且利用更少带宽。谷歌一个视频显示,Draco比gzip速度快多...

Skia深入分析1——skia上下文

前言:         断断续续跟Android的skia库打了两年交道,如今交接掉了,便写写关于skia的一些知识,也算了结一段职业生涯。 找了找网上关于skia的文章,基本上都过时了,讲得也不怎么...

Skia深入分析10——Skia库的性能与优化潜力

Skia库性能分析图形/渲染作为图形渲染引擎,性能上是非常重要的,按通常Android手机60帧的刷新率,绘制一帧的总时间只有16ms,可谓是毫厘必争。提升性能到最后,就必然跟硬件打交道,适配CPU,...

Skia深入分析4——skia路径绘制的实现

Skia路径绘制代码分析 路径绘制尽管使用频率相对于图像绘制、文本绘制低,但却是非常重要的一个基本特性。所有不规则图形(椭圆、圆角矩形、三角形、简单的文字),最后都避不开路径绘制。 而且,若自己实...

Android 图形绘制(skia)

Skia是什么?打个比方来说吧,现在让你来画一幅画,比如我们的国画—山水画。画一幅画需要哪些工具呢?从常识上来说,我们需要一张纸,比如白纸,或者带有某些背景图的纸张;需要毛笔,不同型号的毛笔;墨汁;颜...

Android NDK 使用skia 画图及显示图片的例子

经过查阅资料以及自己尝试,终于实现了在Android NDK 画图和打开并显示图片。现将自己的测试代码以及使用过程中的心得写下,希望与大家交流一下。   首先,测试程序的运行结果如下图所示: ...

Skia深入分析2——skia渲染架构

一、渲染层级 从渲染流程上分,Skia可分为如下三个层级: 1、指令层:SkPicture、SkDeferredCanvas->SkCanvas 这一层决定需要执行哪些绘图操作,绘图操作的预变换...

Skia深入分析3——skia图片绘制的实现(2)

此篇讲图像采样 一、采样流程 在上一节里的流程图有写到,图像绘制的实际渲染发生在某个blitter的blitRect函数中,我们先看一个具体的blitRect实现。 void SkARGB32_Sh...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)