Выделение контура у объекта в UE4. Освещение для архитектурной визуализации в UE4.18 для VR

Epic Games продемонстрирует архитекторам возможности Unreal Engine

Unreal Engine 4 изначально создавался для разработки игр, но Epic Games хочет показать, что он подходит и для других задач. С этой целью компания проведёт серию вебинаров, в которых покажет возможности движка как инструмента визуализации для архитекторов.

Дизайнерскую идею зачастую непросто продемонстрировать. Раньше архитекторы использовали рисунки и уменьшенные модели, но программное обеспечение вроде Unreal Engine может позволить перемещаться по фотореалистичным зданиям с естественным освещением. А благодаря виртуальной реальности люди могут в буквальном смысле оказываться в местах, которых пока ещё не существует.

Epic Games планирует провести четыре бесплатных вебинара, первый из которых намечен на 27 апреля. Специальным гостем станет архитектор Фабрис Боррелли (Fabrice Bourrelly), который расскажет о причинах, по которым Unreal Engine стоит использовать в данной сфере. .

Используя модели Дома из стекла Филиппа Джонсона (Philip Johnson) и Церкви света Тадао Андо (Tadao Ando), Фабрис покажет, как Unreal Engine привносит эмоции, настроение и атмосферу рендеринга в автономном режиме в глубокую и интерактивную виртуальную и дополненную реальность в режиме реального времени, - сказал представитель сообщества движка Крис Руффо (Chris Ruffo). - Фабрис является архитектором, художником и 3D-визуализатором, который за последний год стал лидирующим пользователем и учителем по Unreal Engine. В список клиентов Фабриса входят Google, IDEO, Томас Хизервик (Thomas Heatherwick), Аниш Капур (Anish Kapoor), Bentley Motors и Филипп Старк (Philippe Starck).


Боррелли начал работать с Unreal Engine не так давно. В прошлом году он провёл лекцию по визуализации и обнаружил, что огромное число людей, работающих в сфере, хотели бы узнать больше о движке и исследовании моделей виртуальной реальности. Так он решил скачать программное обеспечение и опробовать его.

Фабрис Боррелли:

«Я начал с простого коридора, освещённого снаружи, и одного материала. Это позволило мне почувствовать, как один материал будет вести себя с отражениями и освещением. Я научился создавать мягкое освещение с помощью Lightmass, что является критичным для построения реалистичной архитектурной визуализации».

Архитектор загружает свои работы на канал в YouTube .

Несмотря на кажущуюся сложность работы, редактор Unreal Editor 4 выглядит приветливым. А с ростом производительности компьютерного оборудования GPU рендер может изменить традиционный подход к работе визуализаторов, дизайнеров и архитекторов.

Из минусов хочу отметить пару моментов. На данный момент добиться фотореалистичной картинки не просто, но если уйти в проект с головой и потратить больше времени, то можно .Размер готового билда может превышать 1GB, что может затруднить обмен среди коллег и заказчиков. На текущее время далеко не каждый компьютер способен выдать стабильные 25-30 FPS в заполненном 100 м² интерьере.

Это интерактивная трехмерная визуализация квартиры-студии с полным погружением в проект. Модель сделана полностью в программе Unreal Engine 4 - движок, который используют во многих современных играх.

Основное различие с максовской 3д моделью - время "рендера". Например, чтобы создать классический трехмерный ролик необходимо отрендерить 25 кадров для каждой секунды, что занимает очень много времени и денег.

А в таком интерактивном формате "рендер" отсутствует. Все текстуры, материалы и свет создаются сразу в 3d модели, поэтому по проекту сразу можно ходить как в игре, при этом графика дошла до вполне реалистичного уровня. Теперь, чтобы сделать видео ролик, достаточно 1 часа, при готовой модели в Unreal Engine.

Создано: 29 Апрель 2017

Динамическое (Подвижное) Освещение

Некорректное качество теней


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

Пример некорректного затенения геометрии.

Только! для 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: Количество каскадов на которое будет делится фрустум.Больше каскакодов- лучше качество, но и ресурсоёмкость возрастает.
Внимание! обязательно тыкните в ссылочку ниже, ибо наверняка не все знают что такое фрустум.

Количество каскадов = 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 Cascade Count: Coming in 4.8. More information to follow soon.
Far Shadow Distance: Coming in 4.8. More information to follow soon.

Регулирование 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


Высокое значение параметра даёт резкий край тени, низкое- плавный край тени.

Почему мой подвижный источник света светится сквозь меш на дистанции?


Динамическое освещение, в частности точечные ИС,могут создавать проблемы такого рода.Unreal Engine 4 достаточно хорошо справляется с подобной оптимизацией, поэтому вам не стоит сильно об этом волноваться.Но иногда возникает подобная проблема и метод её решения не всегда очевиден.

Результат который мы хотим.Камера в близи.

Что получается в итоге.Камера в отдалении.

Что же делать?

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

На картинке ниже вы можете наблюдать, как при отдалении камеры появляется halo эффект вокруг внешних граней меша из-за того, что свет не встречает преград на своём пути и исходит во всех направлениях.

Проход света сквозь меш

