#网格化 #体素 #贪婪 #二叉 # #体素游戏

binary-greedy-meshing

将 https://github.com/cgerikj/binary-greedy-meshing 转换为Rust的版本

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

Download history 231/week @ 2024-08-01 120/week @ 2024-08-08 515/week @ 2024-08-15

868每月下载量

MIT许可证

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文件中的此示例

性能

在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不支持其他尺寸。

无运行时依赖