uniform float time; varying vec2 vUv; // https://iquilezles.org/articles/distfunctions2d/ (Thanks IQ!) float sdRing( in vec2 p, in vec2 n, in float r, float th ) { p.x = abs(p.x); p = mat2x2(n.x,n.y,-n.y,n.x)*p; return max( abs(length(p)-r)-th*0.5, length(vec2(p.x,max(0.0,abs(r-p.y)-th*0.5)))*sign(p.x) ); } void main() { // create coordinates at visual centre (y coords doubled for circles) vec2 centre = vec2(0.25, 0.25); vec2 uv = vUv * vec2(1.0, 0.5) - centre; // mirror x to get both eyes for the price of one, and find eye offset float eyes = length(vec2(abs(uv.x), uv.y) - vec2(0.035, 0.03)); // carve them out using smoothstep eyes = smoothstep(0.015, 0.016, eyes); float mouth = sdRing(vec2(uv.x, -uv.y + 0.03), vec2(7), 0.65, 0.1); mouth = smoothstep(0.02, 0.025, mouth); float shade = min(eyes, mouth); vec3 yellow = vec3(0.9, 0.7, 0.0); vec3 color = shade * yellow; gl_FragColor = vec4(color, 1.0); }