Roadmap
What is being built, and what is not.
Render Quest had six good explorables and no curriculum around them — a gallery rather than a course. The ordering below fixes the reader’s first thirty seconds before it adds anything new, closes the gap between what the site asserts and what it verifies, and only then builds the missing rungs. Polish and reach come last, because their value depends on everything above being true first.
- shipped
- 10shipped
- next
- 0next
- later
- 4later
- declined
- 5declined
- 01
Make the first thirty seconds work
A stranger arriving on any lab can tell what to touch, what it taught them, and where to go next — on a phone as well as a laptop.
A usable layout on a phone
ShippedCanvas first, then the controls that drive it, then the readout. And stop the canvas swallowing the page scroll.
The product’s single promise is that the matrix, the geometry and the pixels move together — and on a phone the slider sat two screens below the render, on a page that refused to scroll.
Named presets in every lab
ShippedThree or four saved states per lab, each with a sentence on what to look at once it lands.
Some labs open with sixteen controls and no indication which one is worth moving. A preset is the cheap version of a guided tour, and needs no tour framework.
A stated order, and an end to every lab
ShippedNumbered labs with declared prerequisites, and a footer carrying the vocabulary, the previous and next lab, and a way to report confusion.
Six labs were six unconnected pages. The content already existed — 46 glossary terms named a lab that no lab page rendered.
Show the code that draws each lab
ShippedA collapsible panel per lab with the exact shader sources the page compiles.
A reader could finish a lab having never seen a line of the code, on a site whose thesis is that the plumbing is the subject.
A link that carries the state
ShippedEach lab’s controls serialise into the address bar and restore from it, with a copy button that appears once something has been moved. Only what differs from the defaults is written, and out-of-range values from a link are rejected rather than handed to a uniform.
The most valuable thing here is a configuration that makes a point, and it could not be handed to anyone. It is also the only distribution mechanism a site with no accounts and no newsletter has.
- 02
Verify what is asserted
Nothing on the site can claim something the build has not checked — including that its shaders compile.
Check shaders in the test suite
ShippedAssert that every uniform and attribute name the TypeScript asks for exists in the shader source it is compiled against.
Every shader here is a template literal, several assembled by concatenation. A renamed uniform passes the type check, passes both test suites, passes the build, and shows the reader an error card.
Run the tests somewhere other than a deploy
ShippedA GitHub Actions workflow running the suites on push, and the link checker weekly.
The tests only ever ran because Vercel executes the build, so a branch was first checked by deploying it.
A rendering smoke test
ShippedEvery lab loaded in a real browser, checked for console errors, for its own failure card, and for whether the canvas actually drew anything — measured by reading the canvas rather than screenshotting it.
The maths was thoroughly tested and the rendering was not tested at all. Two real regressions were caught only by looking at screenshots. The first version of this test passed while every lab was blank, which is the best argument for it existing.
- 03
The missing rungs
The curriculum covers what a working graphics developer actually meets, not only what is elegant to explain.
Draw calls & instancing
ShippedDraw the same object ten thousand times and watch where the time goes. Both modes render the identical picture from the identical buffer through the identical shader; only the number of times the CPU asks changes, and the measured cost changes with it.
Why the number of draw calls matters more than the number of triangles is the single most useful performance idea, and nothing here taught it. Built — and it moved the CPU figure by more than ten times while the triangle count never budged.
Colour and gamma
ShippedA slider splits one lit sphere down the middle and lights the two halves in different colour spaces — same geometry, same light, same Lambert term. Plus the encode step the shared lit shader was missing.
This one was a correction, not an addition: every shader here multiplied sRGB-encoded numbers and wrote them straight out, so the shading lab demonstrated a specular falloff in the wrong space. Fixed in the shared shader and in both of the shading lab’s stages — for Gouraud the encode has to happen after interpolation, or it is a second bug on top of the first.
Depth, blending and transparency
LaterZ-fighting made reproducible with a near-plane slider, and why sorting transparent geometry is unavoidable.
The two things every real renderer gets wrong first, and both are pure direct manipulation.
A shader you write yourself
LaterAn editable fragment shader with compile errors shown under the editor.
Every lab so far hands you sliders. At some point the reader should be handed the keyboard.
- 04
Reach
The work is findable, and the comparison that nobody else offers is the front door.
A second reference scene across all four technologies
LaterA lit, depth-tested, spinning cube alongside the plasma — same geometry, four implementations.
The plasma is a fullscreen effect and exercises almost no plumbing. A scene with a model matrix and a depth buffer is where the four technologies genuinely diverge.
Give the chooser its own address
LaterMove the technology chooser to its own route with its own metadata and social card.
“Which should I use” is a question people search for. A settled, reasoned answer is more linkable than a category page.
Proposed, and declined
Each of these was a real suggestion with a real argument behind it. Saying no in public is the part of a roadmap that actually costs something.
- Accounts, analytics, or a newsletter
- The privacy page says the site stores nothing and watches nobody, and that claim is worth more than the data would be. Feedback arrives through an issue link instead.
- A chrome-free embed route for lecturers
- Built on a guess about a user nobody has met, on a site with no way to learn whether it was ever used. A lab page in an iframe already mostly works; if someone asks, the ask is the specification.
- A guided-tour framework
- A format whose marginal cost is prose is a format that will be half-finished for a year. Presets deliver most of the value for none of the machinery.
- Rewriting each lab in every technology
- Four labs times four APIs is sixteen implementations of identical maths. The model matrix is the same matrix everywhere; duplicating it teaches nothing and quadruples the maintenance.
- Converting the site to a pure static export
- It would spend a day of work to make one sentence on the about page technically true. The sentence was corrected instead.
Think something here is in the wrong order, or missing? Say so. The last two rounds of this plan were reordered by people arguing with it. Otherwise, the labs are the part that already exists.