Cold Start
- ..
- .metadata17 B
- README.md4.0 KB
- bindings.yaml131 B
- shader.wgsl27.3 KB
README.md
asc_pyre
ASCENSION's fire tornado, filled one invocation per voxel into a 128 × 256 × 128
emissive volume and raymarched by preseed.volume.
The rotation
Three things make the column read as turning, and all three have to be present.
- Every noise field is sampled in a cylindrical frame whose angular coordinate is advanced by the accumulated spin in revolutions, so the surface moves between frames. The advance is differential — faster at the inner radii — which is the vortex's own shear.
- The frame is twisted with height, so every feature is a helix in a frozen frame: at the waist radius a feature leans about 50° off vertical, and the lean grows with radius so the wind tightens toward the silhouette edge.
- The noise is strongly anisotropic — five times longer along the axis than around it before the twist — because shearing something already long is what produces a long thin diagonal ribbon rather than a slightly tilted lump.
On top of those, an integer number of angular lobes carries the read through
the raymarch. A volume is integrated along a chord that crosses many azimuths,
and the average of a helix is not a helix; a sin(N·a) term survives it, is
continuous across atan2's branch cut, and — evaluated on the outer shell, where
a dense medium's near wall carries the radiance — arrives on screen as the
banding the eye reads as a wound surface.
The spin angle arrives as a cumulative table sampled at t, so the whole fill is
a pure function of t and a held frame is identical however often it is taken.
The profile
The body is monotone-narrowing root to tip: a root swell that has decayed by the bottom 30 u (an absolute height, not a fraction of the column's), the waist, then a steady thinning to two thirds of it at the top. The skirt is a separate wide, low, ragged, wind-blown term in the bottom 26 u and never enters the body's silhouette. The anvil is a separate cap whose radius is capped below the root swell, offset downwind by more than half its own radius and stretched along the wind — a sheared anvil rather than a radially symmetric cap.
Fire, dust and the collapse
ignite is the fraction of the column height that is burning, measured from the
root, so one scalar carries both the 0.30 s root-to-tip ignition and the top-down
collapse. Below the front the same volume is emissive hot dust, brighter than
the murk behind it rather than a hole in it; the anvil is always dust with an
amber belly where the fire below reaches it.
tear throws the three ropes off the axis on 120°-separated bearings, lifts them
into their upper reach, and kills everything else; the ropes carry their own fire
so they go out as flame rather than as smoke.
Colour
cLow / cMid / cUp / cCore / cDust / cSkirt arrive as scene-linear
radiance that the engine's ACES fit maps onto the accent row, scaled by the
display ceiling the post chain delivers and divided by the frame's own
sceneExposure. Dimming is a mix toward a darker authored ember, never a
multiply: the tonemap is compressive in red and near-linear in blue, so a scaled
#FF7A22 comes back a scarlet and a ramp authored in display ratios comes back
neutral. Nothing here is white; the hottest value is #FFF0C8.
Density
Density is occlusion, and the composite is scene*(1−a) + rgb, so a term
carrying more density than emission is a hole in the frame. The lanes between the
angular bands go to zero, not to a floor, so the scene behind shows through
and the frame keeps something dark to read the fire against. Density fades out
over the last 7 u above the sand, so the column dies into the surface instead
of ending on the volume's floor slab, and it fades around the camera — tightly
while the column is whole, widely during the collapse, when the crane is inside
the box.
RGB is emission, alpha is density. U carries 41 f32s and the index list is in
the shader's header.