Архитектура системы фильтров

Система фильтров в PixiJS основана на принципах постобработки графики через WebGL-шейдеры. Фильтры представляют собой объекты, которые могут изменять внешний вид спрайтов, контейнеров или сцен целиком. Ключевой особенностью является возможность комбинирования нескольких фильтров, обеспечивая сложные визуальные эффекты без необходимости модифицировать исходные текстуры.


Основные компоненты фильтров

  1. Filter Базовый класс всех фильтров. Реализует общую логику работы с шейдерами, управлением текстурами и настройкой uniform-переменных. В конструкторе Filter принимаются два параметра: фрагментный шейдер и вершинный шейдер. В PixiJS вершинный шейдер чаще всего используется стандартный, так как основное преобразование происходит на уровне фрагментного шейдера.

    Ключевые свойства:

    • uniforms — объект с параметрами, передаваемыми в шейдер;
    • padding — добавка к размеру объекта, необходимая для корректного отображения эффектов, выходящих за пределы спрайта;
    • blendMode — режим смешивания фильтра с исходным изображением.
  2. FilterSystem Менеджер фильтров, который отвечает за их применение на рендере. Поддерживает стек фильтров, оптимизирует использование frame buffer’ов и обеспечивает правильный порядок наложения эффектов. При вызове renderer.filter.applyFilter система создает промежуточные текстуры, на которые записывается результат работы фильтров.

  3. FilterState Объект состояния фильтра, содержащий ссылки на input- и output-текстуры, фильтр, его uniforms и размер области применения. Используется FilterSystem для управления несколькими фильтрами одновременно.


Принцип работы

Фильтр в PixiJS работает по следующему алгоритму:

  1. Создается intermediate RenderTexture, на который рендерится исходное изображение.
  2. Применяется фрагментный шейдер фильтра, который изменяет пиксели на основе переданных uniforms.
  3. Результат записывается в выходную текстуру.
  4. Если применяется несколько фильтров, каждый последующий берет на вход результат предыдущего.

Важно, что фильтры работают только с GPU-текстурами. Если объект большой или используется много фильтров одновременно, нагрузка на GPU растет, что может снизить производительность.


Виды фильтров

  • Стандартные фильтры PixiJS Содержат готовые решения, такие как:

    • BlurFilter — размытие по оси X и Y;
    • ColorMatrixFilter — изменение цветового пространства и применение цветовых эффектов;
    • NoiseFilter — генерация шумов на текстуре.
  • Пользовательские фильтры Создаются на основе класса Filter с собственным фрагментным шейдером. Позволяют реализовать любые визуальные эффекты, включая искажения, смещения и сложные цветовые коррекции.


Работа с uniform-переменными

Uniform-переменные — основной способ передачи параметров в шейдеры. Они могут быть скалярами, векторами или текстурами. В PixiJS изменения uniform-переменных автоматически обновляются при следующем рендере фильтра.

Пример передачи параметра в фильтр:

const blurFilter = new PIXI.BlurFilter();
blurFilter.uniforms.blur = 8; // задаем силу размытия
sprite.filters = [blurFilter];

Оптимизация фильтров

  1. Использование padding Если эффект расширяет изображение, необходимо увеличить padding, чтобы избежать обрезания. Это особенно актуально для фильтров размытия или свечения.

  2. Сведение к минимуму количества фильтров Каждый дополнительный фильтр требует рендеринга в промежуточный RenderTexture, что увеличивает нагрузку на GPU.

  3. Комбинирование эффектов в одном шейдере Часто эффективнее объединить несколько визуальных эффектов в одном фрагментном шейдере, чем использовать несколько отдельных фильтров.


Применение фильтров к контейнерам

PixiJS позволяет применять фильтры не только к отдельным спрайтам, но и к целым контейнерам. В этом случае FilterSystem рендерит все содержимое контейнера в промежуточную текстуру, а затем применяет фильтры ко всему изображению. Такой подход позволяет создавать эффекты глобального размытия или цветокоррекции для сцен целиком.


Архитектура FilterSystem

FilterSystem построена как стековый механизм:

  • Состояние фильтра (FilterState) сохраняется при начале применения фильтра к объекту.
  • Stack позволяет вложенные фильтры для разных объектов.
  • Input/Output RenderTexture обеспечивает двойную буферизацию для последовательного применения нескольких фильтров.

Каждый кадр FilterSystem обновляет uniforms, проверяет необходимость пересоздания промежуточных текстур и корректно управляет WebGL Framebuffer’ами.


Рендеринг и совместимость

Фильтры используют WebGL 1.0/2.0 и требуют поддержки OES_texture_float для некоторых эффектов. Для старых устройств или при отсутствии нужных расширений используются fallback-версии, минимизирующие эффект, но сохраняющие совместимость.

Рендеринг фильтров в PixiJS полностью GPU-ориентирован, что обеспечивает высокую скорость работы даже для сложных сцен, при условии оптимального управления количеством фильтров и их разрешением.


Примеры типовых эффектов

  1. Glow Комбинация размытия и цветовой матрицы для создания свечения вокруг объектов.

  2. Motion Blur Использует прошлые кадры и размытие, реализуется через пользовательский фильтр с хранением предыдущего состояния.

  3. Distortion / Warp Искажение спрайта через смещение координат текстуры в фрагментном шейдере, часто применяется для водных эффектов или волновых деформаций.


Система фильтров в PixiJS сочетает гибкость и высокую производительность, позволяя создавать визуально сложные сцены с минимальными затратами на CPU. Грамотное использование FilterSystem и FilterState позволяет строить цепочки эффектов, управлять их параметрами и оптимизировать рендеринг под разные платформы.