45 lines
1.3 KiB
Plaintext
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);
|
|
} |