Вы можете заметить, что если вы на дистанции выберете/выделите такой меш, то освещение вернётся в нормальное состояние.Это объясняется тем, что вы сфокусировались в данный момент на данном меше.

Местонахождение Bounds Scale

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

Вы можете увидеть/визуализировать границы вашего меша перейдя во вьюпорте > Show > Advanced > Bounds

Увидите нечто такое:

Визуализированные границы объекта.

Дополнительная заметка:

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

Как вариант, мы можете попробовать использовать Стационарное освещение, а не динамическое/подвижное, это позволит вам запечь тени, что в итоге сохранит производительность,и не потребует каждый раз обновлять информацию о тенях.

Alternatively, you could forego a fully movable/dynamic light and use a stationary light that bakes a lightmap texture, which can also save on performance by having zero overhead during runtime for rendering shadow information.

Статическое освещение


Разрешение лайтмапы /Качество теней


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

Простенькая сцена с 3 статическими мешами.

В данной сцене 3 объекта: 2 стены и пол.Каждый объект имеет собственную тень, которая запечена в текстуру именуемую — лайтмапой (lightmap).Данная лайтмапа хранит в себе информацию о тенях/освещении, которые проецируются на эту текстуру.Она, как правило, создаётся художником в процессе создания ассета.
Что нужно знать про лайтмапы и как их эффективно создавать?

Другими словами, если я хочу увеличить разрешение тени отбрасываемой стеной с дверным проёмом,я буду настраивать не стену с дверным проёмом, а увеличу разрешение лайтмапы пола.Там куда проецируется тень и запекается в лайтмапу.

Теперь нам надо увеличить разрешение лайтмапы для некоторых мешей.Каждый меш имеет свою собственную лайтмапу, разрешение которой можно установить в details panel, когда наш меш выбран в mesh editor.

В данном примере рассматриваем разрешение лайпмапы пола, и только его.
Когда изменяете разрешение лайтмапы, используйте значения только кратные двум (32(по умолчанию),64,128,и т.д.) за исключением BSP представленных ниже.

Качество разрешения лайтмапы зависит от двух факторов: размер меша и размер UV шела на развёртке лайтмапы.

Разрешение = 64

Разрешение = 128

Разрешение = 256

Разрешение = 512

Разница лайтмапы BSP от статического меша в том, что значение лайтмапы BSP уменьшается в пользу лучшего качества.

Resolution = 32

Resolution = 24

Resolution = 16

Resolution = 8

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

Что такое Overlapping UV
Когда используете статическое или стационарное освещение, необходимо использовать 2 развёртки, иначе вы получите такое сообщение:

Лог после запекания освещения

В данном случае вам надо установить 2й канал развёртки для вашей лайтмапы. В противном случае редактор будет использовать имеющуюся развёртку со всеми имеющимися ошибками.
Вы можете сделать это прямо в редакторе (картинка ниже) либо же с вашем 3d редакторе.

Оригинальные UV и результаты

Перекрывающиеся UVs

Результат в редакторе

Правильные UV и результаты

Правильные UVs

Результат в редакторе

Заметьте, что финальные UV не имеют перекрытий что даёт теням/свету правильно запечся в текстуру.

Как сгенерировать UV в редакторе

Откройте меш, лайтмапу которого ваш нужно отредактировать.
Найдите панельку похожую на эту:

Generate Lightmap UVs = удостоверьтесь в том, что данная галочка стоит.
Min Lightmap Resolution =Минимальный размер разрешения лайтмапы которое вы хотите.
Source Lightmap Index = Источник с которого генерируем лайтмапу
Destination Lightmap Index = Индекс развёртки которую мы хотим использовать в качестве лайтмапы.

Для большинства ассетов это достаточно хорошие настройки.Ключевой момент тут- выбор нужного индекса источника лайтмапы.Это UV который обычной используют для текстур.UV шелы в этой UV будут перепакованы, и не будут образовывать перекрытия поверхностей.Разрешение лайтмапы не влияет на качество развёртки, этот параметр влияет лишь на качество теней которые будут запекаться на эту развёртку.Если вы хотите проверить, какая у вас получилась развёртка после генерации, выберите UV channel 1 (показано на картинке):

Редактор статик мешей, выбор UV Channel

Теперь, после генерации лайтмап UV, осталось выбрать нужный id в настройках самого меша.
В редакторе меша перейдите в details panel, во вкладку “Static Mesh Settings”

В этой вкладке нужно установить разрешение лайтмапы которое нам нужно.
32 — дефолтное разрешение.для маленьких объектов оно вполне подходит, но чем больше объект, тем больше разрешение нужно указывать.
Удостоверьтесь, что значение кратно 2 (пример: 32, 64, 128, 256, и тд.)
В следующем параметре, удостоверьтесь, что индекс координат лайтмапы установлен на правильный канал.
Обычно для лайтмапы стоит значение 1.

Static Mesh Editor Details, Настройки лайтмапы

После использования данных настроек у вас есть правильное разрешение лайтмапы.

А вообще, лайтмапы лучше создавать прямо в 3d редакторе который вы используете, там вы сможете сделать идеальную развёртку для лайтмапы.Какой бы автогенерация не была, но ошибки будут всегда.
Если вы используете в своём пайплайне 3ds max или maya, посмотрите видео ниже, на них человек доступным языком объясняет как сделать отличную развёртку для лайтмапы.
Сказать автору видео «Спасибо» можете в виде like’ов и подписки на канал (там ещё много полезного видео на РУССКОМ языке (всё как вы любите)).


