Volumetric fog is still not fixed. The 2 prs going into 0.19.1 do not resolve the issue completely.
- Dominant language
- Rust
- Stars
- 48.2k
- Forks
- 4.8k
- Avg merge
- 3d 16h
- Merged PRs (30d)
- 171
Description
## Bevy version and features
bevy main branch default everything
```
2026-08-08T03:21:30.709458Z INFO bevy_diagnostic::system_information_diagnostics_plugin::internal: SystemInfo { os: "Windows 11 Pro", kernel: "26200", cpu: "AMD Ryzen 7 7700X 8-Core Processor", core_count: "8", memory: "63.2 GiB" }
2026-08-08T03:21:31.122155Z INFO bevy_render::renderer: AdapterInfo { name: "NVIDIA GeForce RTX 5070 Ti", vendor: 4318, device: 11269, device_type: DiscreteGpu, device_pci_bus_id: "0000:01:00.0", driver: "NVIDIA", driver_info: "610.74", backend: Vulkan, subgroup_min_size: 32, subgroup_max_size: 32, transient_saves_memory: Some(false), limit_bucket: None }
2026-08-08T03:21:31.348981Z INFO bevy_pbr::cluster: GPU clustering is supported on this device.
2026-08-08T03:21:31.349104Z INFO bevy_render::batching::gpu_preprocessing: GPU preprocessing is fully supported on this device.
2026-08-08T03:21:31.349806Z INFO bevy_winit::system: Creating new window fog_volume_repro (67v0)
```
## What you did
I noticed a very similar bug to the one I reported here:
https://github.com/bevyengine/bevy/issues/22574
that was suppose to be fixed here:
https://github.com/bevyengine/bevy/pull/24220
That did fix reported bug but fog volume is still broken as shown in the screen shots.
I cherry picked the 2 prs that were fixing fog volumes going into 0.19.1 into my project and neither fixed it.
I then created a minimal reproduction on the bevy main branch.
I would appreciate this being added to the 0.19.1 milestones because im tired of fog volume not working for several major releases now and it was suppose to be fixed.
## What went wrong
The fog volume gets glitched either not rendering at all or rendering with a weird half diagonal cutoff at rare angles.
In the below minimal reproduction the initial position is a bugged position then if you hit the A key and change the angle it is correct.
```rs
use bevy::light::{FogVolume, VolumetricFog, VolumetricLight};
use bevy::prelude::*;
const SURFACE_Y: f32 = 1.0;
const FLOOR_Y: f32 = SURFACE_Y - 45.0;
const COLLAR_INNER_RADIUS: f32 = 2.5;
const LIGHT_HEIGHT_ABOVE_SURFACE: f32 = 20.0;
const LIGHT_LUMENS: f32 = 300_000_000.0;
const LIGHT_RANGE: f32 = 200.0;
const FOG_WIDTH: f32 = 12.0;
const FOG_TOP: f32 = SURFACE_Y + 0.8;
const BUG_CAM_POS: Vec3 = Vec3::new(-6.0327244, -42.009815, -4.849974);
const BUG_CAM_YAW: f32 = -21.324987;
const BUG_CAM_PITCH: f32 = 1.0759836;
#[derive(Resource)]
struct FlyCam {
yaw: f32,
}
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.insert_resource(FlyCam { yaw: BUG_CAM_YAW })
.add_systems(Startup, setup)
.add_systems(Update, fly_camera)
.run();
}
fn bug_cam_rotation() -> Quat {
Quat::from_rotation_y(BUG_CAM_YAW) * Quat::from_rotation_x(BUG_CAM_PITCH)
}
fn setup(mut commands: Commands) {
commands.insert_resource(ClearColor(Color::srgb(0.0, 0.0, 0.0)));
commands.spawn((
Camera3d::default(),
Transform::from_translation(BUG_CAM_POS).with_rotation(bug_cam_rotation()),
VolumetricFog {
ambient_intensity: 0.0,
..default()
},
));
let outer_angle = (COLLAR_INNER_RADIUS / LIGHT_HEIGHT_ABOVE_SURFACE).atan();
commands.spawn((
SpotLight {
color: Color::WHITE,
intensity: LIGHT_LUMENS,
range: LIGHT_RANGE,
shadow_maps_enabled: true,
inner_angle: outer_angle * 0.7,
outer_angle,
..default()
},
VolumetricLight,
Transform::from_xyz(0.0, SURFACE_Y + LIGHT_HEIGHT_ABOVE_SURFACE, 0.0)
.looking_at(Vec3::new(0.0, FLOOR_Y, 0.0), Vec3::Z),
));
commands.spawn((
FogVolume {
density_factor: 0.04,
absorption: 0.05,
scattering: 0.5,
light_intensity: 8.0,
..default()
},
Transform::from_xyz(0.0, (FLOOR_Y + FOG_TOP) / 2.0, 0.0).with_scale(Vec3::new(
FOG_WIDTH,
FOG_TOP - FLOOR_Y,
FOG_WIDTH,
)),
));
}
fn fly_camera(
time: Res
Contributor guide
Research direction
Start by running the minimal Rust reproduction in the issue and compare the initial camera position with the result after moving with the A key. Read the linked issue #22574 and PR #24220 for prior context, then trace the volumetric fog rendering path. Done means the fog volume renders correctly at the reproduced angle and remains correct when the camera moves.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- computer-graphics
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100