关于 bevy-vfx
这是面向 Bevy 0.19 的视觉特效技能,涵盖粒子系统、翻页动画、着色器、矢量图形和 Gaussian splats。它帮助 Bevy 开发者根据渲染需求与平台限制选择技术和匹配的 crate 版本。
主要功能
- 01按视觉与模拟需求选择特效方案
- 02使用 Hanabi 进行 GPU 粒子模拟
- 03通过翻页动画或精灵创建特效
- 04用 WGSL 材质构建程序化特效
- 05渲染矢量图形和 Gaussian splats
适用场景
- 01为 Bevy 场景添加模拟粒子
- 02制作可重复使用的火花或爆炸
- 03实现火焰、水或溶解效果
- 04展示烘焙光照的摄影测量场景
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ chrisgliddon/ bevy-skills --skill bevy-vfx安装后在 Claude Code 中输入/bevy-vfx确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/gaussian-splats.mdhanabi-2d-vs-3d.mdhanabi-anatomy.mdhanabi-modifiers.mdnon-hanabi-vfx.mdperformance.mdshader-effects.md详细介绍
Bevy 0.19 — 视觉特效
将此技能用于粒子、程序化着色器效果、翻页动画、矢量形状和高斯泼溅场景渲染。
支持的 crate 组合
[dependencies]
bevy = "0.19"
bevy_hanabi = "0.19"
bevy_spritesheet_animation = "7.0.1"
bevy_vector_shapes = "0.13.1"
# The default feature set enables a nightly-only alias. This stable-Rust preset
# retains native file loading, PLY/gcloud formats, and CPU/GPU sort options.
bevy_gaussian_splatting = { version = "8.0.1", default-features = false, features = ["headless"] }
bevy_spark 0.2 面向 Bevy 0.18。不要将其添加到 Bevy 0.19 依赖图中。请使用 bevy_gaussian_splatting 8,或在单独的进程中隔离较旧的渲染器。
选择最精简的合适方案
| 需求 | 技术 |
|---|---|
| 数千个独立模拟的粒子 | bevy_hanabi |
| 可重复使用的命中火花、枪口焰或爆炸效果 | 精灵表翻页动画 |
| 少于大约 100 个简单粒子 | Bevy Sprite 实体和一个系统 |
| 全表面的火焰、水、溶解或扭曲效果 | 自定义 Material + WGSL |
| 清晰的圆环、弧线、闪电或瞄准形状 | bevy_vector_shapes |
| 基于摄影测量、烘焙光照的场景 | bevy_gaussian_splatting |
Hanabi 标准效果
此模式使用与 Bevy 0.19 兼容的 bevy_hanabi 0.19 API:
use bevy::prelude::*;
use bevy_hanabi::prelude::{
AccelModifier, Attribute, ColorOverLifetimeModifier, EffectAsset, ExprWriter,
HanabiPlugin, ParticleEffect, SetAttributeModifier, SetPositionSphereModifier,
SetVelocitySphereModifier, ShapeDimension, SpawnerSettings,
};
fn main() {
App::new()
.add_plugins((DefaultPlugins, HanabiPlugin))
.add_systems(Startup, setup)
.run();
}
fn setup(mut commands: Commands, mut effects: ResMut<Assets<EffectAsset>>) {
commands.spawn((
Camera3d::default(),
Transform::from_xyz(0.0, 3.0, 20.0).looking_at(Vec3::ZERO, Vec3::Y),
));
let writer = ExprWriter::new();
let position = SetPositionSphereModifier {
center: writer.lit(Vec3::ZERO).expr(),
radius: writer.lit(1.0_f32).expr(),
dimension: ShapeDimension::Volume,
};
let velocity = SetVelocitySphereModifier {
center: writer.lit(Vec3::ZERO).expr(),
speed: writer.lit(4.0_f32).expr(),
};
let lifetime = SetAttributeModifier::new(
Attribute::LIFETIME,
writer.lit(0.5_f32).uniform(writer.lit(1.5_f32)).expr(),
);
let age = SetAttributeModifier::new(Attribute::AGE, writer.lit(0.0_f32).expr());
let gravity = AccelModifier::new(writer.lit(Vec3::new(0.0, -6.0, 0.0)).expr());
let mut colors: bevy_hanabi::Gradient<Vec4> = bevy_hanabi::Gradient::new();
colors.add_key(0.0, Vec4::new(4.0, 0.5, 0.0, 1.0));
colors.add_key(0.5, Vec4::new(2.0, 1.0, 0.0, 0.8));
colors.add_key(1.0, Vec4::new(0.5, 0.5, 0.5, 0.0));
let effect = EffectAsset::new(
16_384,
SpawnerSettings::rate(200.0_f32.into()),
writer.finish(),
)
.with_name("ember_burst")
.init(position)
.init(velocity)
.init(lifetime)
.init(age)
.update(gravity)
.render(ColorOverLifetimeModifier::new(colors));
commands.spawn((
Name::new("ember_burst"),
ParticleEffect::new(effects.add(effect)),
Transform::default(),
Visibility::default(),
));
}
关键规则
- 使用
ColorOverLifetimeModifier前,先初始化Attribute::LIFETIME和Attribute::AGE。 ExprWriter::lit返回一个 writer 表达式;当修饰器需要表达式句柄时,使用.expr()。- 显式导入 Hanabi 类型,因为 Bevy UI 和 Hanabi 都导出了名为
Gradient的类型。 - 将
ParticleEffect作为组件生成。其必需组件会提供内部渲染世界状态;不存在ParticleEffectBundle。 - Hanabi 模拟使用计算着色器。因此,Web 构建需要 WebGPU。精灵翻页动画、CPU 粒子和兼容的自定义材质仍可使用 WebGL2。
bevy_gaussian_splatting 8支持 WebGL2 和 WebGPU,但其webgl2路径已在上游弃用。选择前请测试确切的浏览器/GPU 组合。- 高斯泼溅具有烘焙后的外观:它们不会自动获得 Bevy PBR 光照、阴影、碰撞或导航功能。
参考资料
另请参阅
bevy-pbr-materials— 自定义材质和 WGSL。bevy-rendering— 渲染器架构和后端选择。bevy-cameras— 取景和渲染目标。bevy-wasm-webgpu— 浏览器后端设置。bevy-animation— 不使用粒子的程序化缓动。
评论
支持 Markdown