Multi-pass рендеринг

Многопроходный (multi-pass) рендеринг в Deck.gl опирается на последовательное выполнение нескольких стадий отрисовки сцены, каждая из которых формирует промежуточный результат, используемый следующей стадией. Такая модель позволяет разносить сложные визуальные эффекты, фильтрацию, постобработку и композицию слоёв по независимым проходам, сохраняя масштабируемость и предсказуемость графического пайплайна.

В основе системы лежит концепция разбиения сцены на набор независимых слоёв, каждый из которых может быть отрисован в отдельный буфер кадра (Framebuffer Object, FBO) или в общий контекст WebGL с последующей композицией. Каждый проход выполняет строго определённую функцию:

  • геометрический рендеринг (geometry pass)
  • вычисление промежуточных буферов (depth, normal, picking)
  • наложение эффектов (post-processing)
  • композиция итогового изображения

В рамках Deck.gl каждый слой реализует собственный shader pipeline, но управление порядком и зависимостями между проходами делегируется фреймворку слоёв и системе эффектов.

Слои как единицы рендеринга

Каждый слой в Deck.gl представляет собой изолированную единицу рендеринга с собственным состоянием, геометрией и шейдерами. При многопроходном подходе один слой может участвовать в нескольких проходах, формируя разные представления одной и той же сцены.

Типичная структура:

  • слой источника данных (ScatterplotLayer, PathLayer)
  • слой маски или глубины
  • слой постобработки
  • композитный слой (CompositeLayer)

Слои не рисуются произвольно; порядок их исполнения определяется системой согласования зависимостей и стадией рендеринга.

Render passes и жизненный цикл кадра

Многопроходный рендеринг в Deck.gl организован вокруг цикла кадра, который делится на несколько этапов:

  1. Инициализация кадра

    • обновление viewport
    • синхронизация состояния камеры
    • подготовка uniform-параметров
  2. Первичный проход (base pass)

    • отрисовка геометрии слоёв
    • формирование depth buffer
    • генерация picking buffer при необходимости
  3. Промежуточные проходы

    • вычисление вспомогательных буферов (например, нормалей или идентификаторов объектов)
    • рендеринг в offscreen framebuffers
  4. Постобработка

    • применение эффектов через full-screen quad
    • композиция цветовых буферов
  5. Финальная композиция

    • вывод результирующего изображения в canvas

Каждый этап может включать несколько sub-pass’ов в зависимости от конфигурации слоёв и активных эффектов.

Framebuffer как основа изоляции проходов

Ключевым механизмом многопроходного рендеринга выступают framebuffer-объекты. Они позволяют сохранять промежуточные изображения сцены и использовать их как текстуры в последующих стадиях.

Основные типы буферов:

  • color buffer — итоговый цветовой слой
  • depth buffer — информация о глубине пикселей
  • picking buffer — идентификаторы объектов
  • custom FBO — пользовательские буферы для эффектов

Deck.gl динамически управляет жизненным циклом FBO, минимизируя переключения контекста и повторные аллокации.

CompositeLayer и иерархия проходов

CompositeLayer реализует вложенную структуру рендеринга, при которой один логический слой агрегирует несколько дочерних слоёв. В многопроходной модели это создаёт дополнительный уровень управления:

  • предварительный проход для вычисления состояния
  • основной проход рендеринга дочерних слоёв
  • финальный проход композиции

Такая структура используется для визуализаций, где требуется объединение разных типов геометрии с единым поведением (например, кластеризация точек или агрегирование сеток).

Постобработка и эффекты

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

Типовые постпроцедурные операции:

  • bloom
  • vignette
  • tone mapping
  • blur (Gaussian, directional)
  • color correction

Каждый эффект реализуется как full-screen shader, принимающий текстуру предыдущего прохода и формирующий новый буфер.

Пайплайн эффектов формирует цепочку:

scene pass → effect pass 1 → effect pass 2 → ... → final output

Depth peeling и управление перекрытиями

