10个版本 (重大更新)

0.9.0 2024年8月9日
0.7.0 2023年11月19日
0.6.0 2023年8月11日
0.5.0 2023年3月11日
0.1.1 2022年2月22日

#195 in 游戏开发

Download history 7/week @ 2024-07-01 28/week @ 2024-07-29 106/week @ 2024-08-05 13/week @ 2024-08-12

每月下载 147

MIT/Apache

77KB
960

bevy_smud

crates.io MIT/Apache 2.0 crates.io docs.rs

符号距离场/函数 (SDF) 2D形状渲染,适用于 Bevy.

screenshot of a bird drawn with bevy_smud

Bevy smud 是一种使用 Bevy 便捷构建和渲染 sdf 形状的方法。

给定一个形状函数/表达式和一个填充类型,它在运行时生成着色器。

如果您将不同的 sdf 和填充组合的数量保持相对较低,那么它的性能相当不错。我的机器可以轻松处理 60fps 的 100k 个形状,同时有 40 种不同的形状/填充组合按随机顺序(见 gallery 示例)。

使用方法

SDF 是一种将空间中的点映射到表面距离的方法。如果点映射到正值,则它位于形状外部;如果是负值,则位于形状内部。这些“映射”可以通过函数描述,该函数以点作为输入并返回到表面的距离。例如,如果您想制作一个圆圈,它可以描述为 length(position - center) - radius。这样,所有与 center 距离为 radius 的点都将为 0,并定义形状的边缘。

此库包含许多描述几何原语的功能,使用单个表达式或体简写添加 sdf 时会自动导入。例如,上面的圆圈也可以描述为

sd_circle(p - center, 50.)

同样,还有许多其他形状(sd_ellipsesd_boxsd_rounded_boxsd_egg 等)

大多数内置形状是直接从 此页面 上的形状转换而来,该页面包含各种形状的截图。因此,该页面可能充当良好的参考资料。这里的转换使用 snake_case 而不是 camelCase。

要组合一个形状,您可以这样做

use bevy::prelude::*;
use bevy_smud::prelude::*;

fn main() {
    App::new()
        .add_plugins((DefaultPlugins, SmudPlugin))
        .add_systems(Startup, setup)
        .run();
}

fn setup(
    mut commands: Commands,
    mut shaders: ResMut<Assets<Shader>>,
) {
    commands.spawn(Camera2dBundle::default());

    let circle = shaders.add_sdf_expr("sd_circle(p, 50.)");

    commands.spawn(ShapeBundle {
        shape: SmudShape {
            color: Color::WHITE,
            sdf: circle,
            frame: Frame::Quad(55.),
            ..default()
        },
        ..default()
    });
}

确保您重用着色器,也就是说,不要每帧都调用 add_sdf_expr

您还可以在 .wgsl 文件中定义形状。注意,为了使用内置形状,您必须导入 smud,并且必须创建一个名为 sdf 的函数,它接受一个 vec2<f32> 并返回 f32

除此之外,请确保您了解如何组合形状、使用对称性和更改域。例如,上图中截图中的 bevy 是由几个圆、椭圆和一个用于喙的 vesica 构成的。

此外,请查看 示例。特别是,基本 示例应该是一个不错的起点。

展示

如果您想在这里展示您的项目,请向我发送一个 PR

  • 注意事项: dis order screenshot

警告

这个 crate 仍然相当实验性。

如果您想要更完整的版本,您可能需要查看 bevy_prototype_lyon

Bevy 版本支持

主分支针对最新的 bevy 版本。

bevy bevy_smud
0.14 0.9, main
0.12 0.7
0.11 0.6
0.10 0.5
0.9 0.4
0.8 0.3
0.7 0.2
0.6 0.1

谢谢!

这个 crate 的原创工作很少。它主要是将 bevy_spriteInigo Quilez sdf 渲染原语 端口到 wgsl 的混合。我只是以我找到的方便方式将两者结合在一起。

依赖项

~35–75MB
~1.5M SLoC