В WebGL-движках глобальной визуализации критически важна минимизация количества отрисовываемой геометрии. CesiumJS использует многоуровневую систему отсечения (culling), сочетающую геометрическое, пространственное и экранное отбрасывание объектов до стадии рендеринга.
Отсечение в CesiumJS строится вокруг нескольких ключевых уровней:
Эти механизмы работают совместно и формируют каскадную фильтрацию сцены.
Основной этап отсечения выполняется через проверку попадания bounding volumes в усечённую пирамиду камеры.
Cesium использует несколько типов ограничивающих объёмов:
Каждый кадр камера формирует CullingVolume, представляющий шесть плоскостей:
Проверка выполняется для каждого объекта сцены:
Ключевой оптимизацией является использование сферических bounds для быстрых проверок:
distance(camera, center) > radius → cull
Сферы дешевле в вычислении, поэтому используются как первичный фильтр.
В случае работы с 3D Tiles основная нагрузка приходится на дерево
тайлов (Cesium3DTileset). Отсечение выполняется на уровне
узлов дерева.
Каждый тайл содержит:
Алгоритм проходит по дереву сверху вниз:
Если узел не проходит frustum test — все дочерние узлы автоматически исключаются без проверки.
Это называется hierarchical culling by bounds propagation.
Одним из ключевых механизмов является screen space error (SSE). Он определяет, насколько сильно геометрия “теряет качество” при текущем масштабе экрана.
Формально оценивается как проекция геометрической ошибки на экран:
Если SSE меньше заданного порога
(maximumScreenSpaceError), тайл не subdivide-ится и
остальные ветви дерева отсекаются.
Таким образом, culling происходит не только по видимости, но и по “достаточности детализации”.
На уровне WebGL применяется классическое отсечение обратных граней:
В CesiumJS это управляется через материалы и настройку WebGL контекста:
cullFace: truefrontFace: CCWBackface culling особенно важен для:
При неправильной топологии отключение culling может привести к двойной отрисовке и падению производительности.
В отличие от классического frustum culling, occlusion culling учитывает перекрытие объектов другими геометриями.
CesiumJS не использует полноценный GPU occlusion query для всех объектов, но применяет приближённые методы:
Особенно эффективно это работает с:
Дополнительно используется:
gl.depthTest на уровне материаловglobe.depthTestAgainstTerrainПоследний параметр позволяет скрывать объекты, находящиеся под рельефом.
Гео-глобус в CesiumJS сам по себе является источником отсечения:
Алгоритм включает:
Это позволяет игнорировать огромные сегменты планеты без дополнительных вычислений.
Дополнительный слой отсечения основан на расстоянии до камеры.
Применяется для:
Основные критерии:
distanceDisplayCondition)Пример логики:
Этот механизм особенно важен для предотвращения визуального шума при глобальном обзоре.
Каждый primitive в Cesium проходит собственный pipeline отсечения:
Ключевые типы primitives:
PrimitiveGroundPrimitiveClassificationPrimitiveModelДля каждого применяется свой набор bounding volumes и стратегий проверки.
Особое внимание уделяется GroundPrimitive, так как он
должен учитывать рельеф и пересечения с terrain.
Classification primitives используют отдельный pipeline, где отсечение происходит не только по видимости, но и по типу поверхности:
В этом режиме объект может быть “видим”, но исключён из рендера, если не соответствует типу классификации.
Это добавляет дополнительный уровень логического culling.
В больших tileset структурах применяется:
skipLevelOfDetailimmediatelyLoadDesiredLevelOfDetailloadSiblingsЭти параметры влияют на culling traversal:
В результате уменьшается CPU overhead на сценах с миллионами тайлов.
Culling в CesiumJS разделён между CPU и GPU:
Такое разделение снижает нагрузку на JavaScript и обеспечивает масштабируемость.
Эффективность системы отсечения зависит от:
Наиболее критичные узлы оптимизации:
maximumScreenSpaceErrorВсе виды culling в CesiumJS работают как единая система:
Результат — многослойная фильтрация, где каждый следующий уровень работает на всё меньшем объёме данных.