Система фильтров в PixiJS основана на принципах постобработки графики через WebGL-шейдеры. Фильтры представляют собой объекты, которые могут изменять внешний вид спрайтов, контейнеров или сцен целиком. Ключевой особенностью является возможность комбинирования нескольких фильтров, обеспечивая сложные визуальные эффекты без необходимости модифицировать исходные текстуры.
Filter Базовый класс всех фильтров. Реализует общую логику работы с шейдерами, управлением текстурами и настройкой uniform-переменных. В конструкторе Filter принимаются два параметра: фрагментный шейдер и вершинный шейдер. В PixiJS вершинный шейдер чаще всего используется стандартный, так как основное преобразование происходит на уровне фрагментного шейдера.
Ключевые свойства:
uniforms — объект с параметрами, передаваемыми в
шейдер;padding — добавка к размеру объекта, необходимая для
корректного отображения эффектов, выходящих за пределы спрайта;blendMode — режим смешивания фильтра с исходным
изображением.FilterSystem Менеджер фильтров, который отвечает
за их применение на рендере. Поддерживает стек фильтров, оптимизирует
использование frame buffer’ов и обеспечивает правильный порядок
наложения эффектов. При вызове renderer.filter.applyFilter
система создает промежуточные текстуры, на которые записывается
результат работы фильтров.
FilterState Объект состояния фильтра, содержащий ссылки на input- и output-текстуры, фильтр, его uniforms и размер области применения. Используется FilterSystem для управления несколькими фильтрами одновременно.
Фильтр в PixiJS работает по следующему алгоритму:
Важно, что фильтры работают только с GPU-текстурами. Если объект большой или используется много фильтров одновременно, нагрузка на GPU растет, что может снизить производительность.
Стандартные фильтры PixiJS Содержат готовые решения, такие как:
BlurFilter — размытие по оси X и Y;ColorMatrixFilter — изменение цветового пространства и
применение цветовых эффектов;NoiseFilter — генерация шумов на текстуре.Пользовательские фильтры Создаются на основе класса Filter с собственным фрагментным шейдером. Позволяют реализовать любые визуальные эффекты, включая искажения, смещения и сложные цветовые коррекции.
Uniform-переменные — основной способ передачи параметров в шейдеры. Они могут быть скалярами, векторами или текстурами. В PixiJS изменения uniform-переменных автоматически обновляются при следующем рендере фильтра.
Пример передачи параметра в фильтр:
const blurFilter = new PIXI.BlurFilter();
blurFilter.uniforms.blur = 8; // задаем силу размытия
sprite.filters = [blurFilter];
Использование padding Если эффект расширяет изображение, необходимо увеличить padding, чтобы избежать обрезания. Это особенно актуально для фильтров размытия или свечения.
Сведение к минимуму количества фильтров Каждый дополнительный фильтр требует рендеринга в промежуточный RenderTexture, что увеличивает нагрузку на GPU.
Комбинирование эффектов в одном шейдере Часто эффективнее объединить несколько визуальных эффектов в одном фрагментном шейдере, чем использовать несколько отдельных фильтров.
PixiJS позволяет применять фильтры не только к отдельным спрайтам, но и к целым контейнерам. В этом случае FilterSystem рендерит все содержимое контейнера в промежуточную текстуру, а затем применяет фильтры ко всему изображению. Такой подход позволяет создавать эффекты глобального размытия или цветокоррекции для сцен целиком.
FilterSystem построена как стековый механизм:
Каждый кадр FilterSystem обновляет uniforms, проверяет необходимость пересоздания промежуточных текстур и корректно управляет WebGL Framebuffer’ами.
Фильтры используют WebGL 1.0/2.0 и требуют поддержки
OES_texture_float для некоторых эффектов. Для старых
устройств или при отсутствии нужных расширений используются
fallback-версии, минимизирующие эффект, но сохраняющие
совместимость.
Рендеринг фильтров в PixiJS полностью GPU-ориентирован, что обеспечивает высокую скорость работы даже для сложных сцен, при условии оптимального управления количеством фильтров и их разрешением.
Glow Комбинация размытия и цветовой матрицы для создания свечения вокруг объектов.
Motion Blur Использует прошлые кадры и размытие, реализуется через пользовательский фильтр с хранением предыдущего состояния.
Distortion / Warp Искажение спрайта через смещение координат текстуры в фрагментном шейдере, часто применяется для водных эффектов или волновых деформаций.
Система фильтров в PixiJS сочетает гибкость и высокую производительность, позволяя создавать визуально сложные сцены с минимальными затратами на CPU. Грамотное использование FilterSystem и FilterState позволяет строить цепочки эффектов, управлять их параметрами и оптимизировать рендеринг под разные платформы.