52 lines
1.4 KiB
GLSL
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 );
|
|
}
|