Drawing the funnel
A tornado hands the renderer exactly one piece of geometry a frame: a prism,
submitted under the pipeline name vortexdread_funnel, whose two
programs live entirely inside shaders/core. Nothing else reaches the
screen, and no Minecraft particle is declared anywhere in the mod.
The striated wall, the lifted debris ring at the foot, the lowered cloud base overhead, the tint the column takes from whatever it is eating: all four come out of a density calculation run fresh at every pixel while the camera's own ray crosses that prism. What the storm tears loose is not sprites either: every piece keeps the model of the block it used to be and falls wearing it. Turn off every shader pack and nothing changes. That is already the game's own default picture.
One box, one program
TornadoRenderer builds that prism face by face and turns every one of them
inward, because the march works out its own entry and exit through the volume: the far wall has
to stay in front of the eye, never the near one. The storm's own numbers ride along in vertex
attributes a surface already carries: core radius and funnel height packed into
UV1, ground load and the sign of the wind into
Normal, tint and flash into Color.
The box is cut generously wider than the smoke it holds: the widest the condensation ever gets is 1.8 times the core radius, and the box itself adds another 50% of slack on top for the turbulence to push into. Radius and height packed into UV1 sit in sixteen bits each, accurate to 1/64 of a block, well under what an eye resolves at that range.
Wind strength is folded into a fraction of 90 m/s before it
reaches the shape math, and windFraction reads 1 the moment a gust
clears that floor. Below the column's own feet the box still reaches down another
0.9 core radius so dust thrown out past a ledge is never cut off mid-air, with
1.3 radii of extra width so the ring's own lobes have room to push past the
nominal edge.
A funnel that never blinks out
The box used to decide whether a tornado is even worth submitting at all is
stretched the same 0.9 core radius further down by
getBoundingBoxForCulling, the same number as the margin under the feet:
a column whose dust skirt is the only part still on screen must never vanish just because
visibility was judged on the funnel alone.
The shape of the column
Inside the prism, the fragment program traces a profile that starts narrow and flares upward: 0.58 core radius at the base, another 0.78 once multiplied by the square of the height fraction, which is what turns the silhouette into a funnel instead of a pipe. The debris ring reaches out to 1.25 radii, the lowered cloud base to 2.3, and that base only hangs for 0.13 of the funnel's own height before climbing back 1.4 times its own depth so it thins out instead of ending on a hard edge.
What makes a mature column nearly opaque sits in one constant of the program,
EXTINCTION, set to 0.62 per unit of density
crossed.
The step counts along the eye ray and toward the light never move between runs:
STEPS and LIGHT_STEPS are written straight
into the program's own text rather than read from a setting, which is what keeps the worst case
cost known ahead of time.
What its presence does to the screen
The effect follows the storm rather than mirroring it outright: it climbs 0.14 a tick on the way in and only falls back at 0.05 once the tornado has passed, the way a real light takes longer to fade than to appear.
Camera shake tops out at 0.85 degrees standing in the middle of an EF5, the range where any of this is felt at all reaches 2.2 times the column's own influence, and the log only speaks again once the level has moved by at least 12 hundredths since the last line it wrote.
Two separate switches. screenShake only cuts the
camera wobble, and postEffect cuts everything else the storm puts on
the screen without touching the shake: someone the shake bothers does not have to give up the
rest of the staging to fix it.
What changes if a pack is watching
Everything just described runs the same whether a shader pack is loaded or not: it is the picture the game shows by default. What the storm becomes once Iris and a patched pack are in place, with the pack's own light and its own aerial haze, is the subject of the next page in this wiki.
The settings that move the cost
| Setting | Description | Default |
|---|---|---|
| funnelSteps | Steps through the volume the fragment program takes. Under sixteen the wall starts showing visible bands. | 40 |
| funnelLightSteps | Steps taken toward the light for the self-shadowing inside the column. At zero the funnel goes flat. | 6 |
| funnelDetail | Size of the smallest condensation wisp still worth resolving, in blocks. Finer costs more steps to stay quiet. | 1.8 |
| funnelRenderDistance | Distance beyond which the funnel drops out of what gets submitted at all, and the storm is left as sky and sound. | 1024.0 |
| screenShake | Cuts only the camera shake described above. | true |
| postEffect | Cuts the darkening, the streaks and the flash carried by StormPostEffect's single pixel. | true |
| skyGreen | Share of green the sky's own colour takes under a tornado, from 0 to 1. | 0.55 |