Skip to content

Commit fcce3fb

Browse files
CrushedPixelmockersf
authored andcommitted
(fix) SSRPlugin: Don't reference default deferred lighting pass if it doesn't exist (#16932)
Fixes a crash when using deferred rendering but disabling the default deferred lighting plugin. # The Issue The `ScreenSpaceReflectionsPlugin` references `NodePbr::DeferredLightingPass`, which hasn't been added when `PbrPlugin::add_default_deferred_lighting_plugin` is `false`. This yields the following crash: ``` thread 'main' panicked at /Users/marius/Documents/dev/bevy/crates/bevy_render/src/render_graph/graph.rs:155:26: InvalidNode(DeferredLightingPass) stack backtrace: 0: rust_begin_unwind at /rustc/90b35a6239c3d8bdabc530a6a0816f7ff89a0aaf/library/std/src/panicking.rs:665:5 1: core::panicking::panic_fmt at /rustc/90b35a6239c3d8bdabc530a6a0816f7ff89a0aaf/library/core/src/panicking.rs:74:14 2: bevy_render::render_graph::graph::RenderGraph::add_node_edges at /Users/marius/Documents/dev/bevy/crates/bevy_render/src/render_graph/graph.rs:155:26 3: <bevy_app::sub_app::SubApp as bevy_render::render_graph::app::RenderGraphApp>::add_render_graph_edges at /Users/marius/Documents/dev/bevy/crates/bevy_render/src/render_graph/app.rs:66:13 4: <bevy_pbr::ssr::ScreenSpaceReflectionsPlugin as bevy_app::plugin::Plugin>::finish at /Users/marius/Documents/dev/bevy/crates/bevy_pbr/src/ssr/mod.rs:234:9 5: bevy_app::app::App::finish at /Users/marius/Documents/dev/bevy/crates/bevy_app/src/app.rs:255:13 6: bevy_winit::state::winit_runner at /Users/marius/Documents/dev/bevy/crates/bevy_winit/src/state.rs:859:9 7: core::ops::function::FnOnce::call_once at /Users/marius/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5 8: core::ops::function::FnOnce::call_once{{vtable.shim}} at /Users/marius/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5 9: <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once at /Users/marius/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/alloc/src/boxed.rs:2454:9 10: bevy_app::app::App::run at /Users/marius/Documents/dev/bevy/crates/bevy_app/src/app.rs:184:9 11: bevy_deferred_test::main at ./src/main.rs:9:5 12: core::ops::function::FnOnce::call_once at /Users/marius/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5 ``` ### Minimal reproduction example: ```rust use bevy::core_pipeline::prepass::{DeferredPrepass, DepthPrepass}; use bevy::pbr::{DefaultOpaqueRendererMethod, PbrPlugin, ScreenSpaceReflections}; use bevy::prelude::*; fn main() { App::new() .add_plugins(DefaultPlugins.set(PbrPlugin { add_default_deferred_lighting_plugin: false, ..default() })) .add_systems(Startup, setup) .insert_resource(DefaultOpaqueRendererMethod::deferred()) .run(); } /// set up a camera fn setup( mut commands: Commands ) { // camera commands.spawn(( Camera3d::default(), Transform::from_xyz(-2.5, 4.5, 9.0).looking_at(Vec3::ZERO, Vec3::Y), DepthPrepass, DeferredPrepass, ScreenSpaceReflections::default(), )); } ``` # The Fix When no node under the default lighting node's label exists, this label isn't added to the SSR's graph node edges. It's good to keep the SSRPlugin enabled, this way, users can plug in their own lighting system, which I have successfully done on top of this PR. # Workarounds A current workaround for this issue is to re-use Bevy's `NodePbr::DeferredLightingPass` as the label for your own custom lighting pass node.
1 parent a7d1a73 commit fcce3fb

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

crates/bevy_pbr/src/ssr/mod.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use bevy_ecs::{
2525
};
2626
use bevy_image::BevyDefault as _;
2727
use bevy_reflect::{std_traits::ReflectDefault, Reflect};
28+
use bevy_render::render_graph::RenderGraph;
2829
use bevy_render::{
2930
extract_component::{ExtractComponent, ExtractComponentPlugin},
3031
render_graph::{NodeRunError, RenderGraphApp, RenderGraphContext, ViewNode, ViewNodeRunner},
@@ -233,15 +234,32 @@ impl Plugin for ScreenSpaceReflectionsPlugin {
233234

234235
render_app
235236
.init_resource::<ScreenSpaceReflectionsPipeline>()
236-
.init_resource::<SpecializedRenderPipelines<ScreenSpaceReflectionsPipeline>>()
237-
.add_render_graph_edges(
237+
.init_resource::<SpecializedRenderPipelines<ScreenSpaceReflectionsPipeline>>();
238+
239+
// only reference the default deferred lighting pass
240+
// if it has been added
241+
let has_default_deferred_lighting_pass = render_app
242+
.world_mut()
243+
.resource_mut::<RenderGraph>()
244+
.sub_graph(Core3d)
245+
.get_node_state(NodePbr::DeferredLightingPass)
246+
.is_ok();
247+
248+
if has_default_deferred_lighting_pass {
249+
render_app.add_render_graph_edges(
238250
Core3d,
239251
(
240252
NodePbr::DeferredLightingPass,
241253
NodePbr::ScreenSpaceReflections,
242254
Node3d::MainOpaquePass,
243255
),
244256
);
257+
} else {
258+
render_app.add_render_graph_edges(
259+
Core3d,
260+
(NodePbr::ScreenSpaceReflections, Node3d::MainOpaquePass),
261+
);
262+
}
245263
}
246264
}
247265

0 commit comments

Comments
 (0)