Тени — важная часть визуального оформления в 3D-графике, создающая ощущение глубины и объема сцены. В PlayCanvas динамические тени используются для симуляции взаимодействия объектов со светом в реальном времени. При этом важно настроить тени таким образом, чтобы они выглядели правдоподобно и не оказывали сильной нагрузки на производительность. В этой статье рассмотрены ключевые аспекты работы с динамическими тенями в PlayCanvas: каскады (Cascades), мягкость (Softness) и смещение (Bias).
Cascaded Shadow Maps (CSM) — это техника, при которой для разных дальностей от камеры используются карты теней с разной разрешающей способностью. Цель такой технологии — улучшить качество теней, особенно в области, расположенной ближе к камере, где детали должны быть более четкими. Cascades делят пространство на несколько фрагментов, для каждого из которых рассчитываются отдельные карты теней.
В PlayCanvas эта технология реализована с помощью
shadowCascade в настройках источников света, таких как
солнечные лучи (Directional Light). Каскады можно использовать для
динамических теней, чтобы повысить детализацию в ближайших областях и
снизить нагрузку на систему на дальнем фоне.
Каждому каскаду можно задать разные настройки разрешения, а также указать, какие участки сцены должны освещаться с более высокой точностью. В реальных проектах часто используется 2–4 каскада, что позволяет сбалансировать между производительностью и качеством теней.
Мягкость теней определяется тем, как границы теней расплываются и
становятся менее резкими. В реальной жизни тени редко бывают четкими,
особенно от больших источников света, таких как солнце. Для создания
более естественного визуального эффекта в PlayCanvas можно регулировать
мягкость теней с помощью параметра shadowSoftness.
Чем выше значение shadowSoftness, тем более размытой
будет тень. Этот параметр влияет на видимость тонких деталей, так как
тень будет смазываться. В то же время это также может снизить нагрузку
на графический процессор, поскольку для размытой тени не нужно вычислять
все мелкие детали.
Для идеальных визуальных результатов часто комбинируют каскады с настройками мягкости. Например, в области, расположенной ближе к камере, можно использовать резкие тени с малой мягкостью, чтобы подчеркнуть объекты, тогда как на дальнем фоне тени можно размягчить, чтобы создать ощущение большей глубины.
Тень может выглядеть неестественно из-за эффекта, называемого “shadow
acne” или “peter panning”. Это возникает, когда тень выглядит как
неаккуратное пятно или плавает в воздухе, не будучи точно привязанной к
объекту. Чтобы исправить такие проблемы, используется параметр
bias, который позволяет немного сдвигать расчет теней,
чтобы избежать этих артефактов.
Bias позволяет корректировать тень, смещая ее на несколько единиц по оси, обычно по оси нормалей, в сторону от поверхности. Этот параметр важен для устранения нежелательных явлений, таких как “peter panning”, когда тени оказываются слишком далеко от объектов.
Однако нужно быть осторожным при установке значения смещения, поскольку слишком большое значение bias может привести к исчезновению теней на объекте. Это также может создать новую проблему — исчезновение теней на внутренних поверхностях объектов.
Для создания качественных динамических теней в 3D-сценах PlayCanvas важно учитывать все три аспекта — каскады, мягкость и смещение. Использование каскадов улучшает точность теней в области, где камера находится ближе, а также снижает вычислительные затраты на дальние участки сцены. Мягкость помогает смягчить края теней и сделать их более естественными, в то время как bias позволяет избежать артефактов и “плавающих” теней.
Важно помнить, что настройка этих параметров должна быть сбалансирована с производительностью. Слишком много каскадов или высокая мягкость могут заметно снизить производительность, особенно на слабых устройствах. Поэтому нужно всегда тестировать сцену на разных платформах и в разных условиях, чтобы добиться наилучшего баланса между качеством и производительностью.
Настройка этих параметров в PlayCanvas может происходить через API, доступное в компонентах источников света. Например, для солнечного света можно задать параметры каскадов и смещения следующим образом:
const light = new pc.LightComponent(entity);
light.type = pc.LIGHTTYPE_DIRECTIONAL;
light.shadowBias = 0.05; // Устанавливаем смещение
light.shadowSoftness = 0.5; // Настройка мягкости
light.shadowCascadeCount = 4; // Использование четырех каскадов
Таким образом, через PlayCanvas можно гибко управлять качеством динамических теней, создавая реалистичные и производительные сцены.
Динамические тени, особенно с использованием нескольких каскадов и высокой мягкости, могут требовать значительных вычислительных ресурсов. Чтобы оптимизировать производительность, можно:
Оптимизация теней должна быть частью общего процесса создания сцены, где необходимо учитывать баланс между качеством визуализации и производительностью.