43 lines
1.9 KiB
Plaintext
43 lines
1.9 KiB
Plaintext
shader_type spatial;
|
|
render_mode blend_mix, depth_prepass_alpha, cull_disabled, diffuse_burley, specular_schlick_ggx;
|
|
|
|
uniform float wave_strength : hint_range(0.0, 0.3) = 0.055;
|
|
uniform float wave_speed : hint_range(0.0, 3.0) = 0.72;
|
|
uniform float flow_speed : hint_range(0.0, 2.0) = 0.46;
|
|
uniform vec3 deep_color : source_color = vec3(0.03, 0.39, 0.45);
|
|
uniform vec3 shallow_color : source_color = vec3(0.07, 0.67, 0.64);
|
|
uniform vec3 sunlit_color : source_color = vec3(0.55, 0.95, 0.78);
|
|
uniform vec3 foam_color : source_color = vec3(0.82, 0.94, 0.84);
|
|
|
|
|
|
void vertex() {
|
|
float broad_wave = sin(VERTEX.x * 0.42 + VERTEX.z * 0.18 + TIME * wave_speed);
|
|
float crossing_wave = cos(VERTEX.x * 0.7 - VERTEX.z * 0.31 + TIME * wave_speed * 0.73);
|
|
VERTEX.y += (broad_wave + crossing_wave * 0.45) * wave_strength;
|
|
}
|
|
|
|
|
|
void fragment() {
|
|
vec2 flowing_uv = UV * vec2(7.0, 10.0);
|
|
flowing_uv.y -= TIME * flow_speed;
|
|
float ribbon_a = sin(flowing_uv.y + sin(flowing_uv.x * 0.72) * 1.25) * 0.5 + 0.5;
|
|
float ribbon_b = sin(flowing_uv.y * 1.7 - flowing_uv.x * 0.55 + TIME * 0.23) * 0.5 + 0.5;
|
|
float quiet_ripple = smoothstep(0.72, 0.98, ribbon_a * 0.62 + ribbon_b * 0.38);
|
|
float fresnel = pow(1.0 - clamp(dot(normalize(NORMAL), normalize(VIEW)), 0.0, 1.0), 2.4);
|
|
float bank_distance = min(UV.x, 1.0 - UV.x);
|
|
float bank_foam = 1.0 - smoothstep(0.0, 0.07, bank_distance);
|
|
bank_foam *= 0.72 + sin(UV.y * 52.0 + TIME * 0.35) * 0.12;
|
|
|
|
vec3 water_color = mix(deep_color, shallow_color, ribbon_a * 0.2 + 0.48);
|
|
water_color = mix(water_color, sunlit_color, fresnel * 0.42);
|
|
water_color = mix(water_color, foam_color, quiet_ripple * 0.05);
|
|
water_color = mix(water_color, foam_color, bank_foam * 0.3);
|
|
|
|
ALBEDO = water_color;
|
|
ROUGHNESS = mix(0.34, 0.5, ribbon_b);
|
|
SPECULAR = 0.38;
|
|
EMISSION = water_color * 0.12 + sunlit_color * (quiet_ripple * 0.05 + fresnel * 0.03);
|
|
EMISSION += foam_color * bank_foam * 0.025;
|
|
ALPHA = mix(0.94, 0.99, fresnel);
|
|
}
|