This is an egui integration for winit and vulkano.
You'll need a Vulkano target image as an input to which the UI will be painted. The aim of this is to allow a simple enough API to separate UI nicely out of your renderer and make it easy to build your immediate mode UI with Egui.
- Create your own renderer with Vulkano, and allow access to Vulkano's gfx queue
Arc<Queue>
and Vulkano's winit surfaceArc<Surface<Window>>
- Create Gui integration with the surface & gfx queue
// Has its own renderpass. Modify GuiConfig to determine image clear behavior etc.
let mut gui = Gui::new(&event_loop, renderer.surface(), renderer.queue(), GuiConfig::default());
// Or with subpass. This means that you must create the renderpass yourself. Egui subpass will then draw on your
// image.
let mut gui = Gui::new_with_subpass(&event_loop, renderer.surface(), renderer.queue(), subpass, GuiConfig::default());
- Inside your event loop, update
gui
integration withWindowEvent
gui.update(&event);
- Fill immediate mode UI through the integration in
Event::RedrawRequested
before you render
gui.immediate_ui(|gui| {
let ctx = gui.context();
// Fill egui UI layout here
});
// Or
gui.begin_frame();
// fill egui layout...
// And when you render with `gui.draw_on_image(..)`, this will finish the egui frame
- Render gui via your renderer on any image or most likely on your swapchain images:
// Acquire swapchain future
let before_future = renderer.acquire().unwrap();
// Render gui by passing the acquire future (or any) and render target image (swapchain image view)
let after_future = gui.draw_on_image(before_future, renderer.swapchain_image_view());
// Present swapchain
renderer.present(after_future, true);
// ----------------------------------
// Or if you created the integration with subpass
let cb = gui.draw_on_subpass_image(framebuffer_dimensions);
draw_pass.execute(cb);
See the examples directory for better usage guidance.
Remember, on Linux, you need to install following to run Egui
sudo apt-get install libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev
./run_all_examples.sh
This integration would not have been possible without the examples from vulkano-examples or egui_winit_ash_vk_mem.