From a061a25f86f6150dbf41b19694e9291a2e33485b Mon Sep 17 00:00:00 2001 From: Robert Swain Date: Fri, 29 Oct 2021 07:54:30 +0200 Subject: [PATCH 1/4] Add msaa_pipelined example --- Cargo.toml | 4 +++ examples/3d/msaa_pipelined.rs | 65 +++++++++++++++++++++++++++++++++++ examples/README.md | 1 + 3 files changed, 70 insertions(+) create mode 100644 examples/3d/msaa_pipelined.rs diff --git a/Cargo.toml b/Cargo.toml index 3a70ebdfda342..68c8770fa6853 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -180,6 +180,10 @@ path = "examples/3d/load_gltf_pipelined.rs" name = "msaa" path = "examples/3d/msaa.rs" +[[example]] +name = "msaa_pipelined" +path = "examples/3d/msaa_pipelined.rs" + [[example]] name = "orthographic" path = "examples/3d/orthographic.rs" diff --git a/examples/3d/msaa_pipelined.rs b/examples/3d/msaa_pipelined.rs new file mode 100644 index 0000000000000..ef910f9e80739 --- /dev/null +++ b/examples/3d/msaa_pipelined.rs @@ -0,0 +1,65 @@ +use bevy::{ + ecs::prelude::*, + input::Input, + math::Vec3, + pbr2::{PbrBundle, PointLightBundle, StandardMaterial}, + prelude::{App, Assets, KeyCode, Transform}, + render2::{ + camera::PerspectiveCameraBundle, + color::Color, + mesh::{shape, Mesh}, + view::Msaa, + }, + PipelinedDefaultPlugins, +}; + +/// This example shows how to configure Multi-Sample Anti-Aliasing. Setting the sample count higher +/// will result in smoother edges, but it will also increase the cost to render those edges. The +/// range should generally be somewhere between 1 (no multi sampling, but cheap) to 8 (crisp but +/// expensive) +fn main() { + println!("Press 'm' to toggle MSAA"); + println!("Using 4x MSAA"); + App::new() + .insert_resource(Msaa { samples: 4 }) + .add_plugins(PipelinedDefaultPlugins) + .add_startup_system(setup.system()) + .add_system(cycle_msaa.system()) + .run(); +} + +/// set up a simple 3D scene +fn setup( + mut commands: Commands, + mut meshes: ResMut>, + mut materials: ResMut>, +) { + // cube + commands.spawn_bundle(PbrBundle { + mesh: meshes.add(Mesh::from(shape::Cube { size: 2.0 })), + material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()), + ..Default::default() + }); + // light + commands.spawn_bundle(PointLightBundle { + transform: Transform::from_xyz(4.0, 8.0, 4.0), + ..Default::default() + }); + // camera + commands.spawn_bundle(PerspectiveCameraBundle { + transform: Transform::from_xyz(-3.0, 3.0, 5.0).looking_at(Vec3::ZERO, Vec3::Y), + ..Default::default() + }); +} + +fn cycle_msaa(input: Res>, mut msaa: ResMut) { + if input.just_pressed(KeyCode::M) { + msaa.samples = if msaa.samples == 4 { + println!("Not using MSAA"); + 1 + } else { + println!("Using 4x MSAA"); + 4 + }; + } +} diff --git a/examples/README.md b/examples/README.md index 1717dcff09da9..6d8a563bd8fb6 100644 --- a/examples/README.md +++ b/examples/README.md @@ -103,6 +103,7 @@ Example | File | Description `load_gltf_pipelined` | [`3d/load_gltf_pipelined.rs`](./3d/load_gltf_pipelined.rs) | Loads and renders a gltf file as a scene `many_cubes_pipelined` | [`3d/many_cubes_pipelined.rs`](./3d/many_cubes_pipelined.rs) | Simple benchmark to test per-entity draw overhead `msaa` | [`3d/msaa.rs`](./3d/msaa.rs) | Configures MSAA (Multi-Sample Anti-Aliasing) for smoother edges +`msaa_pipelined` | [`3d/msaa_pipelined.rs`](./3d/msaa_pipelined.rs) | Configures MSAA (Multi-Sample Anti-Aliasing) for smoother edges `orthographic` | [`3d/orthographic.rs`](./3d/orthographic.rs) | Shows how to create a 3D orthographic view (for isometric-look games or CAD applications) `orthographic_pipelined` | [`3d/orthographic_pipelined.rs`](./3d/orthographic_pipelined.rs) | Shows how to create a 3D orthographic view (for isometric-look games or CAD applications) `parenting` | [`3d/parenting.rs`](./3d/parenting.rs) | Demonstrates parent->child relationships and relative transformations From 103ec4921b83f2abcada33b95b628bde481a4897 Mon Sep 17 00:00:00 2001 From: Robert Swain Date: Mon, 1 Nov 2021 12:31:52 +0100 Subject: [PATCH 2/4] msaa_pipelined: Drop unnecessary .system() Co-authored-by: MinerSebas <66798382+MinerSebas@users.noreply.github.com> --- examples/3d/msaa_pipelined.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/3d/msaa_pipelined.rs b/examples/3d/msaa_pipelined.rs index ef910f9e80739..6bd6873d4ddbd 100644 --- a/examples/3d/msaa_pipelined.rs +++ b/examples/3d/msaa_pipelined.rs @@ -23,8 +23,8 @@ fn main() { App::new() .insert_resource(Msaa { samples: 4 }) .add_plugins(PipelinedDefaultPlugins) - .add_startup_system(setup.system()) - .add_system(cycle_msaa.system()) + .add_startup_system(setup) + .add_system(cycle_msaa) .run(); } From b12f66e1b7571681810328cdd5d1d007356ea6b1 Mon Sep 17 00:00:00 2001 From: Robert Swain Date: Mon, 1 Nov 2021 12:33:18 +0100 Subject: [PATCH 3/4] msaa_pipelined: Simplify logic Instead of using a compound condition and assignment, do the assignments within the condition cases. Co-authored-by: MinerSebas <66798382+MinerSebas@users.noreply.github.com> --- examples/3d/msaa_pipelined.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/3d/msaa_pipelined.rs b/examples/3d/msaa_pipelined.rs index 6bd6873d4ddbd..da4a7e49ecf5b 100644 --- a/examples/3d/msaa_pipelined.rs +++ b/examples/3d/msaa_pipelined.rs @@ -54,12 +54,12 @@ fn setup( fn cycle_msaa(input: Res>, mut msaa: ResMut) { if input.just_pressed(KeyCode::M) { - msaa.samples = if msaa.samples == 4 { + if msaa.samples == 4 { println!("Not using MSAA"); - 1 + msaa.samples = 1; } else { println!("Using 4x MSAA"); - 4 - }; + msaa.samples = 4; + } } } From 82b2eaff46f91e450559e66af4fcc75c1355b8ec Mon Sep 17 00:00:00 2001 From: Carter Anderson Date: Wed, 3 Nov 2021 14:46:56 -0700 Subject: [PATCH 4/4] Add comment about wgpu sample support --- examples/3d/msaa_pipelined.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/3d/msaa_pipelined.rs b/examples/3d/msaa_pipelined.rs index da4a7e49ecf5b..f259ed2a22b34 100644 --- a/examples/3d/msaa_pipelined.rs +++ b/examples/3d/msaa_pipelined.rs @@ -16,7 +16,10 @@ use bevy::{ /// This example shows how to configure Multi-Sample Anti-Aliasing. Setting the sample count higher /// will result in smoother edges, but it will also increase the cost to render those edges. The /// range should generally be somewhere between 1 (no multi sampling, but cheap) to 8 (crisp but -/// expensive) +/// expensive). +/// Note that WGPU currently only supports 1 or 4 samples. +/// Ultimately we plan on supporting whatever is natively supported on a given device. +/// Check out this issue for more info: https://github.com/gfx-rs/wgpu/issues/1832 fn main() { println!("Press 'm' to toggle MSAA"); println!("Using 4x MSAA");