33 lines
No EOL
1.1 KiB
Text
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;
|
|
} |