#define PI 3.141592653589793 float smin(float a, float b, float k) { float h = max(k - abs(a - b), 0.0) / k; return min(a, b) - h * h * h * k * (1.0 / 6.0); } float rectSDF(vec2 p, vec2 b) { vec2 d = abs(p) - b; return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0); } float fill(float d, float aa) { return 1.0 - smoothstep(0.0, aa, d); } float stroke(float d, float w, float aa) { return 1.0 - smoothstep(0.0, aa, abs(d) - w); } float box01(vec2 uv, vec2 c, vec2 s, float aa) { return fill(rectSDF(uv - c, s), aa); } float frame01(vec2 uv, vec2 c, vec2 s, float w, float aa) { return stroke(rectSDF(uv - c, s), w, aa); } float in01(vec2 uv) { return step(0.0, uv.x) * step(0.0, uv.y) * step(uv.x, 1.0) * step(uv.y, 1.0); } // ------------------------------------------------------------------ // Very simple block-letter glyphs in a 0..1 local cell. // Not perfect typography, but close enough to read. // ------------------------------------------------------------------ float glyphC(vec2 uv, float aa) { float m = 0.0; m = max(m, box01(uv, vec2(0.22, 0.50), vec2(0.10, 0.42), aa)); m = max(m, box01(uv, vec2(0.52, 0.84), vec2(0.30, 0.08), aa)); m = max(m, box01(uv, vec2(0.52, 0.16), vec2(0.30, 0.08), aa)); return m * in01(uv); } float glyphA(vec2 uv, float aa) { float m = 0.0; m = max(m, box01(uv, vec2(0.22, 0.50), vec2(0.10, 0.42), aa)); m = max(m, box01(uv, vec2(0.78, 0.50), vec2(0.10, 0.42), aa)); m = max(m, box01(uv, vec2(0.50, 0.84), vec2(0.30, 0.08), aa)); m = max(m, box01(uv, vec2(0.50, 0.50), vec2(0.30, 0.08), aa)); return m * in01(uv); } float glyphS(vec2 uv, float aa) { float m = 0.0; m = max(m, box01(uv, vec2(0.50, 0.84), vec2(0.30, 0.08), aa)); m = max(m, box01(uv, vec2(0.50, 0.50), vec2(0.30, 0.08), aa)); m = max(m, box01(uv, vec2(0.50, 0.16), vec2(0.30, 0.08), aa)); m = max(m, box01(uv, vec2(0.22, 0.67), vec2(0.10, 0.17), aa)); m = max(m, box01(uv, vec2(0.78, 0.33), vec2(0.10, 0.17), aa)); return m * in01(uv); } float glyphH(vec2 uv, float aa) { float m = 0.0; m = max(m, box01(uv, vec2(0.22, 0.50), vec2(0.10, 0.42), aa)); m = max(m, box01(uv, vec2(0.78, 0.50), vec2(0.10, 0.42), aa)); m = max(m, box01(uv, vec2(0.50, 0.50), vec2(0.30, 0.08), aa)); return m * in01(uv); } float glyphM(vec2 uv, float aa) { float m = 0.0; m = max(m, box01(uv, vec2(0.16, 0.50), vec2(0.09, 0.42), aa)); m = max(m, box01(uv, vec2(0.84, 0.50), vec2(0.09, 0.42), aa)); m = max(m, box01(uv, vec2(0.38, 0.65), vec2(0.08, 0.27), aa)); m = max(m, box01(uv, vec2(0.62, 0.65), vec2(0.08, 0.27), aa)); m = max(m, box01(uv, vec2(0.50, 0.84), vec2(0.25, 0.08), aa)); return m * in01(uv); } float glyphO(vec2 uv, float aa) { float outer = box01(uv, vec2(0.50, 0.50), vec2(0.34, 0.42), aa); float inner = box01(uv, vec2(0.50, 0.50), vec2(0.18, 0.24), aa); return max(0.0, outer - inner) * in01(uv); } float glyphN(vec2 uv, float aa) { float m = 0.0; m = max(m, box01(uv, vec2(0.20, 0.50), vec2(0.10, 0.42), aa)); m = max(m, box01(uv, vec2(0.80, 0.50), vec2(0.10, 0.42), aa)); m = max(m, box01(uv, vec2(0.50, 0.50), vec2(0.08, 0.42), aa)); return m * in01(uv); } float glyphE(vec2 uv, float aa) { float m = 0.0; m = max(m, box01(uv, vec2(0.22, 0.50), vec2(0.10, 0.42), aa)); m = max(m, box01(uv, vec2(0.52, 0.84), vec2(0.30, 0.08), aa)); m = max(m, box01(uv, vec2(0.48, 0.50), vec2(0.26, 0.08), aa)); m = max(m, box01(uv, vec2(0.52, 0.16), vec2(0.30, 0.08), aa)); return m * in01(uv); } float glyphY(vec2 uv, float aa) { float m = 0.0; m = max(m, box01(uv, vec2(0.22, 0.72), vec2(0.10, 0.20), aa)); m = max(m, box01(uv, vec2(0.78, 0.72), vec2(0.10, 0.20), aa)); m = max(m, box01(uv, vec2(0.50, 0.50), vec2(0.10, 0.12), aa)); m = max(m, box01(uv, vec2(0.50, 0.20), vec2(0.10, 0.20), aa)); return m * in01(uv); } float glyphR(vec2 uv, float aa) { float m = 0.0; m = max(m, box01(uv, vec2(0.22, 0.50), vec2(0.10, 0.42), aa)); m = max(m, box01(uv, vec2(0.50, 0.84), vec2(0.28, 0.08), aa)); m = max(m, box01(uv, vec2(0.72, 0.68), vec2(0.10, 0.16), aa)); m = max(m, box01(uv, vec2(0.50, 0.50), vec2(0.26, 0.08), aa)); m = max(m, box01(uv, vec2(0.68, 0.24), vec2(0.10, 0.20), aa)); return m * in01(uv); } float glyphD(vec2 uv, float aa) { float m = 0.0; m = max(m, box01(uv, vec2(0.22, 0.50), vec2(0.10, 0.42), aa)); m = max(m, box01(uv, vec2(0.50, 0.84), vec2(0.26, 0.08), aa)); m = max(m, box01(uv, vec2(0.50, 0.16), vec2(0.26, 0.08), aa)); m = max(m, box01(uv, vec2(0.74, 0.50), vec2(0.10, 0.34), aa)); return m * in01(uv); } float drawGlyph(int g, vec2 uv, float aa) { if (g == 0) return glyphC(uv, aa); if (g == 1) return glyphA(uv, aa); if (g == 2) return glyphS(uv, aa); if (g == 3) return glyphH(uv, aa); if (g == 4) return glyphM(uv, aa); if (g == 5) return glyphO(uv, aa); if (g == 6) return glyphN(uv, aa); if (g == 7) return glyphE(uv, aa); if (g == 8) return glyphY(uv, aa); if (g == 9) return glyphR(uv, aa); if (g == 10) return glyphD(uv, aa); return 0.0; } float placeGlyph(vec2 q, vec4 box, int glyphId, float aa) { vec2 uv = (q - box.xy) / (box.zw - box.xy); return drawGlyph(glyphId, uv, aa); } float dollarMark(vec2 uv, float aa) { float m = 0.0; // vertical bar m = max(m, box01(uv, vec2(0.50, 0.50), vec2(0.05, 0.42), aa)); // top/bottom heavy bars to make a chunky $ m = max(m, box01(uv, vec2(0.50, 0.82), vec2(0.22, 0.10), aa)); m = max(m, box01(uv, vec2(0.50, 0.50), vec2(0.22, 0.10), aa)); m = max(m, box01(uv, vec2(0.50, 0.18), vec2(0.22, 0.10), aa)); // left upper / right lower chunks m = max(m, box01(uv, vec2(0.30, 0.66), vec2(0.10, 0.18), aa)); m = max(m, box01(uv, vec2(0.70, 0.34), vec2(0.10, 0.18), aa)); return m * in01(uv); } void mainImage(out vec4 fragColor, in vec2 fragCoord) { vec2 uv = fragCoord.xy / iResolution.xy; vec4 base = texture(iChannel0, uv); vec3 col = base.rgb; float aa = 1.6 / iResolution.y; // ---------------------------------------------------------- // Bouncing rectangular badge, DVD-logo style // ---------------------------------------------------------- vec2 badgeSize = vec2(0.18, 0.44); vec2 minP = badgeSize * 0.5 + vec2(0.02, 0.03); vec2 maxP = vec2(1.0) - minP; vec2 travel = maxP - minP; vec2 phase = fract(vec2(iTime * 0.060, iTime * 0.047) + vec2(0.21, 0.58)); vec2 tri = abs(phase * 2.0 - 1.0); vec2 center = minP + travel * tri; vec2 p = uv - center; p.x *= iResolution.x / iResolution.y; vec2 halfSize = vec2(badgeSize.x * 0.5 * iResolution.x / iResolution.y, badgeSize.y * 0.5); // q = normalized coordinates inside the badge vec2 q = p / halfSize; q = q * 0.5 + 0.5; float outer = fill(rectSDF(p, halfSize), aa); float border = frame01(p, vec2(0.0), halfSize, 0.006, aa); // shadow float shadow = fill(rectSDF(p - vec2(0.010, -0.012), halfSize), aa) * 0.18; col = mix(col, col * 0.80, shadow); // white sticker body vec3 logoCol = vec3(0.0); logoCol += outer * vec3(0.96); logoCol = mix(logoCol, vec3(0.04), border); // top word: CASH MONEY float top = 0.0; float y0 = 0.78; float y1 = 0.96; float w = 0.075; float gap = 0.010; top = max(top, placeGlyph(q, vec4(0.04, y0, 0.04 + w, y1), 0, aa)); // C top = max(top, placeGlyph(q, vec4(0.04 + 1.0*(w+gap), y0, 0.04 + 1.0*(w+gap) + w, y1), 1, aa)); // A top = max(top, placeGlyph(q, vec4(0.04 + 2.0*(w+gap), y0, 0.04 + 2.0*(w+gap) + w, y1), 2, aa)); // S top = max(top, placeGlyph(q, vec4(0.04 + 3.0*(w+gap), y0, 0.04 + 3.0*(w+gap) + w, y1), 3, aa)); // H float start2 = 0.40; top = max(top, placeGlyph(q, vec4(start2 + 0.0*(w+gap), y0, start2 + 0.0*(w+gap) + w, y1), 4, aa)); // M top = max(top, placeGlyph(q, vec4(start2 + 1.0*(w+gap), y0, start2 + 1.0*(w+gap) + w, y1), 5, aa)); // O top = max(top, placeGlyph(q, vec4(start2 + 2.0*(w+gap), y0, start2 + 2.0*(w+gap) + w, y1), 6, aa)); // N top = max(top, placeGlyph(q, vec4(start2 + 3.0*(w+gap), y0, start2 + 3.0*(w+gap) + w, y1), 7, aa)); // E top = max(top, placeGlyph(q, vec4(start2 + 4.0*(w+gap), y0, start2 + 4.0*(w+gap) + w, y1), 8, aa)); // Y // bottom word: RECORDS float bottom = 0.0; float by0 = 0.03; float by1 = 0.19; float bw = 0.095; float bg = 0.012; float bstart = 0.10; bottom = max(bottom, placeGlyph(q, vec4(bstart + 0.0*(bw+bg), by0, bstart + 0.0*(bw+bg) + bw, by1), 9, aa)); // R bottom = max(bottom, placeGlyph(q, vec4(bstart + 1.0*(bw+bg), by0, bstart + 1.0*(bw+bg) + bw, by1), 7, aa)); // E bottom = max(bottom, placeGlyph(q, vec4(bstart + 2.0*(bw+bg), by0, bstart + 2.0*(bw+bg) + bw, by1), 0, aa)); // C bottom = max(bottom, placeGlyph(q, vec4(bstart + 3.0*(bw+bg), by0, bstart + 3.0*(bw+bg) + bw, by1), 5, aa)); // O bottom = max(bottom, placeGlyph(q, vec4(bstart + 4.0*(bw+bg), by0, bstart + 4.0*(bw+bg) + bw, by1), 9, aa)); // R bottom = max(bottom, placeGlyph(q, vec4(bstart + 5.0*(bw+bg), by0, bstart + 5.0*(bw+bg) + bw, by1), 10, aa)); // D bottom = max(bottom, placeGlyph(q, vec4(bstart + 6.0*(bw+bg), by0, bstart + 6.0*(bw+bg) + bw, by1), 2, aa)); // S // central $ vec2 suv = (q - vec2(0.18, 0.23)) / vec2(0.64, 0.50); float dollar = dollarMark(suv, aa); // black print float printMask = max(max(top, bottom), dollar); logoCol = mix(logoCol, vec3(0.03), printMask); // small gold glint so it still fits the bling theme float glint = pow(max(0.0, sin((uv.x * 4.0 + uv.y * 2.0) * PI * 2.0 - iTime * 1.4)), 18.0); logoCol += outer * glint * vec3(1.0, 0.84, 0.35) * 0.12; // subtle sticker highlight float shine = 1.0 - smoothstep(0.0, 0.25, abs(q.x - 0.25) + abs(q.y - 0.78)); logoCol += outer * shine * vec3(1.0) * 0.08; // composite behind text col = mix(col, col + logoCol, outer * 0.22); fragColor = vec4(clamp(col, 0.0, 1.0), base.a); }