← Назад к вопросам

Для чего нужен Frustum Culling?

2.0 Middle🔥 122 комментариев
#Оптимизация#Рендеринг и графика

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Назначение и принцип работы Frustum Culling

Frustum Culling (отсечение по пирамиде видимости) — это критически важная техника оптимизации в компьютерной графике, особенно в контексте разработки игр на Unity и других движках. Её основная цель — резкое сокращение количества объектов, отправляемых на рендеринг графическому процессору (GPU), путём исключения тех, которые гарантированно находятся за пределами поля зрения камеры. Это фундаментальный метод повышения производительности.

Основные задачи и преимущества

  • Снижение нагрузки на GPU: Современные GPU могут обрабатывать невероятное количество полигонов, но у них есть пределы. Рендеринг каждого объекта, даже невидимого, требует прохода через весь конвейер: вершинный шейдер, растеризацию, пиксельный шейдер и т.д. Frustum Culling предотвращает эти бесполезные вычисления.
  • Оптимизация вызовов отрисовки (Draw Calls): Каждый объект, использующий уникальный материал или проход, часто требует отдельного вызова отрисовки (SetPass call в Unity). Чем их меньше, тем меньше накладных расходов на взаимодействие CPU и GPU. Исключив невидимые объекты, мы снижаем их количество.
  • Экономия времени на освещение, постобработку и другие эффекты: Многие системы, такие как трассировка лучей в реальном времени (ray tracing), расчёты сложного освещения (например, в кадровом графе универсального рендера, URP/HDRP) или скрины буферы GBuffer, рассчитываются только для видимых объектов, если culling применён корректно.
  • Освобождение ресурсов для более важных задач: Сэкономленная производительность может быть направлена на увеличение детализации видимых объектов, добавление более сложных эффектов или увеличение частоты кадров (FPS).

Как это работает?

Пирамида видимости (Frustum) — это усечённая пирамида в 3D-пространстве, определяющая область, видимую камерой. Её границы формируются ближней (Near) и дальней (Far) плоскостями отсечения, а также углом обзора (Field of View, FOV).

Процесс Frustum Culling на каждом кадре включает:

  1. Расчёт текущей пирамиды видимости камеры в мировом пространстве.
  2. Проверка каждого рендерируемого объекта (Renderer). Для этого обычно используется его ограничивающий параллелепипед (Bounding Box или Bounds), а не точная геометрия. Это простая математическая проверка.
  3. Классификация объекта:
    *   Если **Bounding Box полностью внутри Frustum** -> объект видим, отправляется на рендеринг.
    *   Если **Bounding Box полностью снаружи Frustum** -> объект невидим, отбрасывается.
    *   Если **Bounding Box пересекает границу Frustum** -> объект частично видим, принимается к рендерингу.

Реализация в Unity и важные нюансы

В Unity базовый Frustum Culling является частью рендер-конвейера (Render Pipeline) и выполняется автоматически для всех объектов с компонентом Renderer (MeshRenderer, SkinnedMeshRenderer и т.д.). Система использует Renderer.bounds для проверок. Однако разработчик должен понимать ограничения:

  • Динамические объекты и точность Bounds: Если объект анимирован (например, персонаж) или деформируется, его Renderer.bounds может быть вычислен неточно (по умолчанию это статический AABB). Для скелетной анимации используйте SkinnedMeshRenderer. UpdateWhenOffscreen или SkinnedMeshRenderer.localBounds.
  • Occlusion Culling — следующий уровень: Frustum Culling не проверяет, закрыт ли объект другими объектами (например, стеной). Для этого в Unity существует отдельная, более сложная техника — Occlusion Culling, которую нужно настраивать вручную для статического уровня.
  • LOD Groups: Frustum Culling отлично работает совместно с системами уровней детализации (LOD). Объект может быть отброшен целиком или для него выбран подходящий LOD-уровень на основе его расстояния и размера в пирамиде видимости.
  • Кастомный culling: Для нестандартных случаев (например, огромных объектов по типу ландшафта или систем частиц) можно использовать слои камеры (Camera.cullingMask) или реализовать свою логику, отключая рендереры.
// Пример кастомной проверки Frustum Culling для одного объекта (иллюстрация)
using UnityEngine;

public class ManualFrustumCheck : MonoBehaviour
{
    private Camera mainCamera;
    private Renderer objectRenderer;

    void Start()
    {
        mainCamera = Camera.main;
        objectRenderer = GetComponent<Renderer>();
    }

    void Update()
    {
        // Получаем плоскости пирамиды видимости текущей камеры
        Plane[] frustumPlanes = GeometryUtility.CalculateFrustumPlanes(mainCamera);

        // Выполняем проверку Bounds объекта против плоскостей
        if (GeometryUtility.TestPlanesAABB(frustumPlanes, objectRenderer.bounds))
        {
            // Объект потенциально видим (внутри или пересекает)
            Debug.Log(gameObject.name + " is INSIDE the frustum.");
        }
        else
        {
            // Объект гарантированно невидим
            Debug.Log(gameObject.name + " is OUTSIDE the frustum.");
        }
    }
}

Вывод

Frustum Culling — это не опциональная "фича", а базовая и обязательная оптимизация, встроенная в ядро Unity. Её эффективность напрямую влияет на частоту кадров, особенно в сценах с большим количеством геометрии. Понимание принципов её работы позволяет разработчику избежать типичных ошибок (некорректные Bounds, игнорирование Occlusion Culling для сложных сцен) и создавать плавно работающие проекты даже на мобильных платформах или в VR/AR, где требования к производительности исключительно высоки. Это первый и самый грубый фильтр в цепочке оптимизации видимости.

Для чего нужен Frustum Culling? | PrepBro