
# Bevy Solari <img src="https://github.com/user-attachments/assets/94061fc8-01cf-4208-b72a-8eecad610d76" width="100" /> ## Preface - See release notes. - Please talk to me in #rendering-dev on discord or open a github discussion if you have questions about the long term plan, and keep discussion in this PR limited to the contents of the PR :) ## Connections - Works towards #639, #16408. - Spawned https://github.com/bevyengine/bevy/issues/18993. - Need to fix RT stuff in naga_oil first https://github.com/bevyengine/naga_oil/pull/116. ## This PR After nearly two years, I've revived the raytraced lighting effort I first started in https://github.com/bevyengine/bevy/pull/10000. Unlike that PR, which has realtime techniques, I've limited this PR to: * `RaytracingScenePlugin` - BLAS and TLAS building, geometry and texture binding, sampling functions. * `PathtracingPlugin` - A non-realtime path tracer intended to serve as a testbed and reference. ## What's implemented?  * BLAS building on mesh load * Emissive lights * Directional lights with soft shadows * Diffuse (lambert, not Bevy's diffuse BRDF) and emissive materials * A reference path tracer with: * Antialiasing * Direct light sampling (next event estimation) with 0/1 MIS weights * Importance-sampled BRDF bounces * Russian roulette ## What's _not_ implemented? * Anything realtime, including a real-time denoiser * Integration with Bevy's rasterized gbuffer * Specular materials * Non-opaque geometry * Any sort of CPU or GPU optimizations * BLAS compaction, proper bindless, and further RT APIs are things that we need wgpu to add * PointLights, SpotLights, or skyboxes / environment lighting * Support for materials other than StandardMaterial (and only a subset of properties are supported) * Skinned/morphed or otherwise animating/deformed meshes * Mipmaps * Adaptive self-intersection ray bias * A good way for developers to detect whether the user's GPU supports RT or not, and fallback to baked lighting. * Documentation and actual finalized APIs (literally everything is subject to change) ## End-user Usage * Have a GPU that supports RT with inline ray queries * Add `SolariPlugin` to your app * Ensure any `Mesh` asset you want to use for raytracing has `enable_raytracing: true` (defaults to true), and that it uses the standard uncompressed position/normal/uv_0/tangent vertex attribute set, triangle list topology, and 32-bit indices. * If you don't want to build a BLAS and use the mesh for RT, set enable_raytracing to false. * Add the `RaytracingMesh3d` component to your entity (separate from `Mesh3d` or `MeshletMesh3d`). ## Testing - Did you test these changes? If so, how? - Ran the solari example. - Are there any parts that need more testing? - Other test scenes probably. Normal mapping would be good to test. - How can other people (reviewers) test your changes? Is there anything specific they need to know? - See the solari.rs example for how to setup raytracing. - If relevant, what platforms did you test these changes on, and are there any important ones you can't test? - Windows 11, NVIDIA RTX 3080. --------- Co-authored-by: atlv <email@atlasdostal.com> Co-authored-by: IceSentry <IceSentry@users.noreply.github.com> Co-authored-by: Carter Anderson <mcanders1@gmail.com>
83 lines
2.5 KiB
Rust
83 lines
2.5 KiB
Rust
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
|
|
#![forbid(unsafe_code)]
|
|
#![doc(
|
|
html_logo_url = "https://bevy.org/assets/icon.png",
|
|
html_favicon_url = "https://bevy.org/assets/icon.png"
|
|
)]
|
|
#![no_std]
|
|
|
|
//! This module is separated into its own crate to enable simple dynamic linking for Bevy, and should not be used directly
|
|
|
|
/// `use bevy::prelude::*;` to import common components, bundles, and plugins.
|
|
pub mod prelude;
|
|
|
|
mod default_plugins;
|
|
pub use default_plugins::*;
|
|
|
|
#[cfg(feature = "bevy_window")]
|
|
pub use bevy_a11y as a11y;
|
|
#[cfg(feature = "bevy_animation")]
|
|
pub use bevy_animation as animation;
|
|
#[cfg(feature = "bevy_anti_aliasing")]
|
|
pub use bevy_anti_aliasing as anti_aliasing;
|
|
pub use bevy_app as app;
|
|
#[cfg(feature = "bevy_asset")]
|
|
pub use bevy_asset as asset;
|
|
#[cfg(feature = "bevy_audio")]
|
|
pub use bevy_audio as audio;
|
|
#[cfg(feature = "bevy_color")]
|
|
pub use bevy_color as color;
|
|
#[cfg(feature = "bevy_core_pipeline")]
|
|
pub use bevy_core_pipeline as core_pipeline;
|
|
#[cfg(feature = "bevy_core_widgets")]
|
|
pub use bevy_core_widgets as core_widgets;
|
|
#[cfg(feature = "bevy_dev_tools")]
|
|
pub use bevy_dev_tools as dev_tools;
|
|
pub use bevy_diagnostic as diagnostic;
|
|
pub use bevy_ecs as ecs;
|
|
#[cfg(feature = "bevy_gilrs")]
|
|
pub use bevy_gilrs as gilrs;
|
|
#[cfg(feature = "bevy_gizmos")]
|
|
pub use bevy_gizmos as gizmos;
|
|
#[cfg(feature = "bevy_gltf")]
|
|
pub use bevy_gltf as gltf;
|
|
#[cfg(feature = "bevy_image")]
|
|
pub use bevy_image as image;
|
|
pub use bevy_input as input;
|
|
#[cfg(feature = "bevy_input_focus")]
|
|
pub use bevy_input_focus as input_focus;
|
|
#[cfg(feature = "bevy_log")]
|
|
pub use bevy_log as log;
|
|
pub use bevy_math as math;
|
|
#[cfg(feature = "bevy_pbr")]
|
|
pub use bevy_pbr as pbr;
|
|
#[cfg(feature = "bevy_picking")]
|
|
pub use bevy_picking as picking;
|
|
pub use bevy_platform as platform;
|
|
pub use bevy_ptr as ptr;
|
|
pub use bevy_reflect as reflect;
|
|
#[cfg(feature = "bevy_remote")]
|
|
pub use bevy_remote as remote;
|
|
#[cfg(feature = "bevy_render")]
|
|
pub use bevy_render as render;
|
|
#[cfg(feature = "bevy_scene")]
|
|
pub use bevy_scene as scene;
|
|
#[cfg(feature = "bevy_solari")]
|
|
pub use bevy_solari as solari;
|
|
#[cfg(feature = "bevy_sprite")]
|
|
pub use bevy_sprite as sprite;
|
|
#[cfg(feature = "bevy_state")]
|
|
pub use bevy_state as state;
|
|
pub use bevy_tasks as tasks;
|
|
#[cfg(feature = "bevy_text")]
|
|
pub use bevy_text as text;
|
|
pub use bevy_time as time;
|
|
pub use bevy_transform as transform;
|
|
#[cfg(feature = "bevy_ui")]
|
|
pub use bevy_ui as ui;
|
|
pub use bevy_utils as utils;
|
|
#[cfg(feature = "bevy_window")]
|
|
pub use bevy_window as window;
|
|
#[cfg(feature = "bevy_winit")]
|
|
pub use bevy_winit as winit;
|