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 游戏开发
每月下载 147 次
77KB
960 行
bevy_smud
符号距离场/函数 (SDF) 2D形状渲染,适用于 Bevy.
Bevy smud 是一种使用 Bevy 便捷构建和渲染 sdf 形状的方法。
给定一个形状函数/表达式和一个填充类型,它在运行时生成着色器。
如果您将不同的 sdf 和填充组合的数量保持相对较低,那么它的性能相当不错。我的机器可以轻松处理 60fps 的 100k 个形状,同时有 40 种不同的形状/填充组合按随机顺序(见 gallery 示例)。
使用方法
SDF 是一种将空间中的点映射到表面距离的方法。如果点映射到正值,则它位于形状外部;如果是负值,则位于形状内部。这些“映射”可以通过函数描述,该函数以点作为输入并返回到表面的距离。例如,如果您想制作一个圆圈,它可以描述为 length(position - center) - radius
。这样,所有与 center
距离为 radius
的点都将为 0,并定义形状的边缘。
此库包含许多描述几何原语的功能,使用单个表达式或体简写添加 sdf 时会自动导入。例如,上面的圆圈也可以描述为
sd_circle(p - center, 50.)
同样,还有许多其他形状(sd_ellipse
、sd_box
、sd_rounded_box
、sd_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
警告
这个 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_sprite
和 Inigo Quilez sdf 渲染原语 端口到 wgsl 的混合。我只是以我找到的方便方式将两者结合在一起。
依赖项
~35–75MB
~1.5M SLoC