新闻
GStatic用户请注意:Draco团队强烈建议使用版本的URL来访问Draco GStatic内容。如果您使用的是在URL中包含v1/decoders 子字符串的URL,边缘缓存和GStatic传播延迟可能会导致瞬时错误,在新的Draco版本推出时可能难以诊断。为了避免这个问题,请将您的网站固定在一个有版本的版本上。
1.5.2版本发布
- 这与v1.5.1版相同,但有以下两个bug修复。
- 修复了DRACO_TRANSCODER_SUPPORTED启用的构建。
- 更新了ABI版本。
1.5.1版本发布
- 在版本中增加了支持断言的Emscripten构建,以及支持断言的GStatic构建的子集。见下面的文件列表。
- 现在支持对第三方依赖的自定义路径。参见 BUILDING.md 获取更多信息。
- CMake 配置文件 draco-config.cmake 现在经过测试,已知可以在 Linux、MacOS 和 Windows CMake 项目中使用 Draco。更多信息请参见
install_test子目录中的src/draco/tools。 - 错误修正。
1.5.0版本发布
- 增加了draco_transcoder工具。参见下面关于 glTF 转码工具的部分,以及 BUILDING.md 的构建和依赖信息。
- 这个版本对配置变量做了一些修改。
- DRACO_GLTF 标志已更名为 DRACO_GLTF_BITSTREAM,以帮助提高对其目的的理解,即把 Draco 功能限制在 Draco glTF 规范中所包含的功能。
- 通过 draco-config.cmake 和 find-draco.cmake(之前的 FindDraco.cmake)在 CMake 中导出的变量已经被重新命名。这不太可能影响任何现有的项目,因为上述文件没有正确形成。参见PR775以了解完整的修改细节。
- 增加了一个 CMake 版本文件。
- CMake安装目标现在直接使用CMake的绝对路径,而不是使用CMAKE_INSTALL_PREFIX来构建。这样做是为了使 Draco 更容易被下游的打包者使用,并且对从源代码中获取 Draco 的用户应该没有什么影响。
- 某些MSVC警告已经通过编译器标志改变了它们的级别,以减少MSVC编译器输出的噪音量。将MSVC警告级别设为4,或在CMake配置时定义DRACO_DEBUG_MSVC_WARNINGS以恢复以前的行为。
- 错误修正。
1.4.3版本发布
- 继续推荐使用版本的www.gstatic.comWASM和Javascript解码器。要使用V1.4.3版本,请使用这个URL。
- 错误修正
1.4.1版本发布
- 现在建议使用版本号为www.gstatic.com的WASM和Javascript解码器。要使用V1.4.1版,请使用这个网址。
- www.gstatic.com/draco/versi…
- 用要加载的文件替换*。例如
- www.gstatic.com/draco/versi…
- 这适用于v1.3.6和v1.4.0版本,并将适用于未来的Draco版本。
- www.gstatic.com/draco/versi…
- 错误修正
1.4.0版本的发布
- WASM和JavaScript解码器是由一个静态的URL托管的。
- 建议总是从这个URL中提取你的Draco WASM和JavaScript解码器。
- www.gstatic.com/draco/v1/de…
- 用要加载的文件替换*。例如。
- www.gstatic.com/draco/v1/de…
- 随着越来越多的网站开始使用静态URL,用户将从缓存中的Draco解码器中受益。
- 将npm模块改为使用WASM,性能提高了~200%。
- 更新了Emscripten到2.0。
- 这导致Draco解码器模块返回一个承诺,而不是直接返回模块。
- 关于如何处理承诺,请看示例代码。
- 将NORMAL量化的默认值改为8。
- 为解码器添加了新的数组API,并废弃了DecoderBuffer。
- 更多信息请参见PR#513。
- 改变了WASM/JavaScript捕获异常的行为。
- 更多信息请参见问题#629。
- 代码清理。
- Emscripten的构建现在禁用了NODEJS_CATCH_EXIT和NODEJS_CATCH_REJECTION。
- CLI工具的作者可能希望添加自己的错误处理程序。
- 增加了Maya插件的构建。
- 更新了Unity插件的构建。
- 构建现在以存档的形式存储。
- 增加了iOS构建。
- Unity 用户可能希望查看github.com/atteneder/D…
- 错误修复。
1.3.6版本发布
- WASM和JavaScript解码器现在由一个静态的URL托管。
- 建议总是从这个URL中提取你的Draco WASM和JavaScript解码器。
- www.gstatic.com/draco/v1/de…
- 用要加载的文件替换*。例如。
- www.gstatic.com/draco/v1/de…
- 随着越来越多的网站开始使用静态URL,用户将从缓存中的Draco解码器中受益。
- 改变了网络实例,从静态URL中提取Draco解码器
- 为Draco WASM解码器添加了新的API,使性能提高了~15%。
- 减少了Draco WASM解码器的大小~20%。
- 为Draco Unity插件添加了对通用和多属性的支持
- 为Draco Unity添加了新的API,使解码器的性能提高了~15%。
- 改变了量化的默认值。
- 位置:11
- 正常情况:7
- TEX_COORD: 10
- 颜色:8
- GENERIC: 8
- 代码清理
- 错误修正
1.3.5版本发布
- 增加了为通用场景描述建立Draco的选项
- 代码清理
- 错误修正
1.3.4版发布
- 发布了Draco动画代码
- 修复了Unity的问题
- 更改了各种文件的位置和名称
1.3.3版发布
- 在Javascript API中添加了ExpertEncoder
- 允许开发者为每个属性id设置量化选项
- 错误修复
1.3.2版本发布
- 错误修正
1.3.1版本发布
- 修复跳过一个属性转换时的多属性问题
1.3.0版本发布
- 改进了基于kD-tree的点云编码
- 现在适用于具有任意数量属性的点云
- 支持所有整数属性类型和量化的浮点类型
- 改进了网格压缩,最高可达10%(平均~2%)。
- 对于网格,1.3.0比特流与1.2.x解码器完全兼容
- 改进了Javascript API
- 增加了对所有有符号和无符号整数类型的支持
- 在我们的Javascript编码器API中增加了对点云的支持
- 在PLY解码器中增加了对整数属性的支持
- 错误修正
以前的版本
描述
Draco是一个用于压缩和解压3D几何网格和点云的库。它的目的是改善3D图形的存储和传输。
Draco是为压缩效率和速度而设计和建造的。该代码支持压缩点、连接信息、纹理坐标、颜色信息、法线以及与几何体相关的任何其他通用属性。有了Draco,使用3D图形的应用程序可以在不影响视觉保真度的情况下大大缩小。对用户来说,这意味着现在可以更快地下载应用程序,浏览器中的3D图形可以更快地加载,VR和AR场景现在可以用一小部分带宽进行传输并快速渲染。
Draco以C++源代码的形式发布,可用于压缩3D图形,也可用于编码数据的C++和Javascript解码器。
内容
构建
请参阅"构建",了解构建说明。
使用方法
统一性
关于使用Unity与Draco的最佳信息,请访问github.com/atteneder/D…。
关于使用Unity与Draco的一个简单例子,请看unity文件夹中的README。
WASM和JavaScript解码器
建议始终从Draco的WASM和JavaScript解码器中提取。
https://www.gstatic.com/draco/v1/decoders/
随着越来越多的网站开始使用静态URL,用户将从缓存中的Draco解码器中受益。
命令行应用程序
从构建文件中创建的默认目标将是draco_encoder 和draco_decoder 命令行应用程序。此外,draco_transcoder ,当CMake运行时,DRACO_TRANSCODER_SUPPORTED变量设置为ON(更多细节见BUILDING)。对于所有的应用程序,如果你在没有任何参数或-h 的情况下运行它们,应用程序将输出用法和选项。
编码工具
draco_encoder 将读取OBJ或PLY文件作为输入,并输出Draco编码的文件。我们把斯坦福大学的Bunny网格包括在内进行测试。基本的命令行是这样的。
./draco_encoder -i testdata/bun_zipper.ply -o out.drc
量化参数的值为0 ,将不对指定的属性进行任何量化处理。除了0 以外的任何值都会将指定属性的输入值量化到该位数。例如。
./draco_encoder -i testdata/bun_zipper.ply -o out.drc -qp 14
将对位置进行量化到14位(位置坐标的默认值是11位)。
一般来说,你对你的属性量化得越多,你将得到更好的压缩率。这要由你的项目来决定它能容忍多少偏差。一般来说,大多数项目可以设置大约11 的量化值,而不会有任何明显的质量差异。
压缩级别(-cl)参数可以打开/关闭不同的压缩功能。
./draco_encoder -i testdata/bun_zipper.ply -o out.drc -cl 8
一般来说,最高的设置,10 ,会有最大的压缩,但解压速度最差。0 ,会有最小的压缩,但解压速度最好。默认设置是7 。
编码点云
你可以通过指定-point_cloud 参数对点云数据进行编码,draco_encoder 。如果你指定了-point_cloud 参数,并有一个网格输入文件,draco_encoder 将忽略连接数据,并对网格文件中的位置进行编码。
./draco_encoder -point_cloud -i testdata/bun_zipper.ply -o out.drc
这个命令行将把网格输入编码为点云,尽管输入的点云可能不会产生代表其他点云的压缩。具体来说,对于更大更密集的点云,我们可以期待更好的压缩率。
解码工具
draco_decoder 将读取Draco文件作为输入,并输出OBJ或PLY文件。基本的命令行看起来像这样。
./draco_decoder -i in.drc -o out.obj
glTF转码工具
draco_transcoder 可以用来给glTF资产添加Draco压缩。基本的命令行看起来是这样的。
./draco_transcoder -i in.glb -o out.glb
这条命令行将为in.glb 文件中的所有网格添加几何体压缩。可以为不同的glTF属性指定量化值,与draco_encoder 工具类似。例如,-qp ,可以用来定义位置属性的量化。
./draco_transcoder -i in.glb -o out.glb -qp 12
C++解码器API
如果你想在你的应用程序中添加解码功能,你将需要包含draco_dec 库。为了使用Draco解码器,你需要用压缩的数据初始化一个DecoderBuffer 。然后调用DecodeMeshFromBuffer() 来返回一个解码的网格对象,或者调用DecodePointCloudFromBuffer() 来返回一个解码的PointCloud 对象。比如说:
draco::DecoderBuffer buffer;
buffer.Init(data.data(), data.size());
请参阅src/draco/mesh/mesh.h以了解完整的Mesh 类接口,以及src/draco/point_cloud/point_cloud.h以了解完整的PointCloud 类接口。
Javascript编码器API
Javascript编码器位于javascript/draco_encoder.js 。编码器API可以用来压缩网格和点云。为了使用编码器,你需要首先创建一个DracoEncoderModule 的实例。然后使用这个实例创建MeshBuilder 和Encoder 对象。MeshBuilder 是用来从几何数据中构建一个网格,然后可以通过Encoder 进行压缩。首先使用new encoderModule.Mesh() 创建一个网格对象。然后,使用AddFacesToMesh() 为网格添加索引,使用AddFloatAttributeToMesh() 为网格添加属性数据,如位置、法线、颜色和纹理坐标。网格构建完成后,你可以使用EncodeMeshToDracoBuffer() 来压缩网格。比如说:
const mesh = {
indices : new Uint32Array(indices),
vertices : new Float32Array(vertices),
normals : new Float32Array(normals)
};
const encoderModule = DracoEncoderModule();
const encoder = new encoderModule.Encoder();
const meshBuilder = new encoderModule.MeshBuilder();
const dracoMesh = new encoderModule.Mesh();
const numFaces = mesh.indices.length / 3;
const numPoints = mesh.vertices.length;
meshBuilder.AddFacesToMesh(dracoMesh, numFaces, mesh.indices);
meshBuilder.AddFloatAttributeToMesh(dracoMesh, encoderModule.POSITION,
numPoints, 3, mesh.vertices);
if (mesh.hasOwnProperty('normals')) {
meshBuilder.AddFloatAttributeToMesh(
dracoMesh, encoderModule.NORMAL, numPoints, 3, mesh.normals);
}
if (mesh.hasOwnProperty('colors')) {
meshBuilder.AddFloatAttributeToMesh(
dracoMesh, encoderModule.COLOR, numPoints, 3, mesh.colors);
}
if (mesh.hasOwnProperty('texcoords')) {
meshBuilder.AddFloatAttributeToMesh(
dracoMesh, encoderModule.TEX_COORD, numPoints, 3, mesh.texcoords);
}
if (method === "edgebreaker") {
encoder.SetEncodingMethod(encoderModule.MESH_EDGEBREAKER_ENCODING);
} else if (method === "sequential") {
encoder.SetEncodingMethod(encoderModule.MESH_SEQUENTIAL_ENCODING);
}
const encodedData = new encoderModule.DracoInt8Array();
// Use default encoding setting.
const encodedLen = encoder.EncodeMeshToDracoBuffer(dracoMesh,
encodedData);
encoderModule.destroy(dracoMesh);
encoderModule.destroy(encoder);
encoderModule.destroy(meshBuilder);
请参阅src/draco/javascript/emscripten/draco_web_encoder.idl以了解完整的API。
Javascript解码器API
Javascript解码器位于javascript/draco_decoder.js中。该Javascript解码器可以对网格和点云进行解码。为了使用这个解码器,你必须首先创建一个DracoDecoderModule 的实例。然后用这个实例来创建DecoderBuffer 和Decoder 对象。在DecoderBuffer 中设置编码数据。然后调用GetEncodedGeometryType() 来识别几何体的类型,例如:网格或点云。然后调用DecodeBufferToMesh() 或DecodeBufferToPointCloud() ,将返回一个Mesh对象或点云。比如说。
// Create the Draco decoder.
const decoderModule = DracoDecoderModule();
const buffer = new decoderModule.DecoderBuffer();
buffer.Init(byteArray, byteArray.length);
// Create a buffer to hold the encoded data.
const decoder = new decoderModule.Decoder();
const geometryType = decoder.GetEncodedGeometryType(buffer);
// Decode the encoded geometry.
let outputGeometry;
let status;
if (geometryType == decoderModule.TRIANGULAR_MESH) {
outputGeometry = new decoderModule.Mesh();
status = decoder.DecodeBufferToMesh(buffer, outputGeometry);
} else {
outputGeometry = new decoderModule.PointCloud();
status = decoder.DecodeBufferToPointCloud(buffer, outputGeometry);
}
// You must explicitly delete objects created from the DracoDecoderModule
// or Decoder.
decoderModule.destroy(outputGeometry);
decoderModule.destroy(decoder);
decoderModule.destroy(buffer);
请参阅src/draco/javascript/emscripten/draco_web_decoder.idl以了解完整的API。
Javascript解码器的性能
Javascript解码器是用动态内存构建的。这将让解码器在所有的压缩数据中工作。但这个选项不是最快的。预先分配内存可以使解码器的速度提高2倍。如果你知道你的项目的所有内存要求,你可以通过相应地改变CMakeLists.txt ,打开静态内存。
元数据API
从v1.0版开始,Draco提供了元数据功能,用于编码几何体以外的数据。它可以用来将任何自定义的数据与几何图形一起编码。例如,我们可以启用元数据功能来编码属性的名称、子对象的名称和自定义信息。对于一个网格和点云,它可以有一个顶级的几何体元数据类。然后顶层元数据可以有分层的元数据。除此以外,顶层元数据可以有每个属性的元数据,这被称为属性元数据。属性元数据应该用网格中对应的属性ID进行初始化。元数据API在C++和Javascript中都有提供。例如,在C++中添加元数据。
draco::PointCloud pc;
// Add metadata for the geometry.
std::unique_ptr<draco::GeometryMetadata> metadata =
std::unique_ptr<draco::GeometryMetadata>(new draco::GeometryMetadata());
metadata->AddEntryString("description", "This is an example.");
pc.AddMetadata(std::move(metadata));
// Add metadata for attributes.
draco::GeometryAttribute pos_att;
pos_att.Init(draco::GeometryAttribute::POSITION, nullptr, 3,
draco::DT_FLOAT32, false, 12, 0);
const uint32_t pos_att_id = pc.AddAttribute(pos_att, false, 0);
std::unique_ptr<draco::AttributeMetadata> pos_metadata =
std::unique_ptr<draco::AttributeMetadata>(
new draco::AttributeMetadata(pos_att_id));
pos_metadata->AddEntryString("name", "position");
// Directly add attribute metadata to geometry.
// You can do this without explicitly add |GeometryMetadata| to mesh.
pc.AddAttributeMetadata(pos_att_id, std::move(pos_metadata));
在C++中从一个几何体中读取元数据。
// Get metadata for the geometry.
const draco::GeometryMetadata *pc_metadata = pc.GetMetadata();
// Request metadata for a specific attribute.
const draco::AttributeMetadata *requested_pos_metadata =
pc.GetAttributeMetadataByStringEntry("name", "position");
请参阅src/draco/metadata和src/draco/point_cloud以了解完整的API。
NPM包
Draco NPM NodeJS包位于javascript/npm/draco3d中。详细使用方法请参见该文件夹中的文档。
three.js 渲染器示例
下面是一个用Draco通过Javascript解码器加载的几何图形压缩的例子,使用three.js 渲染器。
请参阅javascript/example/README.md文件以了解更多信息。
GStatic Javascript的构建
Emscripten构建的Draco Javascript解码器的预构建版本被托管在www.gstatic.com,在版本标记的目录中。
从v1.4.3版本开始,可用的文件是。
- draco_decoder.js
- draco_decoder.wasm
- draco_decoder_gltf.js
- draco_decoder_gltf.wasm
- draco_wasm_wrapper.js
- draco_wasm_wrapper_gltf.js
从v1.5.1版本的断言开始,以下文件的启用版本可以使用。
技术支持
如有问题/意见,请发电子邮件至 draco-3d-discuss@googlegroups.com
如果你在这个库中发现了错误,请在github.com/google/drac…上提交问题。
补丁是被鼓励的,可以通过分叉这个项目并通过GitHub提交拉动请求来提交。更多细节请参见 "贡献"。
许可证
根据Apache许可证2.0版("许可证")授权;除非遵守许可证规定,否则你不得使用此文件。你可以在以下网址获得一份许可证的副本
除非适用的法律要求或书面同意,根据许可证分发的软件是以 "原样 "为基础分发的,没有任何形式的保证或条件,无论是明示还是暗示。有关许可证下的权限和限制的具体语言,请参阅许可证。
参考资料
斯坦福大学图形系的兔子模型graphics.stanford.edu/data/3Dscan…