Bevy Easy Compute
An easy way to run wgpu compute shaders within a bevy app.
Getting Started
Add the following line to your Cargo.toml
[]
= "0.16"
Usage
Setup
Declare your shaders in structs implementing ComputeShader
. The shader()
fn
should point to your shader source code. You need to derive TypePath
as well:
;
Next, declare a struct implementing ComputeWorker
to declare the bindings and
the logic of your worker:
;
Don't forget to add a shader file to your assets/
folder:
@group @binding
uni: f32;
@group @binding
my_storage: ;
@compute @workgroup_size
Add the AppComputePlugin
plugin to your app, as well as one
AppComputeWorkerPlugin
per struct implementing ComputeWorker
:
// ... other plugins ...
.add_plugins;
new
Your compute worker will now run every frame, during the PostUpdate
stage. To
read/write from it, use the AppComputeWorker<T>
resource!
(see simple.rs)
Multiple passes
You can have multiple passes without having to copy data back to the CPU in between:
let worker = new
.add_uniform
.add_storage
.add_staging
// add each item + `value` from `input` to `output`
// the order of the values represents their binding order
.
// multiply each element of `output` by itself
.
.build;
// the `output` buffer will contain [16.0, 25.0, 36.0, 49.0]
(see multi_pass.rs)
One shot computes
You can configure your worker to execute only when requested:
let worker = new
.add_uniform
.add_staging
.
// This `one_shot()` function will configure your worker accordingly
.one_shot
.build;
Then, you can call execute()
on your worker when you are ready to execute it:
// Execute it only when the left mouse button is pressed.
It will run at the end of the current frame, and you'll be able to read the data in the next frame.
(see one_shot.rs)
Examples
See examples
Bevy version mapping
Bevy | bevy_app_compute |
---|---|
0.16 | 0.16 |