ledbanner-shaders/surfpos-test.glsl
2018-05-19 17:23:49 +02:00

52 lines
1.4 KiB
GLSL

#ifdef GL_ES
precision highp float;
#extension GL_OES_standard_derivatives : enable
#endif
uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;
varying vec2 surfacePosition;
#define mouse vec2(.5 + 0.1*cos(time*3.+surfacePosition.x*4.+cos(time*3.+surfacePosition.x*4.)), 0.)
// afl_ext 2017
#define EULER 2.7182818284590452353602874
#define IEULER 0.367879
#define time mouse.x
float wave(vec2 uv, vec2 emitter, float speed, float phase, float timeshift){
float dst = distance(uv, emitter);
return pow(EULER, sin(dst * phase - (time + timeshift) * speed));
}
vec2 wavedrag(vec2 uv, vec2 emitter){
return normalize(uv - emitter);
}
float getwaves(vec2 position){
float iter = 0.0;
float phase = 6.0;
float speed = 2.0;
float weight = 1.0;
float w = 0.0;
float ws = 0.0;
float iwaterspeed = 6.0;
for(int i=0;i<24;i++){
vec2 p = vec2(sin(iter), cos(iter)) * 300.0;
float res = wave(position, p, speed, phase, 0.0) * IEULER;
float res2 = wave(position, p, speed, phase, 0.006) * IEULER;
position -= wavedrag(position, p) * (res - res2) * weight * 5.0 * iwaterspeed;
w += res * weight;
iter += 12.0;
ws += weight;
weight = mix(weight, 0.0, 0.12);
phase *= 1.2;
speed = pow(speed, 1.014);
}
return w / ws;
}
void main( void ) {
float w = getwaves(surfacePosition);
gl_FragColor = vec4( 1.0 - w*vec4(.88-w*.25,1.2,1.3,0.)*1.5 );
}