// Based on https://godotshaders.com/shader/screen-smoke-fog/ shader_type canvas_item; render_mode blend_mul; // Stuff related to camera position and offsets uniform vec2 camera_position; uniform vec2 camera_zoom = vec2(1.0); uniform vec2 viewport_size = vec2(1920.0, 1080.0); // Uniforms for customization uniform sampler2D noise_texture : repeat_enable; uniform float cloud_speed : hint_range(0.0, 10.0) = 1.0; uniform float cloud_delay : hint_range(0.0, 100.0) = 1.0; uniform vec2 cloud_dir = vec2(1.0,+1.0); uniform vec3 cloud_color : source_color = vec3(0.8); uniform float cloud_alpha : hint_range(0.0, 1.0) = 1.0; uniform float cloud_size : hint_range(1.0, 100.0) = 10.0; uniform float cloud_distorsion_speed : hint_range(0.0, 1.) = 0.05; uniform float density : hint_range(0.0, 1.0) = 1.0; uniform float blur_amount : hint_range(0.0, 1.0) = 1.0; void fragment() { vec2 world_pos = (UV - 0.5) * (viewport_size) / camera_zoom + camera_position; //COLOR=texture(noise_texture, world_pos * (1./(cloud_size*100.))); float time = TIME+cloud_delay; vec2 time_offset = time * cloud_dir * cloud_speed * 0.01; vec2 distorsion_time_offset = time * cloud_dir * (cloud_speed + vec2(cloud_distorsion_speed,cloud_distorsion_speed)) * 0.01; vec2 cloud_uv = world_pos * (1./(cloud_size*100.)) + time_offset; vec2 distorsion_cloud_uv = world_pos * (1./(cloud_size*100.)) + distorsion_time_offset; float final_noise = ( texture(noise_texture, cloud_uv) * 0.5 + texture(noise_texture, distorsion_cloud_uv) * 0.5 ).r; float edge = smoothstep(density - blur_amount * 0.5, density + blur_amount * 0.5, final_noise); COLOR = vec4(mix(cloud_color, vec3(1.0), edge), 1.0); //if (final_noise < density) { //COLOR = vec4(cloud_color.r,cloud_color.g,cloud_color.b,1.); //} else //COLOR = vec4(1.,1.,1.,1.); }