Как контролировать Глобальное Освещение при использовании статического освещения

Когда вы используете статическое освещение, вам необходимо забилдить освещение чтобы увидеть результаты.Лайтмасс (Lightmass) используют для генерации и компиляции текстур, которые будут хранить информацию об освещении и тенях запечённую в лайтмапы.

По умолчанию, значение лайтмасс = 3 световых отскока, дабы получить GI (глобальная иллюминация/освещение) используя статическое освещение.Если необходимо изменить данное значение, то его можно найти во вкладке World Settings.

Здесь вы можете видеть множество настроек того, как освещение будет реагировать в вашей сцене.Для GI мы сфокусируемся лишь на “Num of Indirect Lighting Bounces”. Ползунок ограничен в пределах от 1 до 4.Но вы можете установить любое значение просто вписав его туда

Lightmass World Settings по умолчанию

Global Illumination пример сцены.Одинарный источник света в 250 единиц (15w примерно)

Настройки сцены

0 отскоков

1 отскок

2 отскока

3 отскока

100 отскоков

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

Почему тени пятнистые или как избавится от загрязнения лайтмап?
Пятна, загрязнения, ну или как вы там это называете, не суть;данная ошибка часто возникает при использовании статического освещения в ue4.Не стоит паниковать, ведь исправить это можно через настройки лайтмасс.
Первое что приходит на ум- это то, что это связанно с непрямым освещением от отскоков GI при построении лайтмасс.
Что бы показать как это наиболее эффективно исправить, будем использовать 2 комнаты в качестве примера.

Экстерьер

Интерьер

В данной сцене будет использоваться продакшн (PRODUCTION ) качество освещения.В данной сцене используются ассеты из Starter Content pack .Все меши в этой сцене используют разрешение лайтмап = 256, в других случаях об этом будет написано.Пост процессы установлены в дефолтные значения, с адаптацией глаз для того, чтобы лучше видеть тёмные места комнаты.

После постройки освещения получаются такие вот результаты:

Интерьер 1й комнаты,освещается прямым светом с одним отскоком.

интерьер 2й комнаты, освещается полностью непрямым светом

Brute force может быть использовано для удаления некоторых артефактов путём увеличения разрешения лайтмапы, но это решение не всегда верно и не всегда помогает.
Как пример, во второй интерьерной комнате, разрешение лайтмапы увеличили до 1024:

Первоначальное освещение, дефолтные настройки

интерьер 2й комнаты, разрешение лайтмапы 256

интерьер 2й комнаты, разрешение лайтмапы 1024

В этом примере множество артефактов было исправлено за счёт повышения разрешения лайтмапы, но это также увеличивает потребление памяти.Это наиболее дружественное к производительности решение для непрямого освещения.

World Settings находится тут:

Настройки Lightmass изменяются тут:

Indirect Lighting Quality: увеличивает значение Global Illumination для получения требуемого качества.
Indirect Lighting Smoothness: фактор сглаживания применяемого в Indirect Lighting.
Осторожно! используя значение более чем 1 в Indirect Lighting Quality сильно увеличивает время билдинга

Настройки по умолчанию

Пример настроек #1

Вы также можете настроить количество отскоков непрямого освещения для получения требуемого результа:

количество отскоков непрямого освещения = 4

количество отскоков непрямого освещения= 5

На данный момент настройки освещения установлены в достаточных значениях для сокрытия любых артефактов с текстурами. Но если нет возможности производить данные манипуляции, то можно просто поднять значение разрешение лайтмапы. Тут это значение изменили с 256 до 512 и получили такой вот результат.

Изменённые косвенные параметры с разрешением лайтмапы = 512.

Не изменённые косвенные параметры с разрешением лайтмапы = 1024.

В начале этого урока было показано, как с помощию разрешения лайтмапы в 1024 исправить некоторые артефакты.Но подкрутив некоторые настройки лайтмасс можно добиться лучшего результата с меньшим значением разрешения лайтмапы.

Хотя этот метод и показывает методы решения проблем с «загрязнением» лайтмап без использования света, следует помнить,что добавление в нужное место небольшого источника света, пусть и с низкой интенсивность, без теней- может дать результат получше.Методы описанные выше являются лишь отправной точкой, и лишь методом проб и ошибок вы можете добиться требуемого результата.

Что такое “Lighting needs to be rebuilt” в левом верхнем углу?
Если вы в режиме: игра в редакторе, симуляция, standalone, в левом верхнем углу видиту надпись Lighting needs to be rebuilt, это означает, что вы должны заново запечь/простроить освещение в вашей сцене.Данное явление происходит только при статическом и стационарном освещении.Динамическое освещение не требует билдить освещение.Данное сообщение появляется в случае если источник света был передвинут или модифицирован.


Сообщение об ошибке

Сравнение качества освещения


Когда вам требуется запечь освещение в необходимом качестве, вы можете выбрать качество перейдя во вкладку Build>Lighting Quality>выбрать нужное качество.
По умолчанию качество установлено в Preview .Данный уровень качества быстрее при просчёте нежели Production , но не столь аккуратное.

