#import bevy_sprite::mesh2d_vertex_output::VertexOutput #import bevy_sprite::mesh2d_view_bindings::globals fn hash(p: vec2) -> f32 { return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); } fn noise(p: vec2) -> f32 { let i = floor(p); let f = fract(p); let u = f * f * (3.0 - 2.0 * f); return mix( mix(hash(i), hash(i + vec2(1.0, 0.0)), u.x), mix(hash(i + vec2(0.0, 1.0)), hash(i + vec2(1.0, 1.0)), u.x), u.y, ); } fn fbm(p: vec2) -> f32 { var value = 0.0; var amplitude = 0.5; var q = p; for (var i = 0; i < 5; i++) { value += amplitude * noise(q); q *= 2.0; amplitude *= 0.5; } return value; } @fragment fn fragment(mesh: VertexOutput) -> @location(0) vec4 { let t = globals.time; // uv.y is 0 at the top of the quad let height = 1.0 - mesh.uv.y; let horizon = vec3(0.98, 0.85, 0.72); let zenith = vec3(0.45, 0.68, 0.92); var color = mix(horizon, zenith, smoothstep(0.0, 1.0, height)); // Two layers of slowly drifting clouds let p = mesh.world_position.xy / 300.0; let clouds = fbm(p + vec2(t * 0.03, 0.0)) * 0.6 + fbm(p * 2.0 + vec2(t * 0.05, t * 0.01)) * 0.4; let cover = smoothstep(0.45, 0.75, clouds); color = mix(color, vec3(1.0), cover * 0.8); return vec4(color, 1.0); }