
# 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>
8.5 KiB
8.5 KiB
Cargo Features
Bevy exposes many features to customize the engine. Enabling them add functionalities but often come at the cost of longer compilation times and extra dependencies.
Default Features
The default feature set enables most of the expected features of a game engine, like rendering in both 2D and 3D, asset loading, audio and UI. To help reduce compilation time, consider disabling default features and enabling only those you need.
feature name | description |
---|---|
android-game-activity | Android GameActivity support. Default, choose between this and android-native-activity . |
android_shared_stdcxx | Enable using a shared stdlib for cxx on Android |
animation | Enable animation support, and glTF animation loading |
async_executor | Uses async-executor as a task execution backend. |
bevy_animation | Provides animation functionality |
bevy_anti_aliasing | Provides various anti aliasing solutions |
bevy_asset | Provides asset functionality |
bevy_audio | Provides audio functionality |
bevy_color | Provides shared color types and operations |
bevy_core_pipeline | Provides cameras and other basic render pipeline features |
bevy_core_widgets | Headless widget collection for Bevy UI. |
bevy_gilrs | Adds gamepad support |
bevy_gizmos | Adds support for rendering gizmos |
bevy_gltf | glTF support |
bevy_input_focus | Enable input focus subsystem |
bevy_log | Enable integration with tracing and log |
bevy_mesh_picking_backend | Provides an implementation for picking meshes |
bevy_pbr | Adds PBR rendering |
bevy_picking | Provides picking functionality |
bevy_render | Provides rendering functionality |
bevy_scene | Provides scene functionality |
bevy_sprite | Provides sprite functionality |
bevy_sprite_picking_backend | Provides an implementation for picking sprites |
bevy_state | Enable built in global state machines |
bevy_text | Provides text functionality |
bevy_ui | A custom ECS-driven UI framework |
bevy_ui_picking_backend | Provides an implementation for picking UI |
bevy_window | Windowing layer |
bevy_winit | winit window and input backend |
custom_cursor | Enable winit custom cursor support |
default_font | Include a default font, containing only ASCII characters, at the cost of a 20kB binary size increase |
hdr | HDR image format support |
ktx2 | KTX2 compressed texture support |
multi_threaded | Enables multithreaded parallelism in the engine. Disabling it forces all engine tasks to run on a single thread. |
png | PNG image format support |
smaa_luts | Include SMAA Look Up Tables KTX2 Files |
std | Allows access to the std crate. |
sysinfo_plugin | Enables system information diagnostic plugin |
tonemapping_luts | Include tonemapping Look Up Tables KTX2 files. If everything is pink, you need to enable this feature or change the Tonemapping method for your Camera2d or Camera3d . |
vorbis | OGG/VORBIS audio format support |
webgl2 | Enable some limitations to be able to use WebGL2. Please refer to the WebGL2 and WebGPU section of the examples README for more information on how to run Wasm builds with WebGPU. |
x11 | X11 display server support |
zstd | For KTX2 supercompression |
Optional Features
feature name | description |
---|---|
accesskit_unix | Enable AccessKit on Unix backends (currently only works with experimental screen readers and forks.) |
android-native-activity | Android NativeActivity support. Legacy, should be avoided for most new Android games. |
asset_processor | Enables the built-in asset processor for processed assets. |
async-io | Use async-io's implementation of block_on instead of futures-lite's implementation. This is preferred if your application uses async-io. |
basis-universal | Basis Universal compressed texture support |
bevy_ci_testing | Enable systems that allow for automated testing on CI |
bevy_debug_stepping | Enable stepping-based debugging of Bevy systems |
bevy_dev_tools | Provides a collection of developer tools |
bevy_image | Load and access image data. Usually added by an image format |
bevy_remote | Enable the Bevy Remote Protocol |
bevy_solari | Provides raytraced lighting (experimental) |
bevy_ui_debug | Provides a debug overlay for bevy UI |
bmp | BMP image format support |
critical-section | critical-section provides the building blocks for synchronization primitives on all platforms, including no_std . |
dds | DDS compressed texture support |
debug_glam_assert | Enable assertions in debug builds to check the validity of parameters passed to glam |
default_no_std | Recommended defaults for no_std applications |
detailed_trace | Enable detailed trace event logging. These trace events are expensive even when off, thus they require compile time opt-in |
dynamic_linking | Force dynamic linking, which improves iterative compile times |
embedded_watcher | Enables watching in memory asset providers for Bevy Asset hot-reloading |
experimental_pbr_pcss | Enable support for PCSS, at the risk of blowing past the global, per-shader sampler limit on older/lower-end GPUs |
exr | EXR image format support |
ff | Farbfeld image format support |
file_watcher | Enables watching the filesystem for Bevy Asset hot-reloading |
flac | FLAC audio format support |
ghost_nodes | Experimental support for nodes that are ignored for UI layouting |
gif | GIF image format support |
glam_assert | Enable assertions to check the validity of parameters passed to glam |
hotpatching | Enable hotpatching of Bevy systems |
ico | ICO image format support |
jpeg | JPEG image format support |
libm | Uses the libm maths library instead of the one provided in std and core . |
meshlet | Enables the meshlet renderer for dense high-poly scenes (experimental) |
meshlet_processor | Enables processing meshes into meshlet meshes for bevy_pbr |
minimp3 | MP3 audio format support (through minimp3) |
mp3 | MP3 audio format support |
pbr_anisotropy_texture | Enable support for anisotropy texture in the StandardMaterial , at the risk of blowing past the global, per-shader texture limit on older/lower-end GPUs |
pbr_multi_layer_material_textures | Enable support for multi-layer material textures in the StandardMaterial , at the risk of blowing past the global, per-shader texture limit on older/lower-end GPUs |
pbr_specular_textures | Enable support for specular textures in the StandardMaterial , at the risk of blowing past the global, per-shader texture limit on older/lower-end GPUs |
pbr_transmission_textures | Enable support for transmission-related textures in the StandardMaterial , at the risk of blowing past the global, per-shader texture limit on older/lower-end GPUs |
pnm | PNM image format support, includes pam, pbm, pgm and ppm |
qoi | QOI image format support |
reflect_documentation | Enable documentation reflection |
reflect_functions | Enable function reflection |
serialize | Enable serialization support through serde |
shader_format_glsl | Enable support for shaders in GLSL |
shader_format_spirv | Enable support for shaders in SPIR-V |
shader_format_wesl | Enable support for shaders in WESL |
spirv_shader_passthrough | Enable passthrough loading for SPIR-V shaders (Only supported on Vulkan, shader capabilities and extensions must agree with the platform implementation) |
statically-linked-dxc | Statically linked DXC shader compiler for DirectX 12 |
symphonia-aac | AAC audio format support (through symphonia) |
symphonia-all | AAC, FLAC, MP3, MP4, OGG/VORBIS, and WAV audio formats support (through symphonia) |
symphonia-flac | FLAC audio format support (through symphonia) |
symphonia-isomp4 | MP4 audio format support (through symphonia) |
symphonia-vorbis | OGG/VORBIS audio format support (through symphonia) |
symphonia-wav | WAV audio format support (through symphonia) |
tga | TGA image format support |
tiff | TIFF image format support |
trace | Tracing support |
trace_chrome | Tracing support, saving a file in Chrome Tracing format |
trace_tracy | Tracing support, exposing a port for Tracy |
trace_tracy_memory | Tracing support, with memory profiling, exposing a port for Tracy |
track_location | Enables source location tracking for change detection and spawning/despawning, which can assist with debugging |
wav | WAV audio format support |
wayland | Wayland display server support |
web | Enables use of browser APIs. Note this is currently only applicable on wasm32 architectures. |
webgpu | Enable support for WebGPU in Wasm. When enabled, this feature will override the webgl2 feature and you won't be able to run Wasm builds with WebGL2, only with WebGPU. |
webp | WebP image format support |
zlib | For KTX2 supercompression |