Превью

Среднее

Высокое

Продакшн

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

На примере этой статуи заметить разницу между качествами не так уж и легко.Но разница есть.

Качество освещения

Превью

Среднее

Высокое

Продакшн

Улучшение развёртки лайтмапы — залог качественных теней.


качество освещения статуи

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

  • Рендерят сетку дважды. В этом случае сначала рендерится одна сетка (со стандартным материалом), а затем вторая (со слегка увеличенным масштабом и эмиссионным материалом)
  • Используют алгоритм распознавания контура. Он задается в виде материала пост-обработки

В этой статье я расскажу о втором методе, т.к. он легче интегрируется в уже существующие проекты. Данное руководство написано с учетом того, что вы знакомы с основами UE4 (в частности, с тем, как работает редактор материалов). Кроме того, чтобы было понятно, как реализовать алгоритм распознавания контура в виде UE4-материала, также пригодятся базовые знания в области обработки изображений.

Основные шаги

Реализация эффекта выделения контура в виде материала пост-обработки проходит в несколько этапов:

  • Создание материала пост-обработки, который выделит контур у объектов со включенным параметром Render Custom Depth.
  • Добавление этого материала пост-обработки в список Blendables, который находится в параметрах блока Post Process Volume.
  • Включение параметра Render Custom Depth у всех скелетных и статичных сеток, у которых нужно выделить контур

Ниже я подробнее объясню каждый из этих шагов. Если вы здесь лишь затем, чтобы скачать материал, можете сразу перейти к разделу «Загрузки», который находится в самом конце статьи.

Карта глубины

В UE4 есть отличная функция, позволяющая рендерить отдельные сетки в отдельную карту глубины, а затем использовать ее в материалах. Эта карта глубины содержит информацию о дистанции между каждым пикселем – и в мировых координатах, и в поле зрения камеры. Типичная карта глубины выглядит примерно так:

Наша карта глубины выглядит похожим образом, за исключением того, что в ней видны лишь объекты, у которых включен параметр «Render Custom Depth»:

Карта глубины заметно упрощает применение эффектов вроде выделения контура, созданию которого и посвящена эта статья.

Создание материала

Самый сложный этап. Мы создадим материал, в котором будет реализован оператор Собеля, свернутый с кастомной картой глубины. Другими словами, мы применим на кастомную карту глубины фильтр распознавания контура.

Начнем с алгоритма свертки. В его основе лежит довольно мудреная математика, но на самом деле все сводится к нескольким простым шагам

  • Берем пиксель P
  • Берем 8 пикселей PN, прилегающих к пикселю P
  • Умножаем значения в пикселях P и PN на значения в ядре свертки (т.е. делаем 9 умножений)
  • Складываем полученные значения
  • Возвращаем результат

Сначала нужно задействовать карту глубины. Делается это просто: добавьте нод Scene Texture и подключите его к Emissive Color материала. Также выставьте настройку Scene Texture ID на CustomDepth.

Теперь давайте задействуем прилегающие пиксели. Для этого можно использовать параметр UVs в ноде Scene Texture. Но проблема в том, что UV-параметры работают в текстурных координатах, т.е. используют значения от «0,0» (левый верхний угол текстуры) до «1,1» (правый нижний угол текстуры). Поэтому нам нужно взять инвертированные значения высоты и ширины текстуры, умножить их на смещение от центра ячейки (-1,-1), а затем прибавить к UV-координатам текущего пикселя. Таким образом мы выберем левый верхний пиксель.

В редакторе материалов это будет выглядеть следующим образом:

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

Итак, у нас есть набор UV-параметров для всех прилегающих пикселей, поэтому теперь можно задействовать данные из кастомной карты глубины. Я создал для этого простую функцию материала: в качестве входных параметров она принимает UV-координаты, а затем возвращает значение обработанного пикселя.

Если воспользоваться этой функцией для обработки данных от прилегающих пикселей, то у нас, собственно, будут все необходимые данные для распознавания контура. Теперь давайте создадим еще одну функцию материала, которая будет выполнять свертку.

С левой стороны – два набора входных параметров. Первые 9 векторов – это просто значения пикселей, которые мы будем обрабатывать. Другие 3 вектора служат для значений ядра свертки. По сути, это просто матрица 3х3, но поскольку в редакторе материалов UE4 нет типа данных для матрицы, я сделал собственную при помощи параметров Vector3.

Итак мы собрали все кусочки алгоритма. Теперь осталось лишь объединить их внутри итогового материала.

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

Теперь давайте объединим два этих значения.

Далее открываем редактор материалов, при помощи рассчитанных значений создаем вектор, а затем возвращаем длину вектора. Результатом будет черное изображение с контуром вокруг сеток, у которых включен параметр Render Custom Depth. Осталось лишь смешать полученный эффект с финальной картинкой. В моем случае будет использоваться оператор «IF», но вы можете встроить алгоритм и по-своему. Ничего сложного в этом нет.

ПРИМЕЧАНИЕ: Убедитесь, что ваш материал находится в домене Post Process, а не Surface (имеется в виду «material domain»; это параметр, через который настраивается, для чего будет использоваться материал). Это можно поменять в свойствах материала.

