Cascaded Shadow Maps (CSM) — это техника, используемая для создания качественных теней на больших сценах в реальном времени. В библиотеке Babylon.js эта технология применяется для улучшения качества теней при работе с большими и сложными игровыми мирами, где обычные методы отбрасывают тени нечетко или искажаются из-за большого расстояния между источником света и объектами.
CSM основывается на делении сцены на несколько фрагментов (каскадов), каждый из которых отображается с различной степенью детализации. В отличие от традиционных методов, где используется одна текстура теней для всей сцены, CSM использует несколько текстур теней с различными разрешениями и диапазонами. Это позволяет достичь качественных теней вблизи камеры и уменьшить артефакты на дальних расстояниях.
Процесс деления сцены на каскады начинается с того, что камера, как правило, имеет несколько зон видимости (например, ближнюю, среднюю и дальнюю), которые обрабатываются разными текстурами теней. Каждая из этих зон получает свою текстуру тени с разной степенью детализации:
Эта техника улучшает производительность, потому что текстуры теней для объектов, находящихся далеко от камеры, не требуют такого высокого разрешения, как для объектов вблизи.
Для реализации CSM в Babylon.js необходимо использовать несколько
инструментов, таких как ShadowGenerator и
CascadedShadowMap из библиотеки. Рассмотрим основные шаги
для настройки этой технологии.
Создание источника света:
В 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);Создание объекта CascadedShadowMap:
Далее, необходимо создать объект CascadedShadowMap и
назначить его источнику света.
const shadowGenerator = new BABYLON.CascadedShadowMap(scene);
shadowGenerator.setLightSource(light);Настройка параметров CSM:
У объекта CascadedShadowMap можно настроить различные
параметры, такие как количество каскадов, разрешение карт теней для
каждого каскада и расстояние между ними.
shadowGenerator.numCascades = 4; // Число каскадов
shadowGenerator.lambda = 0.8; // Степень сглаживания переходов
shadowGenerator.depth = 5000; // Максимальная глубина рендеринга
shadowGenerator.splitFrustum = true; // Использовать фрустрацию (разделение на каскады)
Параметры numCascades и lambda отвечают за
количество каскадов и сглаживание перехода между ними.
splitFrustum помогает задать зоны видимости для каждого
каскада, что увеличивает качество теней в зависимости от расстояния до
камеры.
Настройка объектов сцены:
Для объектов, которые должны отбрасывать тени, необходимо установить
свойство 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;Рендеринг сцены:
В процессе рендеринга Babylon.js будет автоматически использовать все настройки CSM и генерировать соответствующие тени для объектов на основе их положения и расстояния от камеры.
Преимущества:
Недостатки:
Для повышения производительности и улучшения качества теней в Babylon.js можно использовать несколько методов:
Технология Cascaded Shadow Maps в Babylon.js предоставляет мощный инструмент для улучшения качества теней в больших сценах. Благодаря динамическому управлению несколькими текстурами теней, CSM позволяет создавать реалистичные и высококачественные тени, которые адаптируются к разным частям сцены в зависимости от их удаленности от камеры. Несмотря на повышенные требования к вычислительным ресурсам, эта техника незаменима в приложениях, где важна детализированная проработка теней, таких как игры и симуляции с открытым миром.