13个版本
新版本 0.3.4 | 2024年8月22日 |
---|---|
0.3.3 | 2024年8月22日 |
0.2.0 | 2024年8月21日 |
0.1.6 | 2024年8月15日 |
103 in 图形API
868每月下载量
36KB
317 行
binary-greedy-meshing
最初是将 Binary Greedy Meshing v2 转换为Rust的版本,增加了对透明块的支持等改进。
如何使用
此crate用于Bevy体素游戏 Riverbed,您可以查看代码以获取使用示例。
最小示例
use binary_greedy_meshing as bgm;
fn pad_linearize(x: usize, y: usize, z: usize) -> usize {
z + 1 + (x + 1)*bgm::CS_P + (y + 1)*bgm::CS_P2
}
fn main() {
let mut voxels = [0; bgm::CS_P3];
// Add 2 voxels at position 0;0;0 and 0;1;0
voxels[pad_linearize(0, 0, 0)] = 1;
voxels[pad_linearize(0, 1, 0)] = 1;
// Contain useful buffers that can be cached and cleared
// with mesh_data.clear() to avoid re-allocation
let mut mesh_data = bgm::MeshData::new(bgm::CS);
// Fill the opacity mask, this can be cached
for (i, voxel) in voxels.iter().enumerate() {
// If the voxel is transparent we skip it
if *voxel == 0 {
continue;
}
let (r, q) = (i/bgm::CS_P, i%bgm::CS_P);
mesh_data.opaque_mask[r] |= 1 << q;
}
// Does the meshing, mesh_data.quads is the output
bgm::mesh(&voxels, &mut mesh_data);
}
如何处理 mesh_data.quads
mesh_data.quads
是一个 [Vec<u64>; 6]
,每个面类型一个Vec,每个u64按以下方式编码一个四边形的所有信息
(v_type << 32) | (h << 24) | (w << 18) | (z << 12) | (y << 6) | x
面组对应于向上、向下、向右、向左、向前、向后,按此顺序。(假设右手Y向上)
渲染四边形最快的方法是使用实例化(查看 此视频 了解更多关于该主题的信息),但如果不可用,您仍然可以将四边形转换为顶点和索引,创建一个常规网格,请参阅此Riverbed文件中的此示例
- src/render/mesh_utils.rs 用于 Face+Quad => 顶点的转换
- src/render/mesh_chunks.rs 用于其余的网格化代码(+ LOD)
性能
在Intel(R) Xeon(R) CPU E5-1650 v3 @ 3.50GHz上对crate进行基准测试
- 网格化(支持透明度):600μs
这与从库的原始C版本报告的50-200μs范围(无透明度)一致,因为透明度在隐藏面剔除阶段会带来显著的性能损耗。
网格生成也比block-mesh-rs快约7倍,在我的机器上,block-mesh-rs需要约4.5ms来贪婪地生成一个块。
块的大小为62^3(填充后为64^3),这个crate不支持其他尺寸。