Bevy App Compute
Dispatch and run compute shaders on bevy from App World .
Getting Started
Add the following line to your Cargo.toml
[]
= "0.10.2"
Usage
Setup
Declare your shaders in structs implementing ComputeShader
. The shader()
fn should point to your shader source code.
You need to derive TypeUuid
as well and assign a unique Uuid:
;
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
:
use *;
use AppComputePlugin;
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`
.
// 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
Features being worked upon
- Ability to read/write between compute passes.
- add more options to the api, like deciding
BufferUsages
or size of buffers. - Optimization. Right now the code is a complete mess.
- Tests. This badly needs tests.
Bevy version mapping
Bevy | bevy_app_compute |
---|---|
main | main |
0.10 | 0.10.1 |