mirror of
https://github.com/bevyengine/bevy
synced 2024-11-10 15:14:50 +00:00
a00c71ee5b
# Objective - Example `deterministic` crashes on CI on Windows because it uses too much memory ## Solution - Reduce the number of planes displayed while still having the issue - While there, add a small margin to the text so that it's prettier
93 lines
3 KiB
Rust
93 lines
3 KiB
Rust
//! Shows how to enable deterministic rendering which helps with flickering due to z-fighting.
|
|
//! Rendering is not deterministic by default.
|
|
//! Note most users don't need rendering to be deterministic, and should rely on depth bias instead.
|
|
|
|
use bevy::app::App;
|
|
use bevy::app::Startup;
|
|
use bevy::prelude::shape::Plane;
|
|
use bevy::prelude::*;
|
|
use bevy::render::deterministic::DeterministicRenderingConfig;
|
|
|
|
fn main() {
|
|
App::new()
|
|
.add_plugins(DefaultPlugins)
|
|
.add_systems(Startup, setup)
|
|
.add_systems(Update, (keys, update_help).chain())
|
|
.run();
|
|
}
|
|
|
|
fn setup(
|
|
mut commands: Commands,
|
|
mut materials: ResMut<Assets<StandardMaterial>>,
|
|
mut meshes: ResMut<Assets<Mesh>>,
|
|
mut deterministic_rendering_config: ResMut<DeterministicRenderingConfig>,
|
|
) {
|
|
// Safe default.
|
|
deterministic_rendering_config.stable_sort_z_fighting = true;
|
|
|
|
// Help message will be rendered there.
|
|
commands.spawn(TextBundle::default().with_style(Style {
|
|
position_type: PositionType::Absolute,
|
|
top: Val::Px(12.0),
|
|
left: Val::Px(12.0),
|
|
..default()
|
|
}));
|
|
|
|
commands.spawn(Camera3dBundle {
|
|
transform: Transform::from_xyz(3.0, 3.0, 3.0).looking_at(Vec3::new(0., 0., 0.), Vec3::Y),
|
|
..default()
|
|
});
|
|
|
|
let mesh = meshes.add(Plane::from_size(2.0));
|
|
let nb_plane = 10;
|
|
for i in 0..nb_plane {
|
|
let color = Color::hsl(i as f32 * 360.0 / nb_plane as f32, 1.0, 0.5);
|
|
commands.spawn(PbrBundle {
|
|
mesh: mesh.clone(),
|
|
material: materials.add(StandardMaterial {
|
|
base_color: color,
|
|
// Setting depth bias would be a default choice to fix z-fighting.
|
|
// When it is not possible, deterministic rendering can be used.
|
|
// Here we intentionally don't use depth bias to demonstrate the issue.
|
|
depth_bias: 0.0,
|
|
unlit: true,
|
|
..Default::default()
|
|
}),
|
|
..default()
|
|
});
|
|
}
|
|
}
|
|
|
|
fn keys(
|
|
mut deterministic_rendering_config: ResMut<DeterministicRenderingConfig>,
|
|
keyboard_input: Res<ButtonInput<KeyCode>>,
|
|
) {
|
|
if keyboard_input.just_pressed(KeyCode::KeyD) {
|
|
deterministic_rendering_config.stable_sort_z_fighting ^= true;
|
|
}
|
|
}
|
|
|
|
fn update_help(
|
|
mut text: Query<&mut Text>,
|
|
deterministic_rendering_config: Res<DeterministicRenderingConfig>,
|
|
) {
|
|
if deterministic_rendering_config.is_changed() {
|
|
*text.single_mut() = Text::from_section(
|
|
format!(
|
|
"\
|
|
Press D to enable/disable deterministic rendering\n\
|
|
\n\
|
|
Deterministic rendering: {}\n\
|
|
\n\
|
|
When rendering is not deterministic, you may notice flickering due to z-fighting\n\
|
|
\n\
|
|
Warning: may cause seizures for people with photosensitive epilepsy",
|
|
deterministic_rendering_config.stable_sort_z_fighting
|
|
),
|
|
TextStyle {
|
|
font_size: 20.,
|
|
..default()
|
|
},
|
|
);
|
|
}
|
|
}
|