diff --git a/assets/examples/shaders/dissolve.wgsl b/assets/examples/shaders/dissolve.wgsl index d61a121..39cdce8 100644 --- a/assets/examples/shaders/dissolve.wgsl +++ b/assets/examples/shaders/dissolve.wgsl @@ -11,6 +11,7 @@ struct MatExt { step: u32, + // Cutoff (for animation) } @group(1) @binding(100) @@ -24,7 +25,7 @@ fn random(st: vec2) -> f32 { fn noise(st: vec2) -> f32 { var i = floor(st); - var f = floor(st); + var f = fract(st); var a = random(i); var b = random(i + vec2(1.0, 0.0)); @@ -36,22 +37,48 @@ fn noise(st: vec2) -> f32 { return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y; } +const octaves: i32 = 6; + +fn fbm(st: vec2) -> f32 { + var _st = st; + var value = 0.0; + var amplitude = 0.5; + var frequency = 0.0; + + for (var i = 0 ; i < octaves; i++) { + value += amplitude * noise(_st); + _st *= 2.0; + amplitude *= 0.5; + } + + return value; +} + @fragment fn fragment( in: VertexOutput, @builtin(front_facing) is_front: bool, ) -> FragmentOutput { var pbr_input = pbr_input_from_standard_material(in, is_front); - pbr_input.material.base_color.b = pbr_input.material.base_color.r; var out: FragmentOutput; out.color = apply_pbr_lighting(pbr_input); - var pos = vec2(in.uv * 5.0) + vec2(globals.time); + var pos = vec2(in.uv * 2.0); + + var n = fbm(pos); + + // out.color *= n; + + var cutoff = abs(sin(globals.time)); - var n = noise(pos); + if n > cutoff { + discard; + } - out.color = vec4(vec3(n), abs(sin(globals.time))); + if n > (cutoff - 0.01) { + out.color = vec4(0.0, 1.0, 1.0, 1.0); + } return out; } \ No newline at end of file diff --git a/examples/shaders.rs b/examples/shaders.rs index 5d29f83..3b11da0 100644 --- a/examples/shaders.rs +++ b/examples/shaders.rs @@ -25,8 +25,7 @@ fn setup( ) { commands.spawn(MaterialMeshBundle { mesh: meshes.add( - Mesh::try_from(shape::UVSphere { - radius: 1.0, + Mesh::try_from(shape::Box { ..default() }).unwrap(), ), @@ -34,7 +33,7 @@ fn setup( material: materials.add(ExtendedMaterial { base: StandardMaterial { base_color: Color::RED, - opaque_render_method: OpaqueRendererMethod::Forward, + opaque_render_method: OpaqueRendererMethod::Auto, alpha_mode: AlphaMode::Mask(0.5), ..default() }, @@ -68,9 +67,6 @@ impl MaterialExtension for MatExt { fn fragment_shader() -> ShaderRef { "examples/shaders/dissolve.wgsl".into() } - fn deferred_fragment_shader() -> ShaderRef { - "examples/shaders/dissolve.wgsl".into() - } } fn rotate(