Post-processing over the finished frame. Every effect is a row in the layer list: added from the Inventory's Effects category, switched with its eye, and opening its own parameters below the list when you click it. An effect you never added takes no room in the list, so a scene saved before any of this existed renders exactly as it did
The few things that apply to the whole frame and belong to no single effect — tone mapping, exposure and the LUT — stay in the Stage detail's Look section
Each effect belongs to the scene, so two scenes can put the same avatar through completely different looks
When the Chain Appears
The chain runs on the 3D stage, so effects can be added — and Look shows — once a scene contains a VRM avatar or a 3D object layer
A Live2D-only scene qualifies by default too, because the WebGPU engine composites the Live2D layer into the same chain. Turning on Use Legacy WebGL Engine disables the Inventory's Effects category, with a line saying why, and removes the Look section — unless the scene also contains something three-dimensional. See Rendering Engines
The Chain
Momentary Gimmicks
Stages of the same chain, used differently: switched on for a moment rather than dialled in and left
Look
The Look section holds what cannot be added as a layer or switched off — these are the display pipeline itself, not optional stages on it:
| Item | What it does |
|---|---|
| Tone Mapping | The display transform — see Tone Mapping and Exposure |
| Exposure | Overall brightness ahead of that transform |
| Choose LUT… | Pick a grading lookup table; an intensity slider follows it |
| Trigger Shockwave | Fire one shockwave — a command, not a state |
Order
The chain is fixed — an effect's position in it is not a setting. It matters when two effects interact, which is why bloom haloes a graded frame rather than the other way round:
- Depth of Field — first, because it is the only built-in stage that reads scene depth
- The Live2D layer, on the WebGPU engine — after depth of field, since flat art carries none, but before every colour stage, so both kinds of avatar are graded as one image
- Rim Light → Outline → Drop Shadow — the silhouette stages, in that order, so the rim stays inside the band and the shadow casts from both
- Chromatic Aberration
- Bloom → Diffusion → LUT → Color Grading
- Pixelate and Subspace Glitch™, which warp where the frame is sampled from
- Shockwave, then Droplets — the glass pane sits in front of every screen-space warp
- Custom effects, as one group in scene order
- Film Grain and Vignette, which stay camera-side of the glass
- The selection outline, and the editor chrome above it
Tone mapping and exposure are not stages in this list — they are the display transform, applied to the finished frame on the way out
Rain and snow are missing too, for a different reason: they are not post stages at all but real geometry in the scene. They are already drawn before the chain begins, so every stage above grades them along with everything else
Cost
Post-processing runs a full-screen pass per enabled effect, so the stack is not free. Three settings in Settings trade quality for frame rate:
- Render Scale sets how large a canvas the whole 3D stage draws into — drop a step and every stage in the chain gets cheaper with it
- Effects Quality sets the antialiasing these passes and the selection outline use
- Selection Outline turns off the highlight around a selected 3D model
With every effect off, Persona skips the post chain entirely and renders straight to the canvas — so the cost is only paid by scenes that ask for it
Over the Plugin API
Every value here is one field of SceneEffects, patched with scene.patch and read back on scene.changed. The shape is deliberately flat — one key per effect, no grouping — so a client can walk the whole registry generically. See the SDK reference
Which effects hold a row in the layer list is tracked separately, in environment.effectLayers — a list of built-in effect keys. The two are distinct: enabled is whether the effect is on right now, effectLayers is whether it has a row. Patching an effect on lands its row automatically, so a plugin never has to write both. However the switch arrives — the panel, a hotkey or a patch — the frame ramps over 0.4 s rather than cutting
Custom effects are the exception to the flat shape: they live in environment.customEffects beside effects, as a list rather than a fixed set of keys, because what is installed is only known at runtime
stage.shockwave is the other exception: a one-shot command rather than a stored value
Last updated on September 4, 2026