Настройка сцены

Теперь, когда материал готов, нам нужно добавить его в список пост-обработочных эффектов сцены. Выберите у своей сцены блок Post Process Volume и найдите пункт Blendables. Добавьте в список Blendables новый компонент, а затем выберите из списка созданный нами материал. Если блока пост-обработки в вашей сцене нет, создайте его. Также убедитесь, что у блока Post Process свойство Unbound выставлено на «true». В противном случае игрок будет видеть эффект строки только в том случае, если будет находиться внутри блока Post Process Volume.

Чтобы проверить результат, поместите в сцену какую-нибудь сетку и включите у нее параметр Render Custom Depth.

Блюпринт

Я настроил сцену таким образом, что эффект строки будет появляться у статической сетки только в том случае, если игрок наведет на нее прицел. Я решил воспользоваться шаблоном для FPS. Кроме того, я добавил в блюпринт MyCharacter функцию Trace. Она вызывается таймером, тикающим каждые 0,1 секунды, и проверяет, смотрит ли игрок на статичную сетку. Если смотрит, параметр Render Custom Depth выставляется на «true». Если игрок перестает целиться в сетку, значение в переменной Render Custom Depth меняется на «false». Посмотреть, как это все работает, можно в файле, ссылку на который можно найти ниже, в разделе «Загрузки».

Вы можете импортировать текстуры с помощью кнопки «Импорт» в контент браузере. Unreal 4 поддерживает большое разнообразие форматов текстур: от.tgas и.png до.psds и.jpg. Один важный совет - убедитесь, что normal maps сжаты как TC Normalmap, чтобы избежать визуальных ошибок в движке. Также имейте в виду, если разрешение вашей текстуры не кратно двум (например 1024х349), они не запустятся или будут лишены свойств MipMap.

  1. Сохранение памяти: текстуры Channel-pack

Одна из особенностей Unreal - это большой объем контроля, который вы получаете, создавая свои собственные материалы. Когда вы создаете несколько черно-белых масок для текстур, таких как roughness или transmission, вы можете сэкономить память, спрятав каждую маску в отдельный канал R,G или B, а затем получив доступ к каждому каналу этой текстуры отдельно.

  1. Физически корректный рендеринг

С появлением новых возможностей рендеринга в движках, таких как Unreal 4, широкую популярность получил физически корректный рендеринг.

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

  1. Повторное использование текстуры

Еще одним удивительным элементом Unreal 4’s Material Editor является то, что он позволяет повторное использование текстуры. Это поможет вам не только сохранить память, но и сэкономить время. Иногда red channel из rock albedo texture можно использовать как черно белую маску для roughness. Текстуру черепицы из Photoshop можно легко наложить на кирпич, а также смешать с другой текстурой для наложения на другие элементы.

  1. Не накладывайте ненужных текстур

Иногда определенные текстуры не нужны. Для 100% неметаллических материалов, таких как древесина или грязь, текстура металла может быть заменена в Material Editor простой константой с плавающей точкой и значением 0. Этот же принцип можно применить для нескольких версий одного и того же материала. Вам не нужны отдельные normal maps, например, для трех разновидностей кирпича, отличающихся по цвету. Можно использовать одну normal map для всех.

  1. Создание набора основных материалов

Один из способов экономии времени и работы - создание базового набора материалов, которые могут быть использованы для разных объектов. Когда я начинаю проекты, я создаю базовый материал для каждого типа объекта, который мне нужен. Например, если бы я делал сцену природы, я бы хотел получить базовые материалы для местности, пропсов или растительности. Конечно, вам всегда придется дополнять этот набор во время работы, но это поможет справиться с основной частью процесса.

  1. Повторное использование материала

Отличной особенностью базового материала является его способность изменения в режиме реального времени. Вы можете использовать эти изменения для быстрого тестирования множества различных значений без перекомпиляции материала. Всякий раз, когда я использую сложный материал, у меня всегда наготове тестовый экземпляр. Мне он необходим для блокировки более реалистичных базовых значений конечного материала.

  1. Комментарии и организация материалов

Для сложных материалов Unreal 4 предлагает очень полезные организационные инструменты. Выбор группы нод и нажатие C помещает эти ноды в комментарий, который затем можно перемещать как группу и кодировку цвета. Комментарии (и отдельные ноды) могут содержать базовые текстовые пояснения.

  1. Функции материалов

Функции материалов можно вызвать несколько раз для выполнения определенного набора инструкций. Они создаются вне материала в Content Browser, но затем могут быть вызваны, чтобы упростить их. Они могут содержать свой собственный inputs и могут стать отличным способом сэкономить время, когда нужно вызвать несколько повторяющихся операций.

  1. Материалы листьев

Листва может быть одной из самых сложных вещей, т.к. совсем не просто обеспечить ее правильное отображение в любом игровом движке. В UE4 версии 4.18 существует Foliage Shading Model, которая упрощает эту задачу. Я настоятельно вам ее рекомендую, поскольку она поддерживает передачу подповерхностного слоя, что в большинстве случаев дает преимущества. Кроме того, советую добавить sky light к вашей сцене, чтобы помочь сбалансировать некоторые более темные области сетки листвы, которые могут быть в тени.

  1. Vertex colour

