Flakes fall through a fixed volume around the stage, settle on the first surface they meet — avatars, props, and the implicit floor underfoot — rest there, melt away, and respawn at the top to fall again
The whole loop runs on the GPU. Ten thousand flakes cost one compute dispatch, not ten thousand JavaScript objects
Controls
| Control | Range | Default | Effect |
|---|---|---|---|
| Amount | 100 – 10000 | 2000 | Number of simultaneous snowflakes |
| Speed | 0 – ×3 | ×1 | Fall and drift clock multiplier. 0 freezes them mid-air |
| Wind | −3 – 3 m/s | 0 m/s | Steady sideways drift along the stage's x axis |
| Sway | 0 – 3 | 1 | How much a flake wanders side to side on its way down |
| Flake Size | 0.4 – 3 | 1 | Flake size multiplier |
| Melt Time | 0.5 – 30 s | 6 s | How long a settled flake takes to finish melting away |
| Opacity | 0.1 – 1 | 1 | Flake opacity |
Every flake also carries its own randomness — fall speed, size, and sway phase all differ — so slow floaters mix with fast darts instead of the field translating as one sheet
Size is not uniformly distributed but layered in two: the large majority are fine, distant grains, and roughly one in ten is a much larger near flake. That sense of depth comes from VTube Studio's snow, and it is why pushing Flake Size up does not turn the frame into a field of identically sized dots — it scales the two layers rather than flattening them together
Rendering in the Scene
Snow is rendered as geometry in the same 3D space as the avatar, before post-processing. This means:
- Lights reach it, so the snow picks up the scene's colour instead of staying flat white
- Depth of field blurs it by its actual distance from the camera
- The whole look stack grades it, because it is already in the frame before those stages run
- Whether it passes in front of or behind the avatar depends on where it happens to be drifting
Its material is slightly emissive, so the snow stays visible even in a scene with no lights at all
Falling, Settling, Melting
Flakes land on a top-down heightmap refreshed every other frame, which sees everything on the stage — avatars, props, and the implicit floor at y = 0. Flakes are excluded from it, as is the skybox, so snow never lands on snow and never mistakes the background for ground
The moment a flake crosses a surface it stops and starts its clock. Over the last stretch of Melt Time it shrinks away, then respawns at the top and begins again. So this is not snow that piles up over the stream — it is a steady loop, and Amount is what sets how much of it is on screen
Enabling it seeds flakes through the whole column rather than starting them at the top, so the first frame after the switch already shows snow mid-fall
When the avatar moves or changes pose, the heightmap follows but flakes already at rest do not — they stay where they landed and wait to melt. Shorten Melt Time if you want settled snow to keep up with a big move
Wind and Sway
Wind is a constant sideways drift in metres per second; Sway is each flake's own wander. Both wrap around the volume, so no amount of wind ever empties it
Zero wind with a little sway is quiet snowfall. Push wind to either extreme and it streaks across the stage — pair that with a shorter Melt Time and it produces a blizzard effect
Cost
Snow does not join the post chain, so turning it on does not add a full-screen pass the way the other effects do. Its cost sits elsewhere: one compute dispatch per frame, plus a heightmap render every other frame — shared with rain, so enabling both does not duplicate height-map rendering
Amount is the main performance control. Buffers allocate for the ceiling once, so moving it rebuilds nothing — but simulating more flakes takes longer
Snow fades in and out over about 0.4 seconds when toggled, rather than appearing or vanishing outright
Snow needs GPU compute, so it only appears on the 3D stage. On machines that fall back to WebGL the graph may be rejected — snow then disables itself with a line in the console without interrupting the rest of the stage
Last updated on September 19, 2026