Настройка динамических теней и отражений графики
Динамические тени и отражения — самые прожорливые части рендер-пайплайна по GPU-времени. Настроить их «по умолчанию» не получится: каждый проект требует своего баланса между качеством и производительностью. На мобильном устройстве 2-мегапиксельный Shadow Map для одного Directional Light — это катастрофа. На десктопе отсутствие Screen Space Reflections в шутере от первого лица бросается в глаза сразу.
Тени: где теряется производительность
Shadow Casting работает через дополнительный рендер-проход — Shadow Caster Pass. Каждый объект, входящий в зону видимости тени, рендерится повторно с depth-шейдером в Shadow Map текстуру. Чем больше источников с тенями, тем больше дополнительных проходов.
Самое болезненное — Spot Light или Point Light с включёнными Shadow Casting на мобильных платформах. Point Light рендерит Shadow Map в виде cubemap — 6 граней, 6 рендер-проходов для одного источника. На сцене с 5 такими источниками это 30 дополнительных рендер-проходов каждый кадр. На мобильных устройствах это не влезает в 16-ms бюджет.
Практический подход: оставляем Shadow Casting только на Directional Light (основной направленный источник), Point и Spot Lights переводим в режим без теней и компенсируем их отсутствие через Blob Shadow проектор или Decal с мягкой тенью под персонажем. Игрок не замечает, что тень «ненастоящая», если её форма правдоподобна.
Для Shadow Distance критически важно выставить адекватное значение. В Unity это Quality Settings → Shadow Distance. Типичная ошибка — оставить дефолтные 150 единиц для мобильного проекта с видом сверху, где дальняя видимость — 30 единиц. Всё лишнее за этим расстоянием Unity всё равно рендерит в Shadow Map, но никогда не показывает.
Shadow Cascades для Directional Light
Directional Light с одним Shadow Map без каскадов даёт либо детальные тени вблизи при потере качества вдали, либо охватывает всю дальность при низком разрешении вблизи. Shadow Cascades делят Shadow Map на зоны: ближняя зона получает высокое разрешение, дальняя — низкое.
Для PC-проектов 4 каскада — стандарт. Для мобильных — 2 каскада максимум, а лучше 1 с небольшим Shadow Distance. Распределение каскадов (Cascade Split) по умолчанию в Unity равномерное, но лучше работает логарифмическое: 0.05 / 0.15 / 0.35 — большая часть разрешения Shadow Map уходит на первые метры перед камерой, где детализация тени заметнее всего.
Shadow Normal Bias и Shadow Bias — параметры, которые определяют, есть ли «тенеакне» (shadow acne, полосатые артефакты самозатенения) или «летающие тени» (peter panning, тени оторваны от объектов). Normal Bias 0.4, Bias 0.05 — отправная точка для большинства сцен. Для тонких объектов (листья, решётки) Normal Bias нужно снижать до 0.1–0.2, иначе тень исчезает полностью.
Отражения: Screen Space vs Probe-based
Screen Space Reflections (SSR) — постпроцессинговый эффект, работающий только с тем, что находится в кадре. Дёшево и убедительно для горизонтальных поверхностей (пол, вода), но ломается на краях экрана и не показывает то, что находится за камерой. В HDRP настраивается через Volume → Screen Space Reflection, ключевой параметр — Minimum Smoothness (поверхности ниже этого значения не получают SSR, что правильно — матовые поверхности не отражают).
Reflection Probes работают везде, где SSR не справляется: вертикальные поверхности, отражение потолка в полу, интерьеры. Baked Reflection Probe — снимок кубической панорамы в конкретной точке пространства, запечённый заранее. Realtime Reflection Probe пересчитывается во время игры.
Проблема Baked Probes — статичность. Если в сцене есть анимированные объекты (флаги, вода, персонажи), они не попадают в отражение. Компромисс: Realtime Probe с Refresh Mode On Awake для объектов, которые меняются редко (открывающаяся дверь), и Baked для всего остального.
Box Projection — обязательная настройка для интерьеров. Без неё Reflection Probe ведёт себя как бесконечно удалённый источник, и отражение не совпадает с реальной геометрией комнаты. С Box Projection и правильно настроенным Box Size зеркало на стене будет показывать корректную перспективу.
Кейс: вода с отражением на мобильном устройстве
На проекте с изометрическим видом требовалась река с правдоподобными отражениями на Android. SSR — недоступен (OpenGL ES 3.0 на целевых устройствах плохо переваривает postprocess stack). Baked Reflection Probe давал статичную картинку без неба.
Решение: кастомный шейдер воды на ShaderGraph с искажением UV через Normal Map (имитация волнения) + Reflection Probe в Realtime режиме с Refresh Mode Every Frame, но с очень низким Shadow Resolution (128×128) — он отражал только небо и горизонт. Для динамических объектов (лодки) добавили Planar Reflection Camera — отдельная камера рендерит сцену с перевёрнутой Y-осью в Render Texture, которую шейдер воды смешивает с Reflection Probe через Fresnel-зависимость. Результат выглядел убедительно при стоимости одного дополнительного рендер-прохода в 60% разрешении.
Диагностика и инструменты
Frame Debugger разбирает Shadow Caster Pass по каждому источнику — сразу видно, кто «жрёт» время. GPU Usage в Profiler показывает мс на каждый рендер-проход с Shadow Casting.
Для Reflection Probes — Rendering Debugger в режиме просмотра Reflections → Probe Volume: видно, какой зонд влияет на конкретную поверхность и корректен ли Box Projection.
| Задача | Сроки |
|---|---|
| Настройка теней для одной сцены (PC/console) | 1–3 дня |
| Настройка теней с оптимизацией под мобильные | 3–7 дней |
| Reflection Probes для комплекса интерьеров | 3–5 дней |
| Полный пайплайн теней + отражений, несколько платформ | 2–4 недели |
Стоимость рассчитывается индивидуально после анализа рендер-пайплайна и целевых платформ.





