thebookofshaders/00/cmyk-halftone.frag
2017-08-23 11:34:44 +02:00

92 lines
1.9 KiB
GLSL

// Author: tsone
// https://www.shadertoy.com/view/Mdf3Dn
#ifdef GL_ES
precision mediump float;
#endif
#define DOTSIZE 1.48
#define D2R(d) radians(d)
#define MIN_S 07.5
#define MAX_S 15.0
#define SPEED 0.3
#define SST 0.888
#define SSQ 0.288
uniform sampler2D u_tex0;
uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time;
vec2 ORIGIN = 0.5*u_resolution.xy;
float S = MIN_S+(MAX_S-MIN_S)*(0.5-0.5*cos(SPEED*u_time));
float R = SPEED*0.333*u_time;
vec4 rgb2cmyki (in vec4 c) {
float k = max(max(c.r,c.g),c.b);
return min(vec4(c.rgb/k,k),1.0);
}
vec4 cmyki2rgb (in vec4 c) {
return vec4(c.rgb*c.a,1.0);
}
vec2 px2uv (in vec2 px) {
return vec2(px/(u_resolution.xy*vec2(1.0,2.0))-vec2(1.0,0.0) );
}
vec2 grid (in vec2 px) {
return px-mod(px,S);
}
vec4 ss(in vec4 v) {
return smoothstep(SST-SSQ,SST+SSQ,v);
}
vec4 halftone (in vec2 fc,in mat2 m) {
vec2 smp = (grid(m*fc)+0.5*S)*m;
float s = min(length(fc-smp)/(DOTSIZE*0.5*S),1.0);
vec4 c = rgb2cmyki(texture2D(u_tex0,px2uv(smp+ORIGIN)));
return c+s;
}
mat2 rotm (in float r) {
float cr = cos(r);
float sr = sin(r);
return mat2(
cr,-sr,
sr,cr
);
}
void main() {
vec2 st = gl_FragCoord.xy/u_resolution.xy;
if (st.x > 0.5) {
R = 3.14-(u_mouse.y/u_resolution.y)*(3.14/180.);
S = 12.0-(u_mouse.x/u_resolution.x)*7.0;
vec2 fc = gl_FragCoord.xy*2.0-ORIGIN;
mat2 mc = rotm(R+D2R(15.0));
mat2 mm = rotm(R+D2R(75.0));
mat2 my = rotm(R);
mat2 mk = rotm(R+D2R(45.0));
float k = halftone(fc,mk).a;
vec4 c = cmyki2rgb(ss(vec4(
halftone(fc,mc).r,
halftone(fc,mm).g,
halftone(fc,my).b,
halftone(fc,mk).a
)));
gl_FragColor = c;
} else {
st = vec2(st.x,st.y*0.5)*2.0;
gl_FragColor = texture2D(u_tex0,st);
}
}