Realtime Path Tracer for Bevy

crates.io docs.rs

bevy-hikari is an implementation of global illumination for Bevy.

After Bevy releasing 0.8, the plugin moves to deferred hybrid path tracing. For the old version (0.1.x) which uses voxel cone tracing with anisotropic mip-mapping, please check the bevy-0.6 branch.

Bevy Version Support

| bevy | bevy-hikari | | ------ | ------------- | | 0.6 | 0.1 | | 0.8 | 0.2 |

Progress

Basic Usage

  1. Add HikariPlugin to your App after PbrPlugin
  2. Setup the scene with a directional light
  3. Set your camera's camera_render_graph to CameraRenderGraph::new(bevy_hikari::graph::NAME)

One can also configure the renderer by inserting the HikariConfig resource. Its definition is: rust pub struct HikariConfig { /// The interval of frames between sample validation passes. pub direct_validate_interval: usize, /// The interval of frames between sample validation passes. pub emissive_validate_interval: usize, /// Temporal reservoir sample count is capped by this value. pub max_temporal_reuse_count: usize, /// Spatial reservoir sample count is capped by this value. pub max_spatial_reuse_count: usize, /// Half angle of the solar cone apex in radians. pub solar_angle: f32, /// Threshold that emissive objects begin to lit others. pub emissive_threshold: f32, /// Count of indirect bounces. pub indirect_bounces: usize, /// Threshold for the indirect luminance to reduce fireflies. pub max_indirect_luminance: f32, /// Whether to do temporal sample reuse in ReSTIR. pub temporal_reuse: bool, /// Whether to do spatial sample reuse in ReSTIR. pub spatial_reuse: bool, /// Whether to do noise filtering. pub denoise: bool, /// Which TAA implementation to use. pub temporal_anti_aliasing: Option<TaaVersion>, }

Notes: - Please run with --release flag to avoid the texture non-uniform indexing error - Supported meshes must have these 3 vertex attributes: position, normal and uv

```rust use bevy::{pbr::PbrPlugin, prelude::, render::camera::CameraRenderGraph}; use bevy_hikari::prelude::; use std::f32::consts::PI;

fn main() { App::new() .addplugins(DefaultPlugins) .addplugin(PbrPlugin) // Add Hikari after PBR .addplugin(HikariPlugin) .addstartup_system(setup) .run(); }

fn setup( mut commands: Commands, mut meshes: ResMut>, mut materials: ResMut>, assetserver: Res, ) { // Plane commands.spawnbundle(PbrBundle { mesh: meshes.add(Mesh::from(shape::Plane { size: 5.0 })), material: materials.add(Color::rgb(0.3, 0.5, 0.3).into()), ..default() }); // Cube commands.spawnbundle(PbrBundle { mesh: meshes.add(Mesh::from(shape::Cube { size: 1.0 })), material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()), transform: Transform::from_xyz(0.0, 0.5, 0.0), ..default() });

// Only directional light is supported
commands.spawn_bundle(DirectionalLightBundle {
    directional_light: DirectionalLight {
        illuminance: 10000.0,
        ..Default::default()
    },
    transform: Transform {
        translation: Vec3::new(0.0, 5.0, 0.0),
        rotation: Quat::from_euler(EulerRot::XYZ, -PI / 4.0, PI / 4.0, 0.0),
        ..Default::default()
    },
    ..Default::default()
});

// Camera
commands.spawn_bundle(Camera3dBundle {
    // Set the camera's render graph to Hikari's
    camera_render_graph: CameraRenderGraph::new(bevy_hikari::graph::NAME),
    transform: Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y),
    ..Default::default()
});

} ```

Effects

You can check the video here.

Screenshots

License

Just like Bevy, all code in this repository is dual-licensed under either:

at your option.

Credits