При сложных сценах с перекрывающейся геометрией применяется техника многослойного извлечения глубины. Depth buffer используется не только для теста глубины, но и для построения дополнительных проходов, позволяющих корректно визуализировать прозрачные объекты.

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

  • первый проход фиксирует ближайшие поверхности
  • последующие проходы исключают уже обработанные глубины
  • результат собирается в последовательные слои прозрачности

В Deck.gl подобные механизмы используются через комбинацию стандартных слоёв и кастомных шейдеров.

Picking как отдельный рендер-проход

Механизм интерактивности основан на отдельном рендер-проходе, в котором каждый объект кодируется уникальным идентификатором в цветовой буфер. Этот проход полностью отделён от визуального рендеринга.

Процесс включает:

  • рендер сцены в offscreen buffer
  • кодирование id объекта в RGB каналы
  • чтение пикселя под курсором
  • обратное сопоставление с объектом слоя

Такой подход позволяет избегать CPU-интенсивного поиска попаданий и обеспечивает стабильную производительность при больших наборах данных.

Инстансинг и оптимизация проходов

Многопроходный рендеринг тесно связан с инстансингом геометрии. Один draw call может обслуживать тысячи объектов, что критично для производительности.

Оптимизации включают:

  • объединение геометрических проходов
  • переиспользование VBO между кадрами
  • кеширование uniform state
  • минимизацию переключений shader program

Deck.gl стремится минимизировать количество отдельных GPU проходов за счёт агрегации слоёв с одинаковыми шейдерами.

Синхронизация слоёв между проходами

Сложные сцены требуют согласованного состояния между различными рендер-проходами. Синхронизация обеспечивается через:

  • единый viewport state
  • shared uniform buffers
  • глобальные параметры камеры
  • централизованное обновление props слоёв

При изменении состояния карты пересчитываются зависимости всех активных проходов, что гарантирует согласованность изображения.

Ограничения WebGL и влияние на multi-pass

Многопроходный рендеринг в WebGL накладывает ряд ограничений:

  • ограниченное количество активных framebuffer binding
  • стоимость переключения контекста
  • ограничения по текстурным единицам
  • зависимость от производительности GPU

В Deck.gl эти ограничения компенсируются:

  • reuse framebuffer pool
  • минимизацией readback операций
  • батчингом draw calls
  • lazy evaluation эффектов

Взаимодействие с шейдерной моделью

Каждый проход тесно связан с GLSL-шейдерами. Vertex shader формирует геометрию, fragment shader определяет пиксельные значения, а промежуточные буферы служат входными текстурами для следующих стадий.

Многопроходная схема позволяет:

  • разделять вычисления по этапам
  • переносить часть логики в GPU
  • уменьшать сложность отдельных шейдеров

Типичный паттерн:

  • Pass 1: вычисление базового цвета
  • Pass 2: освещение или коррекция
  • Pass 3: постобработка

Масштабирование сложных сцен

При увеличении количества объектов многопроходная архитектура обеспечивает предсказуемое масштабирование за счёт:

  • разделения вычислений по GPU стадиям
  • независимости слоёв
  • изоляции эффектов
  • контролируемого порядка рендеринга

Такая структура позволяет визуализировать большие наборы геоданных без экспоненциального роста сложности одного прохода.

Промежуточные текстуры и композиция

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

Типы композиции:

  • overlay blending
  • additive blending
  • multiplicative blending
  • screen blending

Выбор режима влияет на итоговую визуальную структуру сцены и взаимодействие слоёв.

Управление порядком проходов

Порядок выполнения рендер-проходов определяется несколькими факторами:

  • z-index слоёв
  • зависимости эффектов
  • наличие framebuffer requirements
  • прозрачность объектов
  • интерактивные режимы (picking enabled)

Система автоматически строит граф зависимостей и минимизирует количество переключений между стадиями.

Итоговая структура пайплайна

Обобщённая модель многопроходного рендеринга в Deck.gl формируется как последовательность:

  • подготовка состояния сцены
  • геометрический рендеринг слоёв
  • генерация вспомогательных буферов
  • выполнение эффектов
  • композиция итогового изображения

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