Cascaded Shadow Maps для больших сцен

Cascaded Shadow Maps (CSM) — это техника, используемая для создания качественных теней на больших сценах в реальном времени. В библиотеке Babylon.js эта технология применяется для улучшения качества теней при работе с большими и сложными игровыми мирами, где обычные методы отбрасывают тени нечетко или искажаются из-за большого расстояния между источником света и объектами.

Основные принципы

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

Разделение сцены на каскады

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

  1. Ближний каскад — имеет высокое разрешение текстуры, чтобы отбрасываемые тени были детализированными для объектов, находящихся рядом с камерой.
  2. Средний каскад — используется для объектов, находящихся на среднем расстоянии от камеры, и имеет более низкое разрешение.
  3. Дальний каскад — обрабатывает объекты на дальнем расстоянии, с еще меньшим разрешением.

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

Алгоритм работы CSM

  1. Проекция света: Для каждого каскада создается проекция от источника света на соответствующий фрагмент сцены.
  2. Генерация карты теней: Для каждого каскада создается своя текстура теней. Эта текстура проецирует тени объектов, расположенных в соответствующей зоне.
  3. Фильтрация: Каждый каскад имеет свои параметры фильтрации теней, что позволяет избегать размытости и артефактов на стыках каскадов.
  4. Смешивание каскадов: На этапе рендеринга сцены нужно правильно смешивать несколько карт теней, чтобы переход между ними был плавным и незаметным.

Реализация CSM в Babylon.js

Для реализации CSM в Babylon.js необходимо использовать несколько инструментов, таких как ShadowGenerator и CascadedShadowMap из библиотеки. Рассмотрим основные шаги для настройки этой технологии.

  1. Создание источника света:

    В Babylon.js CSM чаще всего применяется для источников света типа DirectionalLight. Это необходимо для создания естественного освещения, которое будет распространяться по всей сцене.

    const light = new BABYLON.DirectionalLight("dirLight", new BABYLON.Vector3(0, -1, 0), scene);
    light.position = new BABYLON.Vector3(0, 10, 0);
  2. Создание объекта CascadedShadowMap:

    Далее, необходимо создать объект CascadedShadowMap и назначить его источнику света.

    const shadowGenerator = new BABYLON.CascadedShadowMap(scene);
    shadowGenerator.setLightSource(light);
  3. Настройка параметров CSM:

    У объекта CascadedShadowMap можно настроить различные параметры, такие как количество каскадов, разрешение карт теней для каждого каскада и расстояние между ними.

    shadowGenerator.numCascades = 4;  // Число каскадов
    shadowGenerator.lambda = 0.8;     // Степень сглаживания переходов
    shadowGenerator.depth = 5000;     // Максимальная глубина рендеринга
    shadowGenerator.splitFrustum = true; // Использовать фрустрацию (разделение на каскады)

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

  4. Настройка объектов сцены:

    Для объектов, которые должны отбрасывать тени, необходимо установить свойство receiveShadows для материалов и castShadows для мешей.

    const sphere = BABYLON.MeshBuilder.CreateSphere("sphere", {diameter: 1}, scene);
    sphere.position = new BABYLON.Vector3(0, 1, 0);
    sphere.receiveShadows = true;
    
    const ground = BABYLON.MeshBuilder.CreateGround("ground", {width: 10, height: 10}, scene);
    ground.receiveShadows = true;
  5. Рендеринг сцены:

    В процессе рендеринга Babylon.js будет автоматически использовать все настройки CSM и генерировать соответствующие тени для объектов на основе их положения и расстояния от камеры.

Преимущества и недостатки

Преимущества:

  • Высокое качество теней в больших сценах с дальними объектами.
  • Эффективность использования ресурсов за счет разделения сцены на каскады, что позволяет уменьшить нагрузку на видеокарту.
  • Гибкость настроек для каждого каскада, что позволяет добиться оптимальных результатов для различных типов сцен.

Недостатки:

  • Сложность настройки: Правильная настройка параметров CSM требует внимательности и опытности, поскольку неправильное разделение каскадов или выбор параметров может привести к визуальным артефактам.
  • Влияние на производительность: Несмотря на улучшение качества, использование нескольких карт теней увеличивает нагрузку на GPU, особенно в сценах с большим количеством объектов.

Оптимизация и улучшение качества

Для повышения производительности и улучшения качества теней в Babylon.js можно использовать несколько методов:

  • Тени для дальних объектов: Для объектов, которые находятся далеко от камеры, можно использовать низкое разрешение карт теней, что уменьшает вычислительные затраты.
  • Адаптивная настройка каскадов: В зависимости от сцены можно адаптировать количество каскадов, чтобы динамически менять детализацию теней на основе характеристик сцены.
  • Использование фильтрации: Применение фильтрации теней (например, PCF — Percentage-Closer Filtering) помогает сгладить тени и устранить алиасинг.

Заключение

Технология Cascaded Shadow Maps в Babylon.js предоставляет мощный инструмент для улучшения качества теней в больших сценах. Благодаря динамическому управлению несколькими текстурами теней, CSM позволяет создавать реалистичные и высококачественные тени, которые адаптируются к разным частям сцены в зависимости от их удаленности от камеры. Несмотря на повышенные требования к вычислительным ресурсам, эта техника незаменима в приложениях, где важна детализированная проработка теней, таких как игры и симуляции с открытым миром.