Draco使用笔记(1)——图形解压缩

简介: Draco使用笔记(1)——图形解压缩

Draco使用笔记(1)——图形解压缩

目录

1. 概述

Draco是Google开发的图形压缩库,用于压缩和解压缩3D几何网格(geometric mesh)和点云(point cloud)。Draco还可以直接对obj或者ply格式的三维数据进行压缩和解压缩,甚至编译成wasm在浏览器端对glTF压缩和解压缩。

2. 详论

2.1. 工具

Draco编译完成后直接提供了压缩和解压缩的工具draco_decoder.exe和draco_encoder.exe。通过命令行,我们对某个已经压缩好的文件进行解压缩:

draco_decoder -i "D:/1.bin" -o "D:/1.ply"

2.2. 代码

如果需要用代码的方式实现,可以参考draco_decoder.exe中的源码,具体实现如下:

#include <core/decoder_buffer.h>
#include <io/mesh_io.h>
#include <fstream>
#include <iostream>
using namespace draco;
using namespace std;
int main() {
  string filePath = "D:/1.bin";
  ifstream infile(filePath, ios::binary);
  infile.seekg(0, std::ios::end);
  size_t data_size = infile.tellg();
  infile.seekg(0, std::ios::beg);
  vector<char> data(data_size, 0);
  infile.read(data.data(), data_size);
  DecoderBuffer buffer;
  buffer.Init(data.data(), data_size);
  //解压缩
  std::unique_ptr<draco::PointCloud> pc;
  auto type_statusor = draco::Decoder::GetEncodedGeometryType(&buffer);
  if (!type_statusor.ok()) {
    return 1;
  }
  //解析数据
  const draco::EncodedGeometryType geom_type = type_statusor.value();
  if (geom_type == draco::TRIANGULAR_MESH) {
    draco::Decoder decoder;
    auto statusor = decoder.DecodeMeshFromBuffer(&buffer);
    if (!statusor.ok()) {
      return 1;
    }
    std::unique_ptr<draco::Mesh> mesh = std::move(statusor).value();
    if (mesh) {
      const int pos_att_id =
          mesh->GetNamedAttributeId(GeometryAttribute::POSITION);
      //解析顶点属性
      for (PointIndex v(0); v < mesh->num_points(); ++v) {
        const auto *const pos_att = mesh->attribute(pos_att_id);
        const uint8_t *pos = pos_att->GetAddress(pos_att->mapped_index(v));
        int64_t length = pos_att->byte_stride();
        float temp[3];
        memcpy(temp, pos, length);
        printf("%f,%f,%f\t", temp[0], temp[1], temp[2]);
      }
      //解析顶点索引
      for (FaceIndex f(0); f < mesh->num_faces(); ++f) {
        printf("%d,%d,%d\t", mesh->face(f)[0].value(), mesh->face(f)[1].value(),
               mesh->face(f)[2].value());
      }
    }
  }
}

需要注意的就是两点:

  1. 传入draco::Decoder进行解压缩的需要二进制流,这个在从文件读取时一定要注意,很容易读成了文本流导致不能正常解压缩。
  2. 对draco::Mesh的解析。draco::Mesh的顶点属性中的buffer并不是顶点索引中存储的数据。这个时压缩算法决定的,解析Mesh时一定要按照实例中解析。直接解析顶点属性中的buffer会得不到正确的顶点顺序。

分类: 基础组件

标签: 图形 , Draco , 压缩 , Mesh


相关文章
|
编解码 图形学 C++
如何在Blender中压缩/减小GLTF模型的大小
Blender是一款功能强大的开源软件,旨在创建3D图形,动画和视觉效果。它支持多种文件格式的导入和导出,包括GLB,GLTF,DAE,OBJ,ABC,USD,BVH,PLY,STL,FBX和X3D。这种适应性使其成为各种3D项目和工作流程的宝贵工具。(https://www.blender.org/download/)。
980 0
|
机器学习/深度学习 并行计算 PyTorch
安装GPU版本tensorflow、pytorch
安装GPU版本tensorflow、pytorch
安装GPU版本tensorflow、pytorch
|
6月前
|
存储 关系型数据库 分布式数据库
|
编解码 缓存 算法
Three.js如何降低3D模型的大小以便更快加载
为加快600MB的3D模型在Three.js中的加载速度,可采用多种压缩方法:1) 减少顶点数,使用简化工具或LOD技术;2) 压缩纹理,降低分辨率或转为KTX2等格式;3) 采用高效文件格式如glTF 2.0及draco压缩;4) 合并材质减少数量;5) 利用Three.js内置优化如BufferGeometry;6) 按需分批加载模型;7) Web Workers后台处理;8) 多模型合并减少绘制;9) 使用Texture Atlas及专业优化工具。示例代码展示了使用GLTFLoader加载优化后的模型。
1412 12
|
12月前
|
机器学习/深度学习 前端开发 JavaScript
WebAssembly:让前端性能突破极限的秘密武器
WebAssembly(简称 WASM)作为前端开发的性能加速器,能够让代码像 C++ 一样在浏览器中高速运行,突破了 JavaScript 的性能瓶颈。本文详细介绍了 WebAssembly 的概念、工作原理以及其在前端性能提升中的关键作用。通过与 JavaScript 的配合,WASM 让复杂运算如图像处理、3D 渲染、机器学习等在浏览器中流畅运行。文章还探讨了如何逐步集成 WASM,展示其在网页游戏、高计算任务中的实际应用。WebAssembly 为前端开发者提供了新的可能性,是提升网页性能、优化用户体验的关键工具。
5235 2
WebAssembly:让前端性能突破极限的秘密武器
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
24207 0
|
Ubuntu Linux Docker
弃用Docker Desktop:在WSL2中玩转Docker之Docker Engine 部署与WSL入门
弃用Docker Desktop:在WSL2中玩转Docker之Docker Engine 部署与WSL入门
19148 4
|
Web App开发 算法 前端开发
Cesium开发: Draco模型压缩
Cesium开发: Draco模型压缩
803 1
|
缓存 并行计算 算法
上帝视角看GPU(5):图形流水线里的不可编程单元
上帝视角看GPU(5):图形流水线里的不可编程单元
482 0
|
存储 编解码
pcl 点云压缩与解压缩
pcl 点云压缩与解压缩
pcl 点云压缩与解压缩