Back to shaders

Shader test bench

Fragment

qc20-generative-shaders generative glsl runnable fragment MIT
Source
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);
}