#vector #normal #compression

normal_pack

使用八面体编码压缩正常向量(或任何3D单位向量)

5个版本

0.1.4 2024年7月22日
0.1.3 2024年7月18日
0.1.2 2024年7月18日
0.1.1 2024年7月18日
0.1.0 2024年7月18日

#517 in 编码

Download history 180/week @ 2024-07-14 107/week @ 2024-07-21 16/week @ 2024-07-28

每月 303 次下载

MIT 许可证

20KB
194

使用八面体编码压缩正常向量(或任何3D单位向量)。

Crates.io Documentation License: MIT

这种有损压缩方案可以实现高达6:1的压缩比,平均误差率低于1度,具体取决于选择哪种表示方式。

示例

let normal = [-0.5082557, 0.54751796, 0.6647558];

let encoded = normal_pack::EncodedUnitVector3U8::encode(normal);
let decoded = encoded.decode();

assert_eq!(decoded, [-0.52032965, 0.5473598, 0.6554802]);

为什么压缩我的法线?

对于3D渲染器来说,内存带宽通常会成为瓶颈,例如当从VRAM中加载法线到高多边形网格的顶点着色器时。法线的较小内存占用对应于内存带宽节省和在这种场景下更高的FPS。

1度的误差有多糟糕?

teapot 示例生成一个参考视觉图像,并包含在着色器中解码向量的wgsl代码。

标准[f32; 3]表示

teapot_packed_u8

打包到[u8; 2]

teapot_no_packing

作为视频

normal_pack_error

示例中使用的天空盒是Emil Persson(别名Humus)的作品。 http://www.humus.name

依赖项

~0–670KB
~13K SLoC