netmasked/shaders/fog.gdshader

33 lines
No EOL
1.1 KiB
Text

shader_type canvas_item;
uniform vec2 center = vec2(0.5, 0.5);
uniform float radius : hint_range(0.0, 1.0) = 0.3;
uniform float softness : hint_range(0.0, 1.0) = 0.1;
// Use 'repeat_enable' to ensure the noise tiles seamlessly
uniform sampler2D noise_texture : repeat_enable, filter_nearest;
uniform float noise_strength : hint_range(0.0, 1.0) = 0.1;
uniform float noise_scale = 4.0; // New: Controls how "dense" the fog clouds are
void fragment() {
vec2 uv = UV;
// 1. Scale the UVs for the noise lookup.
// Higher scale = more frequent/smaller clouds.
vec2 noise_uv = (uv * noise_scale) + vec2(TIME * 0.05);
// 2. Center the noise!
// Texture returns 0.0 to 1.0. Subtracting 0.5 makes it -0.5 to 0.5.
// This allows the fog to distort BOTH inward and outward.
float noise = texture(noise_texture, noise_uv).r - 0.5;
float dist = distance(uv, center);
// 3. Apply the centered noise to the threshold
float fog_threshold = radius + (noise * noise_strength);
// 4. Smoothstep for the alpha transition
float alpha = smoothstep(fog_threshold - softness, fog_threshold, dist);
COLOR.a *= alpha;
}