Skip to content
Русский

gamma runs the opposite way to ink_gamma

The exponent applies to the distance, before the palette coordinate, so it decides where contours crowd rather than what colour they are. Because a band boundary sits at (k/n)^(1/gamma), the exponent is inverted on its way to a position — and below 1 is the direction that tightens the rings toward the centre, which is what the reference images do:

gammawhere the 8 boundaries land, in distancereads as
0.40.006 0.031 0.086 0.177 0.309 0.487 0.716 1.0tight at the centre, opening outward
1.00.125 0.25 0.375 0.5 0.625 0.75 0.875 1.0evenly spaced (the default, an exact identity)
2.50.435 0.574 0.675 0.758 0.829 0.891 0.948 1.0tight at the outline

That is the opposite of the intuition ink_gamma builds, where a higher exponent means more effect at the low end. Nothing warns — this table is the warning.

palette_steps is what makes this scene look like anything. Left at its default the frame is a smooth ramp from the figure’s centre outwards — correct, and not the reason to reach for this system. Turned up, each band is a band of constant distance, which is the definition of an offset curve; palette_contour then draws a hairline at each boundary. This is the third scene those two params do anything in, and the first where the thing being banded is a figure rather than a noise field.

Where the contours read is color_span. The distance is 0 at the figure’s deepest interior point and exactly 1 on its outline, and keeps growing outside — so color_span decides how much gradient the interior gets and how much is left for the rings around it. Low values put the whole gradient inside the silhouette and leave the surround flat; the default 0.6 is a compromise that shows both.

color_span IS NOT PORTABLE BETWEEN SILHOUETTES, and the factor is large. The scalar is normalized by each shape’s own inradius — that is what makes d exactly 1 on every outline — and the inradii are nothing like each other: about 0.64 for the heart against 0.093 for a sharp star (star_valley = 0.18, 7 points). So the same color_span gives roughly seven times the contour count on that star, and a value tuned on one shape is meaningless on another. Authoring a sweep across several figures needs a separately computed span per figure just to keep it on frame.

The live consequence: binding star_valley or points silently changes the ring count while it moves, because both move the inradius. If you animate either on shape_field, expect the banding to breathe with it — and if you wanted only the silhouette to change, that is not currently separable.

AND IT DOES NOT TRANSFER BETWEEN coord_mode VALUES EITHER, which is a second, independent trap on the same parameter. Under "0" the exterior is divided by the shape’s inradius, so how far the coordinate reaches depends on how thin the figure is; under "1" it grows linearly in r — the coordinate is 2 at twice the boundary radius, on every shape, by construction. So a span tuned in one mode is meaningless in the other, and nothing warns. Switching modes means re-tuning color_span, and the good news is that under "1" you only have to do it once: it is the same scale for every silhouette, which is the trap above dissolving.

How far the coordinate reaches at the frame corner is worth one line of arithmetic before you ship. The exterior is most of a 16:9 frame, and gamma above 1 compresses it: past roughly 1.5 on a palette that wraps, or 3 on a single sweep, the ring frequency at the corners runs past what the pixel grid can carry and the picture breaks into moire — which reads as texture in a still and shimmers the moment anything moves. d at the corner is 1 + (|uv|_corner / scale - 1) / R for inradius R, and the coordinate there is d^gamma * color_span; keep that under about 6 with palette_steps near 9.

points on a star here is not the same picture as on a mark. These silhouettes were tuned for sprites a few pixels across, and at frame scale the star’s interior is knowingly approximate — its field is measured 0.066 out of true at 5 points and 0.248 at 12, in units where the figure’s own inradius is 1. The contours outside every shape are exact. So a many-pointed star’s inner rings will not sit where an offset curve should; its outer ones will.

Built from 13c7582 at version 0.158.0. This site tracks main and is not versioned per release.