cesium 获取圆形边界位置_WebGL 中的顶点数据压缩

本文介绍了在 WebGL 中压缩顶点数据以节省 GPU 内存的方法,特别是针对 Cesium 和 Mapbox 的实践。通过压缩颜色、半径和点阵坐标数据,减少了数据传输和内存占用。文中提到了颜色数据的 16-bit float 压缩、点阵坐标的 4-bit 存储以及半径的 16-bit 存储策略,并展示了使用 MemoryInfra 工具度量优化效果。
摘要由CSDN通过智能技术生成

之前我们介绍了点聚合图的绘制方案:潘与其:使用 k-d tree 实现点聚合图​zhuanlan.zhihu.com515c7c8690b107128e13a8fd215c9b48.png

对于每个圆形我们使用了如下的顶点数据:

attribute vec2 a_pos; // 瓦片坐标

attribute float a_radius; // 半径

attribute vec2 a_extrude; // 拉伸后的点阵坐标

attribute vec4 a_color; // 颜色

随着特性的增加,后续需要存储的顶点数据类型也会增多。例如后续增加基于要素的拾取,就需要存储 pickingId。

如果我们能尽量利用 vec4 存储这些顶点数据并采用一定的压缩技术,无疑能减少 CPU 侧向 GPU 侧传递数据的时间并节省大量 GPU 内存。另外,OpenGL 支持的 attribute 数目是有上限的,当然我们这个简单 DEMO 并不会超出。

本文会依次介绍以下内容:压缩颜色、半径以及点阵坐标数据

使用 Chrome MemoryInfra 度量 GPU 内存,对比优化前后效果

Cesium、Mapbox 中的实践,包括对于其他类型数据的压缩方案

压缩方案

首先以下的压缩方案都是需要在 CPU 侧 JS 中压缩,在 vertex shader 中解压。因此必然会牺牲一定运行时性能,但是在地理信息海量要素展示的场景下,换取的 GPU 内存收益是很客观的。

对于颜色数据每个分量其实只需要 8 bits 就够了,因此一个 16-bit float 就可以存储两个分量,这样就只需要 vec2 存储颜色数据,JS 中压缩方法如下:

function packUint8ToFloat(a: number, b: number) {

a = clamp(Math.floor(a), 0, 255);

b = clamp(Math.floor(b), 0, 255);

return 256 * a + b;

}

// vec2packUint8ToFloat(r, g);

packUint8ToFloat(b, a);

相应的,在 vertex shader 中进行解压:

vec2 unpack_float(const float packedValue) {

int packedIntValue = int(packedValue);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值