#!/usr/bin/env python3 """Render a GLSL fragment shader to PNG via headless firefox (readPixels -> 2D canvas). usage: ./render.py shader.frag out.png [time] [width] [height] [mouseX] [mouseY] """ import base64, os, subprocess, sys, tempfile HTML = """
""" def render(frag_path, out, t=0.0, w=640, h=640, mx=0.5, my=0.5): src = open(frag_path).read().encode() b64 = base64.b64encode(src).decode() html = HTML % dict(w=w, h=h, t=t, mx=mx, my=my, frag="atob('%s')" % b64) tmp = tempfile.NamedTemporaryFile("w", suffix=".html", delete=False) tmp.write(html); tmp.close() subprocess.run(["firefox", "--headless", "--new-instance", "--profile", "/tmp/ff2", "--window-size=%d,%d" % (w, h), "--screenshot=" + os.path.abspath(out), "file://" + tmp.name], env={**os.environ, "MOZ_NO_REMOTE": "1"}, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, timeout=120) os.unlink(tmp.name) if __name__ == "__main__": a = sys.argv[1:] render(a[0], a[1], *(float(x) for x in a[2:]))