EffectComposer, instead of writing the render straight to screen, captures it into a texture (a render target) and feeds that texture into the next pass as input, stacking effects like a chain. Each Pass reads the previous pass’s result (tDiffuse), processes it with its own fragment shader, and hands it to the next.
The demo stacks: RenderPass (normal render) → RGBShiftShader (nudges red and blue channels apart to fake chromatic aberration) → FilmPass (film grain and scanlines) → VignetteShader (darkens the edges) → OutputPass (final color-space correction). Individual shaders like these get wrapped in ShaderPass(shader) to slot into the chain.
No matter how many passes are stacked, you call composer.render() once instead of renderer.render(). Each added pass means one more full-screen texture sample, though, so on mobile it’s worth keeping only the effects that actually earn their cost.
When to use
Whenever the effect belongs on the "camera lens" rather than an individual object — overall color grading, a film look, screen distortion.