Files
MovementTests/player_controller/Shaders/Distortion.gdshader

45 lines
1.3 KiB
Plaintext

shader_type canvas_item;
uniform sampler2D SCREEN_TEXTURE : hint_screen_texture, filter_linear_mipmap;
uniform float screen_darkness = 0.0;
uniform float darkness_progression = 0.0;
uniform sampler2D smoke;
uniform float size: hint_range(0.0, 1.0);
uniform vec2 uv_offset;
vec4 lerp(vec4 a, vec4 b, float t){
vec4 val = vec4(
(b.x * t) + a.x * (1.0 - t),
(b.y * t) + a.y * (1.0 - t),
(b.z * t) + a.z * (1.0 - t),
(b.w * t) + a.w * (1.0 - t));
return clamp(val, 0, 1);
}
// Function to remap a value from one range to another
float remap(float value, float old_min, float old_max, float new_min, float new_max) {
return new_min + (value - old_min) * (new_max - new_min) / (old_max - old_min);
}
void fragment(){
vec2 smoke_uv = UV;
smoke_uv += uv_offset;
vec4 smoke_color = texture(smoke, fract(smoke_uv));
float size_remapped = remap(size, 0.0, 1.0, 0.0, 0.008);
smoke_color = clamp(smoke_color * size_remapped, 0.0, 1.0);
vec4 img_color = texture(SCREEN_TEXTURE, SCREEN_UV + vec2(smoke_color.g - size_remapped/2.0,0.0));
float screen_darkness_inverted = 1.0 - screen_darkness;
float darkness_scalar = (img_color.x + img_color.y + img_color.z) / 3.0 * screen_darkness_inverted;
vec4 darkness_color = vec4(darkness_scalar, darkness_scalar, darkness_scalar, 1.0);
COLOR = lerp(img_color, darkness_color, darkness_progression);
}