PixiJS filters provide powerful post-processing effects that can be applied to any display object and its children. They enable visual effects ranging from basic color adjustments to complex shader-based operations.
Apply filters to any display object using its filters property:
import { Sprite, BlurFilter } from 'pixi.js';
const sprite = Sprite.from('image.png');
// Single filter
sprite.filters = new BlurFilter({ strength: 8 });
// Multiple filters (applied in sequence)
sprite.filters = [
    new BlurFilter({ strength: 8 }),
    new NoiseFilter({ noise: 0.5 })
];
import {
    AlphaFilter,
    BlurFilter,
    ColorMatrixFilter,
    DisplacementFilter,
    NoiseFilter
} from 'pixi.js';
// Transparency
sprite.filters = new AlphaFilter({ alpha: 0.5 });
// Gaussian blur
sprite.filters = new BlurFilter({
    strength: 8,
    quality: 4,
    repeatEdgePixels: false
});
// Color transformation
sprite.filters = new ColorMatrixFilter();
filter.blackAndWhite(); // Preset effect
// Displacement mapping
const displacementSprite = Sprite.from('displacement.png');
sprite.filters = new DisplacementFilter({
    sprite: displacementSprite,
    scale: 20
});
// Random noise
sprite.filters = new NoiseFilter({ noise: 0.5 });
Advanced blend modes require importing the blend modes extension:
import 'pixi.js/advanced-blend-modes';
import {
    ColorBurnBlend,
    ColorDodgeBlend,
    HardMixBlend
} from 'pixi.js';
sprite.filters = [
    new ColorBurnBlend(),  // Darkens base colors
    new ColorDodgeBlend(), // Brightens base colors
    new HardMixBlend()     // High contrast blend
];
Create custom filters using WebGL/WebGPU shaders:
import { Filter, GlProgram } from 'pixi.js';
// Define shader programs
const vertex = `
    in vec2 aPosition;
    out vec2 vTextureCoord;
    uniform vec4 uInputSize;
    uniform vec4 uOutputFrame;
    uniform vec4 uOutputTexture;
    void main(void) {
        gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);
        vTextureCoord = aPosition;
    }
`;
const fragment = `
    in vec2 vTextureCoord;
    uniform sampler2D uTexture;
    uniform float uWaveAmplitude;
    uniform float uWaveFrequency;
    uniform float uTime;
    void main(void) {
        vec2 coord = vTextureCoord;
        // Create wave effect
        coord.x += sin(coord.y * uWaveFrequency + uTime) * uWaveAmplitude;
        gl_FragColor = texture(uTexture, coord);
    }
`;
// Create the filter
const waveFilter = new Filter({
    // Shader programs
    glProgram: new GlProgram({ vertex, fragment }),
    // Resources (uniforms, textures, etc)
    resources: {
        waveUniforms: {
            uWaveAmplitude: { value: 0.05, type: 'f32' },
            uWaveFrequency: { value: 10.0, type: 'f32' },
            uTime: { value: 0.0, type: 'f32' }
        }
    }
});
// Apply the filter
sprite.filters = [waveFilter];
// Animate the effect
app.ticker.add((time) => {
    waveFilter.resources.waveUniforms.uniforms.uTime += 0.1;
});
Optimize filter performance with these techniques:
// Limit filter area
sprite.filterArea = new Rectangle(0, 0, 100, 100);
// Reuse filter instances
const sharedBlur = new BlurFilter({ strength: 4 });
sprite1.filters = [sharedBlur];
sprite2.filters = [sharedBlur];
// Disable when not needed
sprite.filters = null;
// Use appropriate quality settings
const blur = new BlurFilter({
    strength: 8,
    quality: 2, // Lower quality for better performance
});
filterArea to limit processing areaFor detailed implementation requirements and advanced usage, refer to the API documentation of individual filter classes.