48 lines
1.4 KiB
Text
48 lines
1.4 KiB
Text
shader_type canvas_item;
|
|
|
|
uniform float horizontal_displacement_pixels : hint_range(0.0, 2.0, 0.25) = 1.5;
|
|
uniform float wave_speed : hint_range(0.0, 2.0, 0.05) = 0.55;
|
|
uniform float wave_scale : hint_range(0.0, 0.20, 0.005) = 0.055;
|
|
uniform vec3 underwater_tint : source_color = vec3(0.78, 0.96, 1.08);
|
|
uniform float tint_strength : hint_range(0.0, 0.35, 0.01) = 0.18;
|
|
uniform float highlight_strength : hint_range(0.0, 0.15, 0.01) = 0.06;
|
|
uniform float bob_amount_pixels : hint_range(0.0, 4.0, 1.0) = 4.0;
|
|
uniform float bob_speed : hint_range(0.0, 2.0, 0.05) = 0.65;
|
|
|
|
void vertex() {
|
|
VERTEX.y += round(
|
|
sin(TIME * bob_speed) * bob_amount_pixels
|
|
);
|
|
}
|
|
|
|
void fragment() {
|
|
float stepped_time = floor(TIME * 12.0) / 12.0;
|
|
float source_row = floor(UV.y / max(TEXTURE_PIXEL_SIZE.y, 0.000001));
|
|
float wave = sin(
|
|
source_row * wave_scale + stepped_time * wave_speed
|
|
);
|
|
float pixel_offset = clamp(
|
|
round(wave * horizontal_displacement_pixels),
|
|
-2.0,
|
|
2.0
|
|
);
|
|
vec2 sample_uv = UV + vec2(pixel_offset * TEXTURE_PIXEL_SIZE.x, 0.0);
|
|
vec4 source = texture(TEXTURE, sample_uv);
|
|
|
|
vec3 treated_color = mix(
|
|
source.rgb,
|
|
source.rgb * underwater_tint,
|
|
tint_strength
|
|
);
|
|
float highlight_wave = sin(
|
|
UV.y * 26.0 - stepped_time * wave_speed * 0.8
|
|
) * 0.5 + 0.5;
|
|
float highlight_level = floor(highlight_wave * 3.0) / 3.0;
|
|
treated_color += (
|
|
vec3(0.12, 0.30, 0.34)
|
|
* highlight_level
|
|
* highlight_strength
|
|
* source.a
|
|
);
|
|
COLOR = vec4(treated_color, source.a);
|
|
}
|