~yosh@unix.dog

shaders (basic - prims)

circles and rectangles

a few circles and rectangles

uniform vec2    u_resolution;
uniform vec2    u_mouse;
uniform float   u_time;

// Normalized pixel coordinates (from 0 to 1)
// same as gl_FragCoord / u_resolution.xy
varying vec2    v_texcoord;

// draw circle as pos_uv with radius r, blur radius r_blur, fg color fg and bg color bg
vec3 circle(vec2 pos_uv, float r, float r_blur, vec3 fg, vec3 bg) {
	vec2 diff = v_texcoord - pos_uv;
	vec2 diff_s = vec2(diff.x * u_resolution.x / u_resolution.y, diff.y);
	float len = length(diff_s);
	float t = smoothstep(r - r_blur, r + r_blur, len);
	return mix(fg, bg, t);
}

vec3 rectangle(vec2 pos_uv, vec2 size, vec2 blur, vec3 fg, vec3 bg) {
    float ar = u_resolution.x / u_resolution.y;
	vec3 c = mix(fg, bg, smoothstep(pos_uv.x*ar + size.x/2.0 - blur.x, pos_uv.x*ar + size.x/2.0 + blur.x, v_texcoord.x*ar));
	c = mix(c, bg, smoothstep(pos_uv.y + size.y/2.0 - blur.y, pos_uv.y + size.y/2.0 + blur.y, v_texcoord.y));
	c = mix(bg, c, smoothstep(pos_uv.x*ar - size.x/2.0 - blur.x, pos_uv.x*ar - size.x/2.0 + blur.x, v_texcoord.x*ar));
	c = mix(bg, c, smoothstep(pos_uv.y - size.y/2.0 - blur.y, pos_uv.y - size.y/2.0 + blur.y, v_texcoord.y));
	return c;
}

void main(void) {
    vec4 color = vec4(vec3(0.0), 1.0);
    vec2 uv = v_texcoord;
    float ar = u_resolution.x / u_resolution.y;

    vec3 fg = vec3(uv.y, uv.x, 1);
    vec3 bg = vec3(uv.x, uv.y, .5);
    color.rgb = circle(vec2(.1, .2), .1, .03, fg, bg);
    color.rgb = circle(vec2(.9, .2), .1, .01, fg, color.rgb);
    color.rgb = circle(vec2(.5), .3, .1, fg, color.rgb);
    color.rgb = rectangle(vec2(.2, .8), vec2(.3, .2), vec2(.02), fg, color.rgb);

    gl_FragColor = color;
}

back