48 lines
1.8 KiB
Plaintext
48 lines
1.8 KiB
Plaintext
// 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, 1.0) = 1.0;
|
|
uniform float cloud_delay : hint_range(0.0, 100.0) = 1.0;
|
|
uniform vec2 noise_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 * noise_dir * cloud_speed * 0.01;
|
|
vec2 distorsion_time_offset = time * noise_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.);
|
|
} |