Expand description
Flexible and reusable post-processing effects for wgpu
.
This library will provide a collection of post-processing effects that you can easily integrate into your rendering pipeline.
Effects
- A simple grayscale effect.
Usage
For example the grayscale effect can be used in principle like so:
use crate::wpp::{Effect, Frame};
// Initialize winit and wgpu
let event_loop = EventLoop::new();
let window = winit::window::Window::new(&event_loop).unwrap();
let instance = wgpu::Instance::new(wgpu::Backends::PRIMARY);
let surface = unsafe { instance.create_surface(&window) };
let adapter = instance.request_adapter(&Default::default()).await.unwrap();
let (device, queue) = adapter.request_device(&Default::default(), None).await.unwrap();
let swapchain_format = surface.get_supported_formats(&adapter)[0];
let mut config = wgpu::SurfaceConfiguration {
usage: wgpu::TextureUsages::RENDER_ATTACHMENT,
format: swapchain_format,
width: window.inner_size().width,
height: window.inner_size().height,
present_mode: wgpu::PresentMode::Fifo,
alpha_mode: wgpu::CompositeAlphaMode::Opaque,
};
surface.configure(&device, &config);
let extent = wgpu::Extent3d {
width: window.inner_size().width,
height: window.inner_size().height,
..Default::default()
};
// Create the post-processing effect.
let mut handler = wpp::grayscale::GrayscaleEffect::new(&device, &extent, swapchain_format);
// The event / render loop.
event_loop.run(move |event, _, control_flow| {
match event {
Event::WindowEvent {
event: WindowEvent::Resized(size),
..
} => {
let extent = wgpu::Extent3d {
width: size.width,
height: size.height,
..Default::default()
};
// Resize the post-processing effect accordingly.
handler.resize(&device, &extent);
window.request_redraw();
}
Event::RedrawRequested(_) => {
let frame = surface
.get_current_texture()
.unwrap();
let view = frame
.texture
.create_view(&wgpu::TextureViewDescriptor::default());
// Create a new frame for post-processing.
let process_frame = handler.start_frame(&device, &queue, &view);
// Render into the `process_frame`.
// [...]
// Resolve the post-processing on the frame after rendering.
process_frame.resolve();
// Finally present the post-processed frame.
frame.present();
}
_ => {}
}
});
Modules
Transforms colorized frames into a simple grayscale version.