
# Objective Issue #10243: rendering multiple triangles in the same place results in flickering. ## Solution Considered these alternatives: - `depth_bias` may not work, because of high number of entities, so creating a material per entity is practically not possible - rendering at slightly different positions does not work, because when camera is far, float rounding causes the same issues (edit: assuming we have to use the same `depth_bias`) - considered implementing deterministic operation like `query.par_iter().flat_map(...).collect()` to be used in `check_visibility` system (which would solve the issue since query is deterministic), and could not figure out how to make it as cheap as current approach with thread-local collectors (#11249) So adding an option to sort entities after `check_visibility` system run. Should not be too bad, because after visibility check, only a handful entities remain. This is probably not the only source of non-determinism in Bevy, but this is one I could find so far. At least it fixes the repro example. ## Changelog - `DeterministicRenderingConfig` option to enable deterministic rendering ## Test <img width="1392" alt="image" src="https://github.com/bevyengine/bevy/assets/28969/c735bce1-3a71-44cd-8677-c19f6c0ee6bd"> --------- Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
15 lines
597 B
Rust
15 lines
597 B
Rust
use bevy_ecs::system::Resource;
|
|
|
|
/// Configure deterministic rendering to fix flickering due to z-fighting.
|
|
#[derive(Resource, Default)]
|
|
pub struct DeterministicRenderingConfig {
|
|
/// Sort visible entities by id before rendering to avoid flickering.
|
|
///
|
|
/// Render is parallel by default, and if there's z-fighting, it may cause flickering.
|
|
/// Default fix for the issue is to set `depth_bias` per material.
|
|
/// When it is not possible, entities sorting can be used.
|
|
///
|
|
/// This option costs performance and disabled by default.
|
|
pub stable_sort_z_fighting: bool,
|
|
}
|