bevy/examples/3d
JMS55 bab31e3777
Initial raytraced lighting progress (bevy_solari) (#19058)
# 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?

![image](https://github.com/user-attachments/assets/06522007-c205-46eb-8178-823f19917def)

* 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>
2025-06-12 21:26:10 +00:00
..
3d_scene.rs Migrate cameras to required components (#15641) 2024-10-05 01:59:52 +00:00
3d_shapes.rs Add binned 2d/3d Wireframe render phase (#18587) 2025-04-09 21:34:53 +00:00
3d_viewport_to_world.rs Make Query::single (and friends) return a Result (#18082) 2025-03-02 19:51:56 +00:00
animated_material.rs aligning public apis of Time,Timer and Stopwatch (#15962) 2024-10-16 21:09:32 +00:00
anisotropy.rs Add a Sphere to anisotropy example (#17676) 2025-02-05 20:23:43 +00:00
anti_aliasing.rs Make TAA non-experimental, fixes (#18349) 2025-06-02 16:04:08 +00:00
atmosphere.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
atmospheric_fog.rs Merge Style properties into Node. Use ComputedNode for computed properties. (#15975) 2024-10-18 22:25:33 +00:00
auto_exposure.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
blend_modes.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
bloom_3d.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
camera_sub_view.rs simplify example, replace get_single to Single Query (#16187) 2024-11-01 18:25:42 +00:00
clearcoat.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
clustered_decals.rs Disable clustered decals on Metal. (#17554) 2025-01-27 05:39:07 +00:00
color_grading.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
decal.rs Upgrade to Rust Edition 2024 (#17967) 2025-02-24 03:54:47 +00:00
deferred_rendering.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
depth_of_field.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
edit_material_on_gltf.rs Rename Trigger to On (#19596) 2025-06-12 18:22:33 +00:00
fog_volumes.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
fog.rs Fix mismatched FogFalloff (#19174) 2025-05-26 17:52:27 +00:00
generate_custom_mesh.rs Make Query::single (and friends) return a Result (#18082) 2025-03-02 19:51:56 +00:00
irradiance_volumes.rs Revert "Replace Ambient Lights with Environment Map Lights (#17482)" (#18167) 2025-03-05 23:08:46 +00:00
lighting.rs Revert "Replace Ambient Lights with Environment Map Lights (#17482)" (#18167) 2025-03-05 23:08:46 +00:00
lightmaps.rs Add GltfMeshName component and Deref implementations (#19331) 2025-05-23 20:56:48 +00:00
lines.rs Migrate cameras to required components (#15641) 2024-10-05 01:59:52 +00:00
load_gltf_extras.rs Merge Style properties into Node. Use ComputedNode for computed properties. (#15975) 2024-10-18 22:25:33 +00:00
load_gltf.rs aligning public apis of Time,Timer and Stopwatch (#15962) 2024-10-16 21:09:32 +00:00
mesh_ray_cast.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
meshlet.rs Add external assets to .gitignore (#17388) 2025-01-17 01:20:14 +00:00
mixed_lighting.rs Rename Trigger to On (#19596) 2025-06-12 18:22:33 +00:00
motion_blur.rs Remove WebGL padding from MotionBlur (#18727) 2025-04-06 20:00:59 +00:00
occlusion_culling.rs Adopt consistent FooSystems naming convention for system sets (#18900) 2025-05-06 15:18:03 +00:00
order_independent_transparency.rs Relationships (non-fragmenting, one-to-many) (#17398) 2025-01-18 22:20:30 +00:00
orthographic.rs Improve API for scaling orthographic cameras (#15969) 2024-10-17 17:50:06 +00:00
parallax_mapping.rs Don't reëxport bevy_image from bevy_render (#16163) 2024-11-10 06:54:38 +00:00
parenting.rs aligning public apis of Time,Timer and Stopwatch (#15962) 2024-10-16 21:09:32 +00:00
pbr.rs Fix pbr example text rotation (#19571) 2025-06-10 16:57:57 +00:00
pcss.rs Make TAA non-experimental, fixes (#18349) 2025-06-02 16:04:08 +00:00
post_processing.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
query_gltf_primitives.rs Cosmetic tweaks to query_gltf_primitives (#16102) 2024-10-27 19:06:19 +00:00
reflection_probes.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
render_to_texture.rs aligning public apis of Time,Timer and Stopwatch (#15962) 2024-10-16 21:09:32 +00:00
rotate_environment_map.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
scrolling_fog.rs Make TAA non-experimental, fixes (#18349) 2025-06-02 16:04:08 +00:00
shadow_biases.rs Fix shadow_biases example (#18303) 2025-03-14 19:50:49 +00:00
shadow_caster_receiver.rs Migrate cameras to required components (#15641) 2024-10-05 01:59:52 +00:00
skybox.rs Revert "Replace Ambient Lights with Environment Map Lights (#17482)" (#18167) 2025-03-05 23:08:46 +00:00
solari.rs Initial raytraced lighting progress (bevy_solari) (#19058) 2025-06-12 21:26:10 +00:00
specular_tint.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
spherical_area_lights.rs Revert "Replace Ambient Lights with Environment Map Lights (#17482)" (#18167) 2025-03-05 23:08:46 +00:00
split_screen.rs separate border colors (#18682) 2025-05-26 16:57:13 +00:00
spotlight.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
ssao.rs Make TAA non-experimental, fixes (#18349) 2025-06-02 16:04:08 +00:00
ssr.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
texture.rs Migrate cameras to required components (#15641) 2024-10-05 01:59:52 +00:00
tonemapping.rs Rename JustifyText to Justify (#19522) 2025-06-09 19:59:48 +00:00
transmission.rs Make TAA non-experimental, fixes (#18349) 2025-06-02 16:04:08 +00:00
transparency_3d.rs Upgrade to Rust Edition 2024 (#17967) 2025-02-24 03:54:47 +00:00
two_passes.rs Migrate cameras to required components (#15641) 2024-10-05 01:59:52 +00:00
update_gltf_scene.rs aligning public apis of Time,Timer and Stopwatch (#15962) 2024-10-16 21:09:32 +00:00
vertex_colors.rs Migrate cameras to required components (#15641) 2024-10-05 01:59:52 +00:00
visibility_range.rs Switch ChildOf back to tuple struct (#18672) 2025-04-02 00:10:10 +00:00
volumetric_fog.rs Split Camera.hdr out into a new component (#18873) 2025-05-26 19:24:45 +00:00
wireframe.rs Add binned 2d/3d Wireframe render phase (#18587) 2025-04-09 21:34:53 +00:00