Repository navigation
Wave 3 A/B — what supersampling actually looks like (and why lanczos is out) #52
thorwhalen
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Wave 3 changes what every frame looks like, and the case for it has so far been made
entirely in numbers. Here are the pictures behind them, so the decision can be made by
looking as well as by reading.
Nothing here is shipped. Supersampling will land opt-in, and the default flip is a
separate one-line PR that should not happen until someone has actually looked at this
page. That is what it is for.
Every image is four panels: as it renders today, then the supersampled render brought
back to size three different ways. Regenerate any of them with one command — see
How these were made at the bottom.
1.
promote_demo— the character rig, and the clearest resultLook at the hairline and the eyebrows. Today's render (panel 1) is soft and smeared;
that is not artistic intent, it is the SVG sprite being rasterised at 1x and then
stretched. At
k=2 box(panel 3) the same art comes out crisp, because the spriterasterises at 2x and is resolved down.
This is the biggest single-scene improvement in the wave — a 35% narrower edge band —
and it is on the descriptor path, which is the path an illustrator's art actually
travels. It is also the exact path the existing
disabled_aalever is blind to, sonothing in the instrument has ever been able to see this before.
Panel 4 is why the epic's specified filter is refused: look for the pale halo sitting
just above each eyebrow. That is lanczos's negative lobe ringing.
2.
aa_probe— diagonals, where gradation is visibleThe diagonal edge is where you can see gradation being added rather than
smeared. Panel 2 (
nearest) is the harsh control — sub-samples discarded, so thestaircase is at its worst. Panel 3 (
box) has visibly more steps along the samediagonal, at almost the same band width. Panel 4 has lost the edge.
8 → 22 colours for +7% band width is the whole thesis. Lanczos's 281 colours are not
gradation, they are ringing overshoot — which is exactly why no single number can
adjudicate this and the pair has to.
3.
saturated_outline— hard black outlines, the target idiomPanels 1–3 look nearly identical here on purpose: this scene is all axis-aligned
rectangles, and an axis-aligned edge has nothing to anti-alias. That is a useful
negative — supersampling is not silently changing art that has no diagonals.
Panel 4 is not identical. The black outlines have grey ghosts either side.
Lanczos triples the edge band on the scene closest to the style this whole epic is
aiming at. That single number is what took the brief's specified filter off the table.
4. The rest
single_character,multi_shot,graded_field— click to expandsingle_charactermulti_shotgraded_fieldSame shape every time: box roughly triples the colour count for a 3–8% wider band;
lanczos doubles the band.
Full frames (not magnified) are beside each zoom sheet in the same directory, if you want
to confirm nothing moved except the edges.
What I would like your eye on
promote_demopanel 3 better than panel 1? I think obviously yes, but it isthe single biggest visible change and it is a taste call, not a measurement.
that widening is convergence toward the correct value, not softening — k=2 gets
57–97% of the way from today's value to where the edge converges at k≥4. But "correct"
and "what I want it to look like" are different questions and only one of them is mine.
nearest) that looks better to you than panel 3 (box)? Ifso I have the trade backwards somewhere.
How these were made
The generator is committed at
misc/bench/wave3_ab.py:The load-bearing part is thirty lines. It renders through the same seam the
disabled_aabench lever uses — copy the staged runtime, patch the copy, rebindrender.runtime_dir— so the shippedruntime.jsis never written to:autoDensity: falseis the entire finding. With ittrue, Pixi sets the canvas CSSsize to the logical size and Chromium composites the 2x backbuffer down before the
screenshot ever happens — a blind downscale, no filter choice, no record that it
occurred. Measured, rendering a 320x240 scene:
resolution: 2, autoDensity: falseresolution: 2, autoDensity: trueThe option whose name most suggests it is the right one is the one that silently
reintroduces the failure the epic warned about for
device_scale_factor.The
boxresolve is a plain block mean, which at an integer ratio is thesupersample resolve rather than an approximation of one — no resampler, no filter to
defend, and no new dependency:
The crop is picked by edge-mask density via a summed-area table, not by eye, so the
zoom is reproducible and nobody gets to choose a flattering corner.
Full measured record:
misc/docs/wave3_research.md.Decisions of record: #9 comment.
Images are committed and stay committed. I originally planned to drop them before the
branch landed, on sdist-weight grounds — that was wrong twice over: a squash merge makes
these commits non-ancestors of
main, so the pinned URLs would then depend on GitHubkeeping PR refs alive, and 228 KB is far under this repo's own stated revisit trigger
(a corpus over 20 MB). Evidence for a decision is what
misc/is for. The generatorregenerates them in about a minute either way.
All reactions