Динамическое освещение в Unreal Engine 4
Некорректное качество теней
В данной части статьи мы рассмотрим решения, направленные на улучшение качества теней соответствующих геометрии. Это также поможет улучшить качество динамических теней.
Пример некорректного затенения геометрии.
Только! для Directional Light : Настройки Cascaded Shadow Maps:

Cascaded Shadow Maps настройки, в Directional Light Details
Dynamic Shadow Distance Movable: Расстояние от камеры, на котором тени будут исчезать.Значение 0 отключает их.
Dynamic Shadow Distance Stationary: Расстояние от камеры, на котором тени будут исчезать.По умолчанию стоит 0 для Directional Stationary Lights.
Num Dynamic Shadow Cascades: Количество каскадов на которое будет делится фрустум.Больше каскакодов- лучше качество, но и ресурсоёмкость возрастает.
Обязательно тыкните в ссылочку ниже, ибо наверняка не все знают что такое фрустум.
Больше информации про фрустум: http://en.wikipedia.org/wiki/Viewing_frustum
Num Dynamic Shadow Cascades :

Количество каскадов = 0

Количество каскадов = 1

Количество каскадов = 2

Количество каскадов = 3

Количество каскадов = 4
Cascade Distribution Exponent: Параметр регулирующий, на каком расстоянии от камеры распределение ближе (выше значение) или дальше (меньше значение) от камеры. Значение 1 означает, что переход будет пропорционален разрешению экрана.
Cascade Distribution Exponent:

Распределение = 1

Распределение = 2

Распределение = 3

Распределение = 4
Cascade Transition Exponent: Параметр регулирующий затухающий регион между каскадами. Низкое значение даст жёсткие грани, высокое — мягкие.
Cascade Transition Exponent:

Эффект перехода
Cascade Transition Exponent
Shadow Distance Fadeout Fraction: Параметр регулирующий на каком расстоянии тени будут затухать. Высокое значение ослабляет тени, в то время как низкое значение оставляет тени тёмными.
Shadow Distance Fadeout Fraction:

Затухание = 0

Затухание = 1
Far Shadow
Возможность установки Far Shadow для статических мешей или ландшафта дает дополнительные преимущества в том, дабы иметь возможность использовать каскадные тени на очень дальних расстояниях, а не в ограниченном диапазоне, ближайшему к камере.

Для включения данной опции достаточно лишь поставить галочку в пунктике Far Shadow во вкладке Lightning в настройках Directional Light.

Вы можете указать количество каскадов для Far Shadow, чтобы объекты у которых включено Far Shadow учитывали данный параметр. По умолчанию значение равно 300 метрам, но должно быть больше чем значение у параметра Cascaded Shadow Map Distance.
Не забывайте, что данную фичу рекомендуется использовать только на больших объектах, а не на всех подряд, т.к. при включении данной опции на всех подряд объектах это приведёт к снижению производительности.

На гифке выше: у объекта слева выключено Far shadow, а объект справа имеет параметры Dynamic Shadow Distance = 5000 и far shadow distance = 50000 при 4 каскадах.
Регулирование Cascades для лучшего качества:
Просачивание теней и их точность, можно настроить с регулированием параметров указанных выше. Данный раздел покажет как лучше настроить параметры, чтобы получить наилучший результат в момент приближения и отдаления камеры. Нахождение баланса для каждой отдельной игры — путь проб и ошибок без которого нельзя обойтись.
Базовая сцена с одними лишь настройками по умолчанию:

Базовая сцена дефолтные настройки
Тут у нас уже есть некоторые проблемы с точностью теней на гранях объектов.

Проблемные зоны выделены красными рамками
Демонстрация проблемы, с близкого ракурса.

Проблемные зоны, вид поближе
Сфокусируем внимание на минимизации просветов теней, в пределах разумного. По умолчанию, дистанция динамических теней установлена в 20000 единиц. Данное значение не всегда обязательно и может быть изменено в большую или меньшую сторону.
В этой сцене настройки распределения, дистанции теней и количество каскадов просветов и их точность — на приемлемом уровне.

