Глубина резкости (Depth of Field) в CesiumJS реализуется как постобработка изображения, имитирующая оптическое поведение камеры, при котором объекты вне зоны фокусировки теряют резкость. Эффект опирается на данные буфера глубины и применяется на этапе постпроцессинга сцены через цепочку шейдеров.
В классической оптике резкость изображения определяется расстоянием до плоскости фокуса. В трёхмерной графике аналогичный эффект достигается использованием depth buffer, в котором хранится расстояние от камеры до каждого фрагмента сцены.
Основная идея:
Математически размытие часто выражается через понятие circle of confusion (круг нерезкости), который увеличивается при удалении объекта от фокуса.
= }
где ( z ) — глубина пикселя, ( z_f ) — фокусная дистанция. На практике формула модифицируется под параметры камеры и ограничивается диапазоном, чтобы избежать чрезмерных значений размытия.
CesiumJS реализует глубину резкости через систему постпроцессинга
сцены, основанную на PostProcessStage. Эффект входит в
библиотеку стандартных стадий и может быть создан через
Cesium.PostProcessStageLibrary.
Ключевые элементы реализации:
Внутри графического пайплайна формируются два основных прохода:
Глубина резкости в CesiumJS настраивается через набор параметров, влияющих на физическую и визуальную модель камеры:
Фокусная дистанция обычно привязывается к позиции камеры или к выбранной точке интереса в сцене.
В CesiumJS постобработка организована как стек стадий, применяемых последовательно к изображению кадра. Depth of Field вставляется в этот стек после рендеринга геометрии и до финального вывода на экран.
Структура конвейера:
Depth of Field требует доступ к глубине сцены, поэтому включение depth texture является обязательным условием.
Размытие реализуется на GPU с использованием свёрточных ядер. В зависимости от расстояния до фокальной плоскости пиксель получает различный радиус размытия.
Типичная схема:
Для оптимизации применяется двухпроходный blur:
Такое разделение снижает вычислительную сложность с квадратичной до линейной относительно размера ядра.
Камера CesiumJS определяет геометрию сцены в терминах:
Depth of Field привязывается к этим параметрам, поскольку фокусная плоскость обычно располагается вдоль направления взгляда камеры. При изменении угла обзора или позиции камеры эффект перерасчитывается динамически.
Расширением базового размытия является эффект боке — характерное поведение светлых участков вне фокуса. В CesiumJS он моделируется через модификацию ядра размытия и нелинейную функцию распределения интенсивности.
Особенности реализации:
Боке усиливает визуальное разделение планов сцены и используется для акцентирования объектов.
Depth of Field относится к ресурсоёмким эффектам, так как требует:
Основные факторы нагрузки:
Оптимизации обычно включают:
В CesiumJS Depth of Field часто комбинируется с другими стадиями:
Порядок применения влияет на итоговое изображение, поскольку Depth of Field может размывать результаты предыдущих эффектов, включая световые ореолы и тени.
При динамическом движении камеры эффект требует постоянного пересчёта:
В сценах с большой глубиной (например, глобус или городская модель) разница между ближними и дальними объектами усиливает визуальную выразительность эффекта.