Skip to content

Shadows do not respect render layers #18000

@Zorpf

Description

@Zorpf

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

No one assigned

    Labels

    A-RenderingDrawing game state to the screenC-BugAn unexpected or incorrect behaviorS-Ready-For-ImplementationThis issue is ready for an implementation PR. Go for it!

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions