shader_type spatial; render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_burley, specular_schlick_ggx; uniform float scroll_speed : hint_range(0.0, 5.0) = 1.8; uniform vec3 deep_color : source_color = vec3(0.1, 0.45, 0.55); uniform vec3 mid_color : source_color = vec3(0.45, 0.78, 0.82); uniform vec3 foam_color : source_color = vec3(0.9, 0.95, 0.95); uniform float foam_contrast : hint_range(0.5, 4.0) = 2.2; uniform float sparkle_strength : hint_range(0.0, 0.8) = 0.25; void vertex() { } void fragment() { vec2 uv = UV; uv.y += TIME * scroll_speed; float band_a = fract(uv.y * 5.0 + sin(uv.x * 2.0) * 0.15); band_a = smoothstep(0.2, 0.55, band_a) * smoothstep(0.8, 0.45, band_a); float band_b = fract(uv.y * 3.5 + cos(uv.x * 2.5 + TIME * 0.3) * 0.12); band_b = smoothstep(0.1, 0.5, band_b) * smoothstep(0.85, 0.4, band_b); float foam_a = fract(uv.y * 4.0); foam_a = pow(smoothstep(0.0, 0.12, foam_a) * smoothstep(0.3, 0.15, foam_a), foam_contrast); float foam_b = fract(uv.y * 6.0 + uv.x * 1.5); foam_b = pow(smoothstep(0.5, 0.58, foam_b) * smoothstep(0.7, 0.6, foam_b), foam_contrast * 0.8); float foam = foam_a * 0.7 + foam_b * 0.3; vec3 base = mix(deep_color, mid_color, band_a * 0.5 + band_b * 0.3); vec3 color = mix(base, foam_color, foam); float sparkle = pow(foam_a, 3.0) * sparkle_strength; float highlight = band_a * band_b * 0.35; float emission_value = sparkle + highlight * 0.3; ALBEDO = color; ALPHA = mix(0.25, 0.78, foam * 0.7 + 0.15); EMISSION = color * emission_value; METALLIC = 0.05; ROUGHNESS = 0.15; vec3 normal = NORMAL; vec3 view_dir = VIEW; vec3 view_norm = normalize(view_dir); float rim = 1.0 - abs(dot(normal, view_norm)); ALPHA = mix(ALPHA, ALPHA * 0.5, rim * 0.6); }