diff --git a/assets/shaders/dissolve.wgsl b/assets/shaders/dissolve.wgsl index 7028dca..4443ed1 100644 --- a/assets/shaders/dissolve.wgsl +++ b/assets/shaders/dissolve.wgsl @@ -63,20 +63,19 @@ fn fragment( var out: FragmentOutput; out.color = apply_pbr_lighting(pbr_input); - var pos = vec2(in.uv * 2.0); + var pos = vec2(in.uv * 2.718); var n = fbm(pos); var cutoff = dissolve.percentage; - if n > cutoff { - // out.color = vec4(0.0, 1.0, 0.0, cutoff); - discard; - } - if n > (cutoff - 0.01) { out.color = vec4(0.0, 1.0, 1.0, 1.0); } + if n > cutoff { + discard; + } + return out; } \ No newline at end of file diff --git a/examples/shaders.rs b/examples/shaders.rs index 209b506..843587f 100644 --- a/examples/shaders.rs +++ b/examples/shaders.rs @@ -1,8 +1,14 @@ +use bevy::core_pipeline::experimental::taa::TemporalAntiAliasSettings; +use bevy::core_pipeline::prepass::MotionVectorPrepass; +use bevy::core_pipeline::tonemapping::DebandDither; +use bevy::core_pipeline::Skybox; use bevy::pbr::ExtendedMaterial; use bevy::pbr::MaterialExtension; use bevy::pbr::OpaqueRendererMethod; +use bevy::pbr::ScreenSpaceAmbientOcclusionBundle; use bevy::prelude::*; use bevy::render::render_resource::*; +use bevy::render::view::ColorGrading; type MyMat = ExtendedMaterial; @@ -12,7 +18,9 @@ fn main() { DefaultPlugins.set(ImagePlugin::default_nearest()), MaterialPlugin::::default(), )) + .insert_resource(Msaa::Off) .add_systems(Startup, setup) + .add_systems(Update, apply_skybox) .add_systems(Update, set_scene) .add_systems(Update, rotate) .add_systems(Update, toggle_material.run_if( @@ -29,7 +37,10 @@ fn main() { #[derive(Component)] struct Root; -fn setup(mut commands: Commands) { +fn setup( + mut commands: Commands, + assets: Res, +) { commands.spawn((SceneBundle { ..default() }, Root)); commands.spawn(PointLightBundle { @@ -41,10 +52,49 @@ fn setup(mut commands: Commands) { ..default() }); - commands.spawn(Camera3dBundle { - transform: Transform::from_xyz(-1.0, 1.5, 4.0).looking_at(Vec3::ZERO, Vec3::Y), - ..default() - }); + commands.spawn(( + Camera3dBundle { + transform: Transform::from_xyz(-1.0, 1.5, 4.0).looking_at(Vec3::ZERO, Vec3::Y), + ..default() + }, + ) + ); +} + +fn apply_skybox( + cameras: Query>, + mut images: ResMut>, + assets: Res, + mut commands: Commands, + mut done: Local, + mut handle: Local>, +) { + if !*done { + info!("Applying skybox..."); + *handle = assets.load("images/skybox.png"); + if let Some(image) = images.get_mut(handle.clone()) { + info!("Loaded skybox image"); + // NOTE: PNGs do not have any metadata that could indicate they contain a cubemap texture, + // so they appear as one texture. The following code reconfigures the texture as necessary. + if image.texture_descriptor.array_layer_count() == 1 { + image.reinterpret_stacked_2d_as_array( + image.texture_descriptor.size.height / image.texture_descriptor.size.width, + ); + image.texture_view_descriptor = Some(TextureViewDescriptor { + dimension: Some(TextureViewDimension::Cube), + ..default() + }); + + cameras.iter().for_each(|e| { + commands.entity(e).insert(Skybox(handle.clone())); + }); + + *done = true; + } + } else { + *done = false; + } + } } fn set_scene( @@ -90,7 +140,6 @@ fn init_materials( .clone(); base.opaque_render_method = OpaqueRendererMethod::Auto; - base.alpha_mode = AlphaMode::Mask(0.5); let ext_handle = materials.add(ExtendedMaterial { base, extension }); @@ -155,4 +204,4 @@ fn rotate( materials.iter_mut().for_each(|(_id, m)| { m.extension.cutoff = time.elapsed_seconds().sin().abs(); }) -} +} \ No newline at end of file diff --git a/src/display3d.rs b/src/display3d.rs index 65e90a7..ea030aa 100644 --- a/src/display3d.rs +++ b/src/display3d.rs @@ -10,7 +10,7 @@ use bevy::{ tonemapping::{DebandDither, Tonemapping}, Skybox, }, input::mouse::{MouseButtonInput, MouseMotion, MouseScrollUnit, MouseWheel}, pbr::{ - ExtendedMaterial, MaterialExtension, OpaqueRendererMethod, + ExtendedMaterial, MaterialExtension, ScreenSpaceAmbientOcclusionBundle, ScreenSpaceAmbientOcclusionSettings, }, render::{ render_resource::{AsBindGroup, ShaderRef, TextureViewDescriptor, TextureViewDimension}, @@ -1310,14 +1310,11 @@ fn setup_capture_piece( // Extension we will add to existing gltf-sourced materials let extension = DissolveExtension { percentage: 1.0 }; // Base material we will extend for the duration of the dissolve effect - let mut base = standard_materials + let base = standard_materials .get(std_handle) .expect("Resolve material data") .clone(); - base.opaque_render_method = OpaqueRendererMethod::Auto; - base.alpha_mode = AlphaMode::Mask(0.5); - dissolve_materials.add(ExtendedMaterial { base, extension }) }, Some(dis_handle) => dis_handle.clone(), @@ -1419,10 +1416,6 @@ fn capture_piece( "Play fade out animation {:?} {:?}", delta, dissolve_material.extension.percentage ); - - commands - .entity(_child) - .log_components(); } ); }