Доступ к цветам Vertex в материалах - одна из моих любимых функций в Unreal 4. Они могут быть невероятно мощными при творческом подходе. От ambient occlusion до masking out wind и world offset для листвы - их универсальность колоссальна. Они особенно полезны при смешивании текстур. Vertex colors можно импортировать из внешнего программного обеспечения 3D или импортировать и нарисовать в редакторе.

  1. Детализированные diffuse и normal

Так как вы можете настроить параметры текстурирования ультрафиолетового излучения, вы можете увеличить детали материала путем смешивания в дополнительном наборе текстур. Обычно это diffuse или normal maps, которые затем поочередно накладываются поверх базовых. Вы можете использовать любой удобный для вас метод, например, такой как Overlay Blend Function, в то время как подробные normal maps могут быть применены путем добавления красного и зеленого каналов к основанию.

  1. Смешивание текстур в материалах

Хотите объединить текстуры в material editor, но знакомы только с режимами смешивания Photoshop? Epic превзошел все ваши ожидания. Наряду со многими полезными функциями материалов он включает в себя большинство режимов смешивания, с которыми знакомы все пользователи Photoshop. От Overlay до Linear Dodge их можно найти в окне палитры внутри Material Editor. Они могут быть особенно полезными для добавления деталей к вашим материалам.

  1. Знание типов источников освещения

Unreal предлагает четыре различных типа света для использования в окружающей среде: Directional, Point, Spot, и Sky light. Свет Directional отлично подходит для наружных зон или любого необычного источника света. Свет Point является всенаправленным, а Spot похож на него, но имеет ограничения, определенные конусом. Sky light может использоваться для добавления света в окружающую среду, захватывая отдаленные части вашей карты. Поддерживаются также пользовательские Cubemaps.

  1. Добавление тумана к вашей сцене

Существует стандартный способ создания всем нам известного обычного плотного тумана. Unreal 4 же предлагает два других способа добавить туман к вашей сцене. Atmospheric Fog реагирует на направленный угол освещения и интенсивность. Он может создать туман, основанный на реальном рассеянном атмосферном свете. Height Fog дает немного больше контроля цвета и позволяет добавить более простой эффект тумана, который становится менее плотным в верхних частях карты и более плотным в нижних частях.

  1. Создание умных световых валов

Световые лучи или « God rays » могут быть мощным визуальным инструментом и создаваться частицами в воздухе, освещенном определенными источниками света. В Unreal 4 они могут быть созданы несколькими способами. Наиболее распространенный способ заключается в том, чтобы позволить им использовать свойства направленного света. Они также могут быть выполнены с использованием геометрии и умных материалов.

  1. Съемки с высоким разрешением

Хотя пользовательские видео разрешения могут быть выведены из Matinee, есть быстрый и простой способ сделать кадры в высоком разрешении прямо из редактора. Нажав на маленькую нисходящую стрелку в левом верхнем углу вашего Viewport, вы можете открыть небольшое раскрывающееся меню. Внизу можно открыть окно High Resolution Screenshot window. Оттуда снимки в высоком разрешении могут быть захвачены и отправлены в папку вашего проекта: project/saved/Screenshots folder.

  1. Корректировка цвета и таблицы поиска

Финальные цвета рендеринга можно настроить на основе художественных предпочтений. Хотя существуют опции для базовых настроек, таких как контраст и оттенок, пользовательская коррекция цвета может быть выполнена с использованием таблиц цветового поиска. Эти таблицы допускают сложное преобразование цвета и могут быть сделаны при помощи базового файла, доступного на сайте Epic Unreal 4 и в Photoshop, или в других программах для настройки изображений.

  1. Редактирование световых переходов и бликов

В играх и 3D стало популярным отображать световые переходы и блики, их можно включить и настроить в UE4, используя специальные зоны постобработки - post-process volumes. Световой поток настраивается практически по всем характеристикам. Размер, цвет, интенсивность и порог можно изменить и даже использовать их для маскировки текстур грязи и имитации грязных линз. Аналогично, вспышки также могут быть включены, а их форма и интенсивность регулируются.

  1. Создание глубины резкости

Unreal 4 поддерживает как резкость по Гауссу, так и настраиваемую. Оба эти параметра существуют в настройках Post Process Volumes. Следует также отметить, что инструменты, которые помогают с размытием тонких объектов перед удаленными, иногда могут создавать проблемы. Нужно проявлять осторожность в применении глубины резкости, например, к листве или другим подобным элементам.

  1. Автоэкспозиция и адаптация глаз

Автоматическое управление экспозицией включено по умолчанию и имитирует настройку глаз на яркие или темные области. Эффект является потрясающим, но может создавать постоянно изменяющиеся визуальные переменные, которые трудно поддерживать внутри. Регулировку диапазона экспозиции можно выполнить в настройках volumes после обработки. Её можно отключить, если установить минимальную яркость, равную максимальной. Смещение экспозиции можно использовать для настройки её базовых параметров.

  1. Световые функции

