| Filter Type | GPU Cost | Notes |
|---|---|---|
| Color adjustment (brightness, contrast, curves, etc.) | Very low | Single-pass fragment shader |
| Hue rotation, saturation | Very low | Single-pass fragment shader |
| Gaussian blur (small radius) | Low | Separable kernel — two passes |
| Gaussian blur (large radius, >30px) | Medium | Multi-pass accumulation |
| Motion blur | Medium | Multi-sample accumulation |
| Radial / zoom blur | Medium-High | Many samples from center |
| Distortion (warp, ripple) | Medium | Dependent texture reads |
| Displacement map | Medium-High | Two simultaneous texture reads |
| Lens flare / god rays | High | Ray-marching algorithm |
| Mesh warp | High | Per-vertex interpolation across mesh |
| Stacked filters (any 5+) | Very high | Additive cost; each adds a rendering pass |
Some filters (particularly blur types) scale their cost with canvas resolution:
For export at 4K, filter computation time is multiplied significantly. This is expected — export is slower than realtime, and the export renderer is not limited by realtime performance requirements.
When a filter parameter is animated (keyframed to change over time), the GPU shader must be re-evaluated on every frame. Static filters are applied once and the result is cached as long as the underlying element does not change.
Optimization: Even if a filter is conceptually "constant" for a visual look, avoid placing keyframes on filter parameters unless the value actually needs to change. Keyframed filters prevent caching.