-
-
Notifications
You must be signed in to change notification settings - Fork 4k
Open
Labels
A-RenderingDrawing game state to the screenDrawing game state to the screenC-BugAn unexpected or incorrect behaviorAn unexpected or incorrect behaviorS-Ready-For-ImplementationThis issue is ready for an implementation PR. Go for it!This issue is ready for an implementation PR. Go for it!
Milestone
Description
Bevy version
0.15.2, main
Relevant system information
SystemInfo { os: "Linux (Arch Linux rolling)", kernel: "6.13.2-arch1-1", cpu: "AMD Ryzen 9 5950X 16-Core Processor", core_count: "16", memory: "62.7 GiB" }
AdapterInfo { name: "AMD Radeon RX 5700 XT (RADV NAVI10)", vendor: 4098, device: 29471, device_type: DiscreteGpu, driver: "radv", driver_info: "Mesa 24.3.4-arch1.1", backend: Vulkan }
What you did
I'm using RenderLayers
in order to switch between scenes. Objects are spawned with assigned render layers and then I'm modifying Cameras RenderLayers
to display correct scene (for example entering/exiting building). Shadows are persistent even though we are rendering different layer.
What went wrong
Shadows of objects are still rendered even though our camera is rendering different render layer. Only workaround is to change visibility of that object to hidden to get rid of shadow. Seems like shadows are not respecting render layers.
Additional information
Code for reproduction
Press key L to change render layer
Press key V to hide cube with render layer 1
use std::f32::consts::PI;
use bevy::{prelude::*, render::{camera::ScalingMode, view::RenderLayers}};
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_systems(Startup, setup)
.add_systems(Update, on_keyboad_press)
.run();
}
#[derive(Component)]
struct CameraMarker;
#[derive(Component)]
struct CubeWithRenderLayerOneMarker;
/// set up a simple 3D scene
fn setup(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
) {
// Circular base
commands.spawn((
Mesh3d(meshes.add(Circle::new(4.0))),
MeshMaterial3d(materials.add(Color::WHITE)),
Transform::from_rotation(Quat::from_rotation_x(-std::f32::consts::FRAC_PI_2)),
RenderLayers::from_layers(&[0,1])
));
// Cube layer 0
commands.spawn((
Mesh3d(meshes.add(Cuboid::new(1.0, 1.0, 1.0))),
MeshMaterial3d(materials.add(Color::srgb_u8(255, 0, 0))),
Transform::from_xyz(0.0, 0.5, 0.0),
RenderLayers::layer(0)
));
// Cube layer 1
commands.spawn((
Mesh3d(meshes.add(Cuboid::new(1.0, 1.0, 1.0))),
MeshMaterial3d(materials.add(Color::srgb_u8(0, 255, 0))),
Transform::from_xyz(2.0, 0.5, 2.0),
RenderLayers::layer(1),
CubeWithRenderLayerOneMarker
));
// Camera
commands
.spawn(Camera3d::default())
.insert(Projection::Orthographic(OrthographicProjection {
near: -200.0,
far: 200.0,
scale: 0.01,
scaling_mode: ScalingMode::WindowSize,
viewport_origin: Vec2::new(0.5, 0.5),
area: Rect::new(-1.0, -1.0, 1.0, 1.0),
}))
.insert(RenderLayers::layer(0))
.insert(CameraMarker)
.insert(Transform::from_xyz(1.0, 1.0, 1.0).looking_at(Vec3::ZERO, Vec3::Y));
// Light
commands
.spawn(DirectionalLight {
illuminance: 15000.0,
shadows_enabled: true,
..Default::default()
})
.insert(Transform {
translation: Vec3::new(0.0, 6.0, 0.0),
rotation: Quat::from_rotation_x(-PI / 4.),
..Default::default()
})
.insert(RenderLayers::from_layers(&[0,1]));
}
fn on_keyboad_press(keyboard_buttons: Res<ButtonInput<KeyCode>>,
mut cam_render_layers: Query<&mut RenderLayers, With<CameraMarker>>,
mut cube_with_render_layer_one: Query<&mut Visibility, With<CubeWithRenderLayerOneMarker>>,
mut layer: Local<u8>
) {
if keyboard_buttons.just_released(KeyCode::KeyL) {
let mut cam = cam_render_layers.single_mut();
// toggle 0 or 1
*layer ^= 1;
*cam = RenderLayers::layer(*layer as usize)
}
if keyboard_buttons.just_released(KeyCode::KeyV) {
let mut cube = cube_with_render_layer_one.single_mut();
cube.toggle_inherited_hidden();
}
}
Screencast_20250223_133804.webm
Metadata
Metadata
Assignees
Labels
A-RenderingDrawing game state to the screenDrawing game state to the screenC-BugAn unexpected or incorrect behaviorAn unexpected or incorrect behaviorS-Ready-For-ImplementationThis issue is ready for an implementation PR. Go for it!This issue is ready for an implementation PR. Go for it!