Fog in a 3D scene makes objects near the camera clear and objects far away from the camera foggy.
To enable the fog, we use FogSettings together with Camera3dBundle. We group the two in the same entity.
commands.spawn((
Camera3dBundle::default(),
FogSettings {
color: Color::WHITE,
falloff: FogFalloff::from_visibility_contrast_squared(0.5, 0.99),
..default()
},
));
The color of FogSettings is the color of the fog. The brightness of the color specifies how strong the fog is.
The falloff of FogSettings controls how the fog changes from clear to foggy. The value of falloff is a FogFalloff. Usually, it is either Linear, Exponential or ExponentialSquared. We use from_visibility_contrast_squared to construct a FogFalloff of ExponentialSquared.
The full code is as follows:
use bevy::{
app::{App, Startup},
asset::Assets,
core_pipeline::core_3d::Camera3dBundle,
ecs::system::{Commands, ResMut},
math::Vec3,
pbr::{
DirectionalLight, DirectionalLightBundle, FogFalloff, FogSettings, PbrBundle,
StandardMaterial,
},
render::{
color::Color,
mesh::{
shape::{Plane, UVSphere},
Mesh,
},
},
transform::components::Transform,
utils::default,
DefaultPlugins,
};
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_systems(Startup, setup)
.run();
}
fn setup(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
) {
commands.spawn((
Camera3dBundle {
transform: Transform::from_xyz(2., 1., 2.).looking_at(Vec3::new(0., 0.5, 0.), Vec3::Y),
..default()
},
FogSettings {
color: Color::WHITE,
falloff: FogFalloff::from_visibility_contrast_squared(0.5, 0.99),
..default()
},
));
// left
commands.spawn(PbrBundle {
mesh: meshes.add(
UVSphere {
radius: 0.5,
..default()
}
.into(),
),
material: materials.add(StandardMaterial {
base_color: Color::RED,
..default()
}),
transform: Transform::from_xyz(-1.25, 0.5, 0.),
..default()
});
// middle
commands.spawn(PbrBundle {
mesh: meshes.add(
UVSphere {
radius: 0.5,
..default()
}
.into(),
),
material: materials.add(StandardMaterial {
base_color: Color::GREEN,
..default()
}),
transform: Transform::from_xyz(0., 0.5, 0.),
..default()
});
// right
commands.spawn(PbrBundle {
mesh: meshes.add(
UVSphere {
radius: 0.5,
..default()
}
.into(),
),
material: materials.add(StandardMaterial {
base_color: Color::BLUE,
..default()
}),
transform: Transform::from_xyz(1.25, 0.5, 0.),
..default()
});
// ground
commands.spawn(PbrBundle {
mesh: meshes.add(Plane::from_size(5.).into()),
material: materials.add(StandardMaterial::default()),
..default()
});
// light
commands.spawn(DirectionalLightBundle {
directional_light: DirectionalLight {
illuminance: 20000.,
shadows_enabled: true,
..default()
},
transform: Transform::default().looking_to(Vec3::new(-1., -3., 0.), Vec3::Y),
..default()
});
}
Result:
➡️ Next: Sky
📘 Back: Table of contents