Одна интересная особенность в Unreal 4 - поддержка материалов с функцией освещения. Эти материалы действуют как маски для света и могут использоваться, чтобы сделать что-либо: от пользовательских цветовых вариаций в свете до облачных теней на земле. Они создаются путем установки функции Material Domain to Light в Material Editor, их можно использовать при spot, point и directional lights.

  1. Сэкономьте время, скопировав и вставив

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

А самое крутое - это то, что все, что скопировано из Unreal, можно вставить в текстовый документ. Затем этот текст можно скопировать и повторно вставить на другой уровень Unreal 4.

  1. Режим просмотра и визуализация рендер пасов

Знание того, что составляет ваш образ, является неотъемлемой частью работы в любом 3D-движке и работает в отложенном рендерере, например, UE4 позволяет использовать некоторые полезные режимы просмотра. Нажатие Alt и 1-8 переключается между различными режимами просмотра, такими как Unlit или lighting only, но если вы нажмете кнопку View Mode в окне Viewport, вы можете просмотреть отдельные рендер пасы. Это может быть полезно для просмотра широких диапазонов материалов, таких как roughness.

Хотя Unreal невероятно мощный, не каждая рабочая станция создается одинаково. Если вы столкнулись с проблемами производительности движка, первое, что нужно включить, - это параметры масштабирования движка в «Setting» на панели Editor Toolbar. Отключение некоторых параметров, таких как сглаживание, может действительно ускорить работу. Другой трюк состоит в том, чтобы группировать множество объектов в world outliner. Затем вы можете переключать их видимость, чтобы улучшить производительность.

Тени дают объектам ощущения контакта с поверхностью, тем самым позволяя ощутить глубину и пространство.Статические тени отображаются настолько далеко, насколько идёт рендеринг, но динамические тени могут сильнее сказатся на производительности.Данный документ покажет базовые виды теней которые есть в Unreal Engine 4.

Static Lights

Статическое освещение отбрасывает полностью статические тени и свет, это означает, что такой тип освещения не имеет прямого влияния на динамические объекты (статическое освещение запечено в кеш непрямого освещения, поэтому оно имеет некоторый эффект), как на примере ниже.

Персонаж на картинке выше, тот что слева, стоит под статическим светом, свет и тени никак не взаимодействуют с ним; а тот что справа, стоит под стационарным источником света.

Прямое освещение каскадными картами теней(затенение всей сцены)

Directional Stationary Lights — специальные источники света, т.к. они поддерживают затенение всей сцены посредством Cascaded Shadow Maps , в момент использования статического затенения.Это очень удобно на уровнях с множеством анимированной растительности; вы хотите движущиеся тени вокруг игрока, но не хотите переплачивать за чрезмерное количество каскадов, для покрытия больших дистанций обзора.С увеличением расстояния, динамические тени растворяются среди статических теней настолько, что переход практически незаметен.Чтобы применить данную возможность, просто измените значение Dynamic Shadow Distance StationaryLight в DirectionalLightStationary , чтобы изменить дистанцию растворения.

Тени Стационарных источников света

Динамические объекты (такие как StaticMeshComponents и SkeletalMeshComponents с подвижностью установленной в Movable ) должны быть интегрированны в мировое статическое затенение на дистанции полей карт затенения.Это достигается с помощью теней для каждого объекта.Каждый подвижный объект создаёт 2 динамические тени от стационарного источника света: одну, для управления статической тени проецируемой на объект и вторую, для управления тени проецируемую на остальной мир.С такой настройкой, затенение для стационарных источников света происходит от динамических объектов,которое оно затрагивает.Это означает, что стоимость может варьироваться от очень маленькой, до огромной, в зависимости от того, сколько присутствует динамических объектов.При наличии достаточного количества динамических объектов, более эффективным будет использование Movable освещения. На сцене ниже, сферы — подвижный объект, и все они получают тени от статического мира и проецируют собственные тени, которые соединяются с остальными тенями на отдалении.Фруструм Per Object теней для каждого подвижного объекта также показан.

Per Object тени используются для подвижных компонентов используя теневую карту границ объекта, поэтому границы должны быть точными. Для скелетал мешей это значит, что они должны иметь physics asset . Для частиц — любой фиксированный ограничивающий бокс должен быть настолько велик, чтобы вместить в себя все частицы.

Динамические тени

Подвижные источники света проецируют полностью динамические тени (и освещение) на всём.Информация об освещении не будет запекатся в лайтмапы.Статик меши, Скелетал меши, эффекты, прочее — будут получать и проецировать динамические тени от подвижных источников света.

Динамические тени самые ресурсоёмкие.

Превью теней

Когда редактируете стационарное или статическое освещение, тени могут стать «незапечёнными», Preview Shadowing показывает вам как будут выглядеть ваши тени после запекания.

Такие (имеется ввиду незапечённые) тени показываются в редакторе с наложенным поверх текстом «Preview «, для распознавания их среди других теней.

Если вы протестируете свою игру в редакторе, до того как перезапечёте освещение, то превью тени исчезнут, так как они существуют только лишь в режиме редактирования, но никак не в режиме игры в редакторе.

Для того, чтобы получить тени из превью теней, вам необходимо выбрать опцию Build Lighting из меню Build .

Вы можете отключить превью теней посредством снятия галочки с Preview Shadows Indicator во вьюпорте Show/Visualize меню.