Базовая сцена финальный результат
Всё динамическое освещение (панель настройки освещения):
Также имеются ещё 2 настройки которые могут улучшить точность освещения.
Местонахождение этих настроек:

Те самые 2 параметра - Shadow Bias и Filter Sharpness
Shadow Bias — контролирует точность теней в сцене, но может выдать артефакты, если значение будет слишком низким.По умолчанию стоит значение 0.5 которое даёт хороший результат между точностью и эффективность.
Shadow Filter Sharpness — помогает скрыть некоторые артефакты при низких значениях и помогает создавать более резкие тени на краях.
Принимая во внимание то, что предыдущие настройки не были применены для текущих примеров, то ниже идут 2 примера с демонстрацией этих параметров (Shadow Bias и Shadow Filter Sharpen):
Shadow Bias

Shadow Bias = 0.5 (Дефолтное значение)

Shadow Bias = 0, установлено слишком низкое значение и поэтому появляются артефакты
Решение данной проблемы — нахождение баланса между установкой не слишком низкого значения и подбором нужного значения в Cascaded Shadows.
Shadow Filter Sharpen — делает края тени более резкими при высоких значениях.
Filter Sharpen = 0
Filter Sharpen = 1
Высокое значение параметра даёт резкий край тени, низкое- плавный край тени.
Почему мой динамический источник света светится сквозь объекты на отдалении?
Динамическое освещение , в частности точечные ИС, могут создавать проблемы такого рода. UE 4 достаточно хорошо справляется с подобной оптимизацией, поэтому вам не стоит сильно об этом волноваться. Но иногда возникает подобная проблема и метод её решения не всегда очевиден.
Результат который мы хотим. Камера вблизи.
Что получается в итоге. Камера в отдалении.
Что же делать?
Чтобы понять что происходит, нужно учитывать, что движок использует глубину сцены, дабы определить, что будет видимым и что будет невидимым при рендере. Тут же мы имеем точечный источник света который испускает свет по всему радиусу до тех пор пока не встретит преграду или пока не столкнётся с границей сферы.
На картинке ниже вы можете наблюдать, как при отдалении камеры появляется halo эффект вокруг внешних граней объекта из-за того, что свет не встречает преград на своём пути и исходит во всех направлениях.

Проход света сквозь объект.
Вы можете заметить, что если вы на дистанции выберете/выделите такой объект, то освещение вернётся в нормальное состояние. Это объясняется тем, что вы сфокусировались в данный момент на данном объекте.
Дабы предохранить объект от пропускания света, вам нужно выделить объект, и перейти на панель Details. Тут вам нужно найти во вкладке Rendering, параметр Bounds Scale.

Местонахождение Bounds Scale
По умолчанию значение установлено в 1.0 . Увеличивайте данный параметр на небольшие значение (1.1, 1.2 и тд.). Используя значение = 2 , оно удваивает дистанцию которая может стать излишней. Нет необходимости использовать значение больше необходимого, так как это может повлиять на производительность и качество теней.
Вы можете увидеть/визуализировать границы вашего меша перейдя во вьюпорте > Show > Advanced > Bounds
Увидите нечто такое:

Визуализированные границы объекта.
Дополнительная заметка:
Если у вас есть вышеописанная проблема, но вы не хотите увеличивать размеры границ вашего меша из-за проблем с производительностью — попробуйте использовать Spotlight. Данный ИС пускает свет лишь в одном направлении, в отличии от point light который пускает свет по всем направлениям когда меш пропускает свет. Пусть это и возымеет некоторый положительный/требуемый эффект, но лишь методом проб и ошибок вы сможете добиться идеального решения.
Как вариант, мы можете попробовать использовать Стационарное освещение, а не динамическое, это позволит вам запечь тени, что в итоге сохранит производительность, и не потребует каждый раз обновлять информацию о тенях.
Если вам требуется найти макросы для Rust вы можете найти их здесь doomxtf.com/macrolibrary/macro-rust.html.
Дата размещения: 4-11-2019, 10:46
- Раздел: Советы на все случаи жизни