Skip to content

SSR is noisy on mirror-like surfaces in 0.19 #24766

Description

@dhbtk

Bevy version and features

  • Bevy 0.19
  • Features: ["debug", "jpeg", "tiff", "bevy_dev_tools", "exr", "mp3", "tonemapping_luts", "webgpu", "track_location", "trace"]

[Optional] Relevant system information

Running on macOS 26.5, on a Macbook Pro M1 Pro 16 GB.

AdapterInfo { name: "Apple M1 Pro", vendor: 0, device: 0, device_type: IntegratedGpu, device_pci_bus_id: "", driver: "", driver_info: "", backend: Metal, subgroup_min_size: 4, subgroup_max_size: 64, transient_saves_memory: true }

What you did

SSR behaves differently in 0.18.1 vs 0.19. The road material has 0.04 roughness and 0.36 reflectance; in 0.18.1 the objects on the road reflect in a mirror-like way while in 0.19 it looks pretty noisy. The image is darker overall in 0.19 as well; I bumped the emissive values on the stripes and rings to try and match them up a bit. (I ended up liking the overall look in 0.19 more, but it was completely unintentional...)

This is my camera setup for this scene:

            let mut camera = builder.spawn((
                GameplayCamera::default(),
                RenderLayers::layer(0),
                Camera { ..default() },
                Camera3d { ..default() },
                Projection::Perspective(PerspectiveProjection {
                    fov, // 40f32.to_radians()
                    near: 0.01,
                    far: DRAW_DISTANCE, // 5000
                    ..default()
                }),
                Transform::IDENTITY,
                AtmosphereSettings {
                    aerial_view_lut_max_distance: aerial_view_max_distance, // 5000
                    sky_view_lut_samples: atmosphere_sky_view_lut_samples(), // 12
                    aerial_view_lut_samples: atmosphere_aerial_view_lut_samples(), // 8
                    ..default()
                },
                DistanceFog {
                    color: Color::srgba(0.09, 0.1, 0.16, 0.18),
                    falloff: FogFalloff::Linear {
                        start: 3_200.0,
                        end: 5_000.0,
                    },
                    ..default()
                },
                Exposure {
                    ev100: environment.exposure_ev100, // 9.8
                },
                Bloom {
                    intensity: if settings.bloom_enabled { 0.24 } else { 0.0 },
                    ..default() // low_frequency_boost: 0.4,
                                // low_frequency_boost_curvature: 0.55,
                                // high_pass_frequency: 0.95,
                                // prefilter: BloomPrefilter { ..default() },
                                // composite_mode: BloomCompositeMode::Additive,
                                // scale: Vec2::new(1.55, 2.55),
                                // max_mip_dimension: BLOOM_MAX_MIP_DIMENSION,
                },
                Msaa::Off,
                TemporalAntiAliasing::default(),
                Tonemapping::AgX,
                ColorGrading::with_identical_sections(
                    ColorGradingGlobal {
                        temperature: 0.05,
                        tint: -0.01,
                        post_saturation: 1.05,
                        ..default()
                    },
                    ColorGradingSection::default(),
                )
            ));
            camera.insert(ResolutionScaledSceneCamera);
            if settings.screen_space_reflections_enabled {
                info!("Enabling screen space reflections for gameplay camera");
                camera.insert((
                    DepthPrepass,
                    DeferredPrepass,
                    ScreenSpaceReflections {
        min_perceptual_roughness: 0.0..0.0,
        ..default()
    },
                    OcclusionCulling,
                ));
            }
            if !cfg!(target_arch = "wasm32") {
                camera.insert(MotionBlur {
                    shutter_angle: settings.motion_blur.menu_shutter_angle(), // 1.5
                    samples: motion_blur_samples(settings.motion_blur.menu_samples()), // 3
                });
            }

What went wrong

Scene in 0.18.1:

Image

Scene in 0.19:

Image

(I seem to also have run into an UI bug but that's not the focus here)

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-RenderingDrawing game state to the screenC-BugAn unexpected or incorrect behaviorS-Needs-InvestigationThis issue requires detective work to figure out what's going wrong

    Type

    No type
    No fields configured for issues without a type.

    Projects

    Status
    Needs SME Triage

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions