AlphaMode::Blend produces non-opague shape when defined as opague when used with fog
C-BugA-RenderingD-ComplexS-Needs-Design
## Bevy version and features
0.19.0
0.19.1
and main
## What you did
I have a scene with a cuboid with an opague blend material and I noticed something is wrong with the depth when the cuboid is between my fog god ray and the camera causing it to render transparent.
## What went wrong
Its suppose to be opague its rendering transparent
## Additional information
<img width="673" height="646" alt="Image" src="https://github.com/user-attachments/assets/f7031310-4e6f-40b7-af46-8c2cd840076d" />
minimized repro
```rs
use bevy::{
asset::RenderAssetUsages,
camera::Exposure,
camera_controller::free_camera::{FreeCamera, FreeCameraPlugin},
core_pipeline::{prepass::DepthPrepass, tonemapping::Tonemapping},
light::{FogVolume, VolumetricFog, VolumetricLight},
post_process::bloom::Bloom,
prelude::*,
render::render_resource::{Extent3d, TextureDimension, TextureFormat},
};
const SURFACE_Y: f32 = 0.0;
const BOTTOM_Y: f32 = SURFACE_Y - 45.0;
const GOD_RAY_LIGHT_HEIGHT: f32 = 20.0;
const GOD_RAY_RANGE: f32 = 200.0;
const COLLAR_INNER_RADIUS: f32 = 2.5;
const COLLAR_HEIGHT: f32 = 0.8;
const GOD_RAY_FOG_WIDTH: f32 = 12.0;
const GOD_RAY_BRIGHTNESS: f32 = 3_000_000.0;
const PLAYER_CUBOID_SIZE: Vec3 = Vec3::new(0.5, 1.5, 0.5);
const PLAYER_POSITION: Vec3 = Vec3::new(6.5, -5.0, 0.0);
const EXPOSURE_EV100: f32 = 5.5;
fn main() {
App::new()
.add_plugins((DefaultPlugins, FreeCameraPlugin))
.insert_resource(ClearColor(Color::BLACK))
.add_systems(Startup, (setup_camera, setup_god_ray, setup_player))
.run();
}
fn setup_camera(mut commands: Commands) {
commands.spawn((
Camera3d::default(),
Transform::from_xyz(11.5, -4.6, 0.0).looking_at(Vec3::new(0.0, -6.0, 0.0), Vec3::Y),
FreeCamera::default(),
DepthPrepass,
Msaa::Off,
Exposure {
ev100: EXPOSURE_EV100,
},
Tonemapping::AcesFitted,
Bloom::NATURAL,
AmbientLight {
brightness: 0.0,
..default()
},
VolumetricFog {
ambient_intensity: 0.0,
..default()
},
));
}
fn setup_god_ray(mut commands: Commands, mut images: ResMut<Assets<Image>>) {
let outer_angle = (COLLAR_INNER_RADIUS / GOD_RAY_LIGHT_HEIGHT).atan();
commands.spawn((
SpotLight {
color: Color::WHITE,
intensity: GOD_RAY_BRIGHTNESS,
range: GOD_RAY_RANGE,
shadow_maps_enabled: true,
inner_angle: outer_angle * 0.7,
outer_angle,
..default()
},
VolumetricLight,
Transform::from_xyz(0.0, SURFACE_Y + GOD_RAY_LIGHT_HEIGHT, 0.0)
.looking_at(Vec3::new(0.0, BOTTOM_Y, 0.0), Vec3::Z),
));
let fog_top = SURFACE_Y + COLLAR_HEIGHT;
commands.spawn((
FogVolume {
density_factor: 0.04,
absorption: 0.05,
scattering: 0.5,
light_intensity: 8.0,
density_texture: Some(images.add(god_ray_density_image())),
..default()
},
Transform::from_xyz(0.0, (BOTTOM_Y + fog_top) / 2.0, 0.0).with_scale(Vec3::new(
GOD_RAY_FOG_WIDTH,
fog_top - BOTTOM_Y,
GOD_RAY_FOG_WIDTH,
)),
));
}
fn setup_player(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
) {
let mesh = meshes.add(Cuboid::from_size(PLAYER_CUBOID_SIZE));
commands.spawn((
Mesh3d(mesh.clone()),
MeshMaterial3d(materials.add(StandardMaterial {
base_color: Color::srgb(0.8, 0.3, 0.3),
..default()
})),
Transform::from_translation(PLAYER_POSITION + Vec3::new(0.0, 0.0, -0.6)),
));
commands.spawn((
Mesh3d(mesh),
MeshMaterial3d(materials.add(StandardMaterial {
base_color: Color::srgba(0.8, 0.3, 0.3, 1.0),
alpha_mode: AlphaMode::Blend,
..default()
})),
Transform::from_translation(PLAYER_POSITION + Vec3::new(0.0, 0.0, 0.6)),
));
commands.spawn((
PointLight {
color: Color::srgb(1.0, 0.85, 0.6),
intensity: 300_000.0,
range: 40.0,
shadow_maps_enabled: false,
..default()
},
Transform::from_translation(PLAYER_POSITION + Vec3::new(4.0, 2.0, 2.5)),
));
}
fn god_ray_density_image() -> Image {
const N: usize = 32;
let mut data = vec![0u8; N * N * N];
for z in 0..N {
for y in 0..N {
for x in 0..N {
let dx = x as f32 / (N - 1) as f32 * 2.0 - 1.0;
let dz = z as f32 / (N - 1) as f32 * 2.0 - 1.0;
let r = (dx * dx + dz * dz).sqrt();
let t = ((1.0 - r) / 0.3).clamp(0.0, 1.0);
let d = t * t * (3.0 - 2.0 * t);
data[(z * N + y) * N + x] = (d * 255.0) as u8;
}
}
}
Image::new(
Extent3d {
width: N as u32,
height: N as u32,
depth_or_array_layers: N as u32,
},
TextureDimension::D3,
data,
TextureFormat::R8Unorm,
RenderAssetUsages::RENDER_WORLD,
)
}
```
1 条评论