Skip to content

Instantly share code, notes, and snippets.

@orazdow
Created March 5, 2023 06:11
Show Gist options
  • Save orazdow/bf921bdd5098918262d81399c9dfab5b to your computer and use it in GitHub Desktop.
Save orazdow/bf921bdd5098918262d81399c9dfab5b to your computer and use it in GitHub Desktop.
waves shader
const fs = /*glsl*/`#version 300 es
precision mediump float;
out vec4 fragColor;
uniform vec2 resolution;
uniform vec2 mouse;
uniform float time;
vec2 ball(float t){
return vec2(sin(t*1.2)*cos(5.+t*.82), cos(6.+t*.9));
}
vec2 pw(float i, vec2 uv, vec2 d, float t, float a){
t *= 4.;
i = (1.+i)*22.;
d += ball(.1*t+i)*1.;
a = mix(a, sin(i)*.3+.5,.5)*2.;
float dx = d.x*cos(dot(d,uv)*a+t);
float dy = d.y*cos(dot(d,uv)*a+t);
return vec2(dx, dy);
}
vec2 _pw(float i, vec2 uv, vec2 d, float t, float a){
t *= .7;
a*=2.;
i = (1.+i)*5000.;
d += ball(i*9.+t*.0)*.6;
float m = mix(.1, 1., sin(i)*.5+.5);
t *= 5.+a*.4;
a = mix(a*.1, a*1.5, sin(i)*.5+.5);
float dx = m*d.x*cos(length(d)*a+t+a);
float dy = m*d.y*cos(length(d)*a+t+a);
return vec2(dx, dy);
}
vec3 wave(vec2 uv, vec2 d, float t, float a){
vec2 p = pw(0., uv, d, t, a) +
pw(1., uv, d, t, a) +
pw(2., uv, d, t, a) +
pw(3., uv, d, t, a);
return normalize(cross(vec3(1, 0, p.x), vec3(0, 1, p.y)));
}
vec3 light(vec2 uv, float t, float a){
vec3 c1 = vec3(0,.6,1);
vec3 c2 = vec3(0,.0,1);
vec3 c3 = vec3(.6,.0,1);
vec3 l1 = normalize(vec3(mouse*2.-1., 1));
vec3 l2 = normalize(vec3(-1., -1.5, 2.5));
vec3 w = wave(uv, uv, t, a);
float ld = clamp(dot(l1, w),0.,1.);
float ld2 = clamp(dot(l2, w),0.,1.);
float lf = clamp(pow(.5-dot(l2, w),5.),0.,1.);
float ls = clamp(pow(dot(l1, w),90.),0.,1.);
float ls2 = clamp(pow(dot(l2, w),55.),0.,1.);
vec3 l = .2*c3+c1*.6*ld + c2*.2*ld2+ c1*.7*ls +.4*ls2*c3 +lf*c1*.2;
// return pow(l,vec3(1.5))*1.5;
return l;
}
vec3 _light(vec2 uv, float t, float a){
vec3 w = wave(uv, uv, t, a);
vec3 lv = normalize(vec3(mouse*2.-1., 1));
float ld = clamp(dot(lv, w),0.,1.);
float ls = clamp(pow(dot(lv, w),90.),0.,1.);
float l = .2 + .5*ld + .5*ls;
return vec3(l)*vec3(0,.6,1);
}
void main(){
vec2 uv = (2.*gl_FragCoord.xy-resolution)/resolution;
vec3 l = light(uv, time, 6.);
fragColor = vec4(l, 1.);
}
`;
const prog = {
fs: fs
};
export default prog;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment