open .fs {
"DESCRIPTION" : "Wet neon — a few neon signs smeared into dark rippling water, wavering and broken by the surface waves." ,
"CREDIT" : "claude-opus-4-8" ,
"INPUTS" : [
{ "NAME" : "ripple" , "TYPE" : "float" , "DEFAULT" : 0.5 , "MIN" : 0.0 , "MAX" : 1.5 } ,
{ "NAME" : "waves" , "TYPE" : "float" , "DEFAULT" : 34.0 , "MIN" : 12.0 , "MAX" : 70.0 } ,
{ "NAME" : "glow" , "TYPE" : "float" , "DEFAULT" : 0.8 , "MIN" : 0.2 , "MAX" : 1.6 } ,
{ "NAME" : "speed" , "TYPE" : "float" , "DEFAULT" : 1.0 , "MIN" : 0.0 , "MAX" : 3.0 }
]
}
float hash (vec2 p){ p = fract (p * vec2 (123.34 , 456.21 )); p += dot (p, p + 45.32 ); return fract (p.x * p.y); }
float noise (vec2 p){
vec2 i = floor (p), f = fract (p); f = f * f * (3.0 - 2.0 * f);
float a = hash (i), b = hash (i + vec2 (1.0 , 0.0 )), c = hash (i + vec2 (0.0 , 1.0 )), d = hash (i + vec2 (1.0 , 1.0 ));
return mix (mix (a, b, f.x), mix (c, d, f.x), f.y);
}
vec3 bar (float x, float cx, float w, vec3 col){
float d = (x - cx) / w;
return col * exp (-d * d);
}
vec3 lights (float x){
vec3 c = vec3 (0.0 );
c += bar (x, 0.20 , 0.045 , vec3 (1.0 , 0.10 , 0.65 ));
c += bar (x, 0.40 , 0.030 , vec3 (0.10 , 0.95 , 1.0 ));
c += bar (x, 0.58 , 0.055 , vec3 (0.45 , 1.0 , 0.20 ));
c += bar (x, 0.80 , 0.035 , vec3 (1.0 , 0.55 , 0.05 ));
return c;
}
void main (){
vec2 uv = gl_FragCoord .xy / RENDERSIZE ;
float t = TIME * speed;
float depth = 1.0 - uv.y;
float wob = 0.055 * sin (uv.y * 9.0 - t * 1.3 )
+ 0.030 * sin (uv.y * 21.0 + t * 0.8 )
+ 0.025 * (noise (vec2 (uv.y * 7.0 , t * 0.7 )) - 0.5 );
wob *= ripple * (0.25 + 1.1 * depth);
float x = uv.x + wob;
vec3 col = lights (x) * 0.5 + lights (x - 0.018 ) * 0.25 + lights (x + 0.018 ) * 0.25 ;
float band = sin (uv.y * waves + 4.5 * sin (uv.x * 2.5 + t * 0.6 ) - t * 2.0 );
band += 0.5 * sin (uv.y * waves * 2.3 - t * 3.0 );
band = 0.5 + 0.5 * clamp (band, -1.0 , 1.0 );
col *= 0.18 + 1.2 * pow (band, 2.2 );
col *= 0.45 + 0.55 * depth;
float crest = pow (band, 8.0 );
col += col * crest * 0.8 ;
col *= glow;
col += (lights (x) * 0.5 + lights (x - 0.018 ) * 0.25 + lights (x + 0.018 ) * 0.25 ) * 0.07 ;
col = col / (1.0 + 0.5 * col);
col = pow (max (col, 0.0 ), vec3 (0.85 ));
gl_FragColor = vec4 (col, 1.0 );
}