Depth of field

Глубина резкости (Depth of Field) в CesiumJS реализуется как постобработка изображения, имитирующая оптическое поведение камеры, при котором объекты вне зоны фокусировки теряют резкость. Эффект опирается на данные буфера глубины и применяется на этапе постпроцессинга сцены через цепочку шейдеров.

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

Основная идея:

  • задаётся фокусная дистанция (focal distance);
  • определяется зона резкости (focal range);
  • вычисляется степень размытия в зависимости от отклонения глубины пикселя от фокальной плоскости.

Математически размытие часто выражается через понятие circle of confusion (круг нерезкости), который увеличивается при удалении объекта от фокуса.

= }

где ( z ) — глубина пикселя, ( z_f ) — фокусная дистанция. На практике формула модифицируется под параметры камеры и ограничивается диапазоном, чтобы избежать чрезмерных значений размытия.

Постобработка в CesiumJS

CesiumJS реализует глубину резкости через систему постпроцессинга сцены, основанную на PostProcessStage. Эффект входит в библиотеку стандартных стадий и может быть создан через Cesium.PostProcessStageLibrary.

Ключевые элементы реализации:

  • использование depth texture сцены;
  • вычисление отклонения глубины от фокусной плоскости;
  • применение многосэмплового размытия (blur kernel);
  • комбинирование исходного изображения с размытым результатом.

Внутри графического пайплайна формируются два основных прохода:

  1. анализ глубины и построение маски размытия;
  2. применение гауссового или боке-размытия.

Конфигурация параметров эффекта

Глубина резкости в CesiumJS настраивается через набор параметров, влияющих на физическую и визуальную модель камеры:

  • focalDistance — расстояние до плоскости фокуса;
  • focalRange — диапазон, внутри которого объекты остаются резкими;
  • blurScale — коэффициент интенсивности размытия;
  • isEnabled — включение и отключение стадии.

Фокусная дистанция обычно привязывается к позиции камеры или к выбранной точке интереса в сцене.

Интеграция в постпроцессинговый конвейер

В CesiumJS постобработка организована как стек стадий, применяемых последовательно к изображению кадра. Depth of Field вставляется в этот стек после рендеринга геометрии и до финального вывода на экран.

Структура конвейера:

  • рендер сцены в framebuffer;
  • запись depth buffer;
  • применение экранных эффектов (bloom, tone mapping, depth of field);
  • вывод итогового изображения.

Depth of Field требует доступ к глубине сцены, поэтому включение depth texture является обязательным условием.

Особенности вычисления размытия

Размытие реализуется на GPU с использованием свёрточных ядер. В зависимости от расстояния до фокальной плоскости пиксель получает различный радиус размытия.

Типичная схема:

  • близкие к фокусу области имеют нулевой или минимальный blur radius;
  • дальние области получают увеличенный радиус;
  • промежуточные значения интерполируются плавно.

Для оптимизации применяется двухпроходный blur:

  • горизонтальный проход;
  • вертикальный проход.

Такое разделение снижает вычислительную сложность с квадратичной до линейной относительно размера ядра.

Связь с моделью камеры CesiumJS

Камера CesiumJS определяет геометрию сцены в терминах:

  • положения (position);
  • направления взгляда (direction);
  • ориентации (orientation);
  • параметров проекции.

Depth of Field привязывается к этим параметрам, поскольку фокусная плоскость обычно располагается вдоль направления взгляда камеры. При изменении угла обзора или позиции камеры эффект перерасчитывается динамически.

Bokeh и художественные эффекты

Расширением базового размытия является эффект боке — характерное поведение светлых участков вне фокуса. В CesiumJS он моделируется через модификацию ядра размытия и нелинейную функцию распределения интенсивности.

Особенности реализации:

  • усиление ярких точек вне фокуса;
  • имитация формы диафрагмы (круг, многоугольник);
  • нелинейная агрегация сэмплов.

Боке усиливает визуальное разделение планов сцены и используется для акцентирования объектов.

Производительность и ограничения

Depth of Field относится к ресурсоёмким эффектам, так как требует:

  • чтения depth buffer;
  • нескольких проходов постобработки;
  • высокочастотного семплирования текстур.

Основные факторы нагрузки:

  • разрешение сцены;
  • размер kernel blur;
  • количество активных постэффектов.

Оптимизации обычно включают:

  • даунскейлинг буфера размытия;
  • ограничение радиуса blur;
  • адаптивное качество в зависимости от расстояния до камеры.

Взаимодействие с другими постэффектами

В CesiumJS Depth of Field часто комбинируется с другими стадиями:

  • bloom усиливает светящиеся области;
  • tone mapping корректирует динамический диапазон;
  • ambient occlusion добавляет контактные тени.

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

Поведение при изменении сцены

При динамическом движении камеры эффект требует постоянного пересчёта:

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

В сценах с большой глубиной (например, глобус или городская модель) разница между ближними и дальними объектами усиливает визуальную выразительность эффекта.