Back to shaders
Shader test bench
Fragment
runnable fragment
Complete GLSL fragment shader. Stronghold runs it directly when the browser can compile it.
Code
precision highp float;
#define O gl_FragColor
uniform float time;
uniform vec2 resolution;
#define FC gl_FragCoord.xy
#define R resolution
#define T time
#define MN min(R.x,R.y)
#define S smoothstep
#define SE(v,a) S(fwidth(a),-.35,v-a)
#define PI radians(180.)
#define lum(a) dot(a,vec3(.21,.71,.07))
#define hue(a)(.5+.5*sin(PI*(a)+vec3(1,2,3)))
vec3 watermark() {
vec3 col=vec3(0);
float rel=R.x/R.y;
vec2 z=FC/R;
z.x*=rel;
z.x-=rel;
z+=vec2(.1,-.1);
float j=.025, id=round(z.y/j);
z.y-=clamp(round(z.y/j),-1.,1.)*j;
float bx=max(abs(z.x),abs(z.y)), rect=step(bx,.01), frame=rect-step(bx,.008);
return clamp(mix(col,rect*hue(cos(T*.2)-id*PI*2.),mix(frame,rect,.5)),.0,1.);
}
void main() {
vec3 wm=watermark();
O=vec4(wm,0);
vec3 bg=vec3(.08);
vec2 uv=2.*FC-R, st=(FC-.5*R)/MN;
float bs=MN*.05;
if ((R.x>R.y) && (abs(st.x)>1. || abs(st.y)>.5)) {
O=max(O,vec4(bg,0));
return;
}
uv*=mat2(cos(sin(T*.2)-vec4(0,11,33,0)))*exp(cos(T)*.321)*(.7+.5*cos(T*.5));
float d=length(uv)/MN;
uv=vec2(log(d),.205+atan(uv.x,uv.y))*8./PI;
vec2 p=uv;
uv.x+=floor(uv.y*.5)*.5-T*1.5;
uv=mod(uv,2.)-1.;
p+=sin(T*10.-p*vec2(10,30))*.01;
uv*=uv*uv*uv;
float l=dot(uv,uv);
l=abs(d-SE(l,.2));
vec3 col=hue(l*l-T*.5);
col=tanh(col*col)/(.01+.25*lum(vec3(distance(cos((p.x-T)*12.),sin(p.y*42.)))));
col=sqrt(col);
l=dot(abs(uv)/dot(p,4.5*p)-.9,st);
col=mix(2.*sqrt(hue(.1+l)/max(l*l*l*l,.1)),col,S(-.5,.5,length((FC-.5*R)/MN)));
col/=4.;
col=mix(vec3(.85),col,mix(.6,1.,fract(sin(dot(st, vec2(12.9898,78.233)))*345678.)));
col=max(col,.1);
col=mix(col,vec3(1),S(1e-5,-1e-2,dot(st,st)));
// vignette
vec2 c=FC/R;
c*=1.-c.yx;
float vig=c.x*c.y*25.;
vig=S(.0,1.,pow(vig,.3));
col=mix(vec3(lum(col)),col,vig);
col=mix(vec3(0),col,vig);
col*=vec3(1.2*lum(col));
col=sqrt(col);
if (R.x>R.y) {
if (FC.x > R.x-bs || FC.x < bs || FC.y > R.y-bs || FC.y < bs) {
O=max(O,vec4(bg,0));
return;
}
}
col=max(col,wm);
O=vec4(col,1);
}