Если вы хотите изменить текст материал функции освещения, которая проецирует этот текст, то вы можете его найти в: Engine/EditorMaterials/PreviewShadowIndicator.

Всё вместе

Когда все тени собраны вместе, каждая из которых привносит свои сильные стороны и компенсирует слабые стороны других — они впечатляют своим видом.

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

Изображение будет изменено только тогда, когда вы перепросчитываете освещение или обновляете сцену при помощи команды Build -> Update Reflection Captures . Вы также можете обновить SkyLight при помощи кнопки Recapture Scene в параметрах . Учтите, что если вы измените текстуру неба или окружение, дальше параметра SkyDistanceThreshold, освещение не изменится автоматически.

Можно использовать вместо Ambient Cubemap , потому что Sky Light поддерживает локальное затенение, которое препятствует освещению внутренних помещений от небесного освещения.

Бывает двух типов в зависимости от подвижности:

Отражения окружающей среды работают посредством захвата статической сцены во многих точках и перепроицировании их на простые формы, как в сферах отражений.Пользователь выбирает точку захвата размещением эктора ReflectionCapture .Отражения обновляются в режиме реального времени, для помощи в настройке их положения, но статичны в момент выпонения.Проецирование захваченных сцены в простые формы даёт приблизительный параллакс для отражений.Каждый пиксель смешивается между несколькими кубмапами, чтобы получить конечный результат.Меньшие ReflectionCapture экторы переопределяют крупные, поэтому вы можете уточнить отражения в областях по мере необходимости. Для например, вы можете разместить захват в центр комнаты, а затем уточнять его отражения поместив меньшие захваты в углах помещения.

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

Однако, использования одних лишь кубмап отражений на очень шероховатых поверхностях приводит к чрезмерно ярким отражениям, что имеет значительные утечки из-за отсутствия локальной окклюзии.Это решается за счёт использования данных лайтмапы созданной посредством Lightmass .Отражения кубмап смешиваются вместе с лайтмапой непрямой зеркальности основанной на шероховатости материала.Очень шероховатый материал (полностью диффузный) будет сходится с результатом лайтмапы.Такое смешивание, по факту, является комбинированием частей данных об освещении — высокодетализированной (кубмапы) и низкочастотной (лайтмапы).Для того, чтобы это работало корректно, в лайтмапе может быть лишь непрямоей освещение.Это означает, что только рассеянное освещение от стационарных источников света может улучшить качество отражений на шероховатой поверхности.Статический тип освещения не может быть использован вместе с отражениями окружающей среды, так как он даст прямое освещение на лайтмапу. Учтите, что для того чтобы увидеть результат этого смешивания, лайтмапа должна быть хотя бы раз построена,и карта должна иметь значимое непрямое диффузное освещение.

Формы захвата отражений

На данный момент существует 2 формы захвата отражений: сфера и коробка.Форма захвата очень важна, так как она контролирует, какая часть сцены будет захвачена в кубмапу,как форма сцены будет перепроецирована в отражениях, и кака часть сцены сможет получать отражения из кубмапы (зоны влияния).

Форма сферы

Форма сферы наиболее используемая.Она никогда не совпадает с формой отражаемой геометрии, но она не имеет разрывов и углов, следовательно искажение равномерное.

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

Точки захвата с меньшим радиусом перезаписывают данные больших по размеру точек захвата.

Форма коробки

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

Когда коробка выделена, она имеет оранжевую окантовку формы проецирования.Форма коробки захватывает лишь то, что находится внутри коробки,и с удалением от центра захват затухает.

Редактирование

Важно отметить, что захват отражение не происходит автоматически.Перезахват отражений происходит только лишь при загрузке карты,прямом редактировании, перезапечении освещения.Если вы изменили яркость света или передвинули геометрию в сцене, то вам необходимо выбрать точку захвата и нажать Update Captures, чтобы обновить данные захвата.

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

Были добавлены несколько новых полезных флажков для изоляции некоторых компонентов освещения:

Настройка уровня для использования отражений окрущающей среды


Вопросы производительности

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

Ограничения

  • Отражения с помощью этого метода, являются приблизительными.В частности, отражение объекта редко совпадает с фактической формой объекта в сцене из-за проекции его на простые формы.Это приводит к созданию нескольких видов этого объекта в отражениях, так как много кубмап смешивается вместе.Плоские, гладкие поверхности, которые дають зеркальные отражения, более заметно покажут ошибки.Используйте детальные карты нормалей и отражений, чтобы разбить отражения.
  • Захват сцены в кубмапы — медленный процесс, который должен быть выполнен вне игры.Это значит, что динамические объекты не могут быть отображены в отражениях, но тем не меннее, они могут получать отражения от статической сцены.
  • Для уменьшения ошибки, захватывается лишь диффуз сцены.Чисто зеркальные поверхности (металлы) будут иметь своё зеркальное применение, как будто бы если это было их диффузом во время захвата.
  • Затенение

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

    В категории «Transform » в настройках любого источника света вы можете найти параметр «Mobility » («Подвижность»). Измените его на «Movable » («Подвижный»). Это свойство влияет также на источники света, добавленные в блупринт.