Полезное
Мы Вконтакте
Discord канал
Движок уже имеет полноценную постобработку, основанную на графе узлов постобработки. Помимо этого можно, в некоторых особых случаях, использоват, материалы постобработки.
В данный момент граф занимается не только процессом постобработки, но и освещением. Со временем, мы планируем сделать большее количество вещей, изменяемых через редактор материалов.
Граф создает временные render targets (без смешивания буферов кадров (framebuffer blending). Это значит, что, если вам необходимо изменить исходный цвет объекта, то придется пользоваться шейдером.
Использовать материалы постобработки необходимо в малых количествах и лишь в случае крайней необходимости. Когда бы то ни было, будь то цветокоррекция, блюм, глубина резкости или что-то подобное, используйте волюм постобработки, который был специально оптимизирован для этих целей.
Посредством настроек постобработки (обычно определяемых в волюмах постобработки или параметрах камеры) возможно смешивание, так называемых, «смешиваемых» ассетов («blendable assets»). Движок уже имеет несколько материалов постобработки, но эта его особенность позволяет создавать, рендерить и смешивать пользовательские PostProcessing Material без помощи программистов.
Достаточно применить один или несколько материалов (в качестве смешиваемых) к эктору волюма постобработки в секции «Misc» («Разное»). Для этого сначала нажмите +, чтобы добавить новый слот, затем выберите материал в браузере контента и нажмите стрелочку, дабы применить его. Стоит знать, что неиспользуемые слоты будут просто проигнорированы движком.
Вы можете посмотреть пример постобработки в этом уроке: «Пример материала постобработки».
В первую очередь, для материала постобработки необходимо указать домен материала:
Материал должен использовать только свойство EmissiveColor.
Если у вас несколько зон или настроекс с постобработкой, в особенности те, что используют материалы, вы можете указать приоретет, для того, что бы самые важные материалы отображались как нужно.
Blendable Location | Описание |
Before Tonemapping | PostProcessInput0 обеспечивает доступ к данным о цвете сцены со всем освещением в HDR. Используйте этот параметр для исправления артефактов, связанных с временным сглаживанием (temporal antialiasing) и lookups G-буфера, такими как глубина, нормали и подобное. |
After Tonemapping | Предпочтительное расположение прохода для производительности, поскольку цвет представлен в LDR и, естественно, требует меньшей точности и пропускной способности. Применяется после тональной компрессии и цветокоррекции. |
Обычный вход постобработки находится перед проходом. Поэтому при использовании PostProcessInput0 цвет может быть применен через SceneTexture. Использование SceneColor в некоторых случаях не даёт правильного результата.
С волюмами постобработки крайне просто настроить плавный переход между различными материалами постобработки. Так мы используем один волюм, помеченный как непривязанный и имеющий большой радиус смешивания (около 1000):
Для каждого волюма мы определяем различный тип одного и того же материала. Цвет указывается как параметр, что и позволяет иметь различные настройки для разных типов материала.
Основываясь на положении камеры, используются настройки одного волюма:
При движении – уже двух.
Все настройки образцов материалов смешиваются, вне зависимости от того, указан ли соответствующий флажок или нет (свойства передаются от родителей). В этом различие между настройками постобработки, когда эффект отсутствует при отсутствии флажка.
Это значит, что если вы смешиваете два образца материала, то смешиваются и их параметры.
Вы можете добавить блок материала «SceneTexture» к своему материалу и выбрать, какую текстуру необходимо использовать:
Нода имеет необязательный вход и несколько выходов:
UV-вход определяет, в каком месте вы хотите сделать lookup-текстуру (используется только для цветового выхода). Выход «Color» состоит из четырех выходов, выделенные (в зависимости от ID текстуры сцены (Scene Texture)) под отдельные каналы. Выход «Size» – это 2 компонента вектора: ширина и высота текстуры. Обратную им величину (1/ширина, 1/высота) можно получить на выходе «InvSize».
Это полезно в подобных случаях:
В примере выше, блок материала просчитывает разницу глубины данного пикселя и соседнего.
G-буфер состоит из нескольких текстур, которые содержат материалы (к примеру, подповерхностный/отраженный цвет, шероховатость; subsurface/specular color, roughness) и атрибуты объекта (нормали, глубина) без данных об освещении и его взаимодействии с материалом. В различных рендерерах мы сначала рендерим G-буфер, затем просчитываем все освещение (отложенное) с атрибутами G-буфера. Так как UE4 использует отложенное затенение (DirectX 11 или последние версии OpenGL), мы получаем доступ к данному буферу в процессе постобработки.
Но здесь нам несколько мешает сглаживание, поскольку пиксель/тексель G-буфера больше не относится как 1:1 с итоговым пикселем (смотрите секцию ниже).
Эта особенность предоставляет возможность скрывать определенный объект путем его рендера в буфер глубины, называющийся пользовательским буфером глубины (Custom Depth Buffer). Этот метод увеличивает количество вызовов отрисовки при том же количестве материалов. Рендеринг получается крайне дешевым, поскольку на выходе лишь глубина.
Функция активируется для мешей («Static Mesh Properties / Render Custom Depth»; Настройки статичного меша/Рендер пользовательской глубины):
В этой сцене мы активировали пользовательскую глубину для двух объектов, но без визуализирующего прохода постобработки, её невозможно заметить.
Здесь вы можете посмотреть пользовательскую глубину:
А это материал, который мы использовали для визуализации:
Временное сглаживание – это уникальная особенность UE4, которая отлично влияет на качество изображения, потребляя при том среднее количество ресурсов.
По умолчанию, материал постобработки вставляется в конец графа (после тоновой компрессии). Это означает, что вы получаете финальное LDR-изображение после тоновой компрессии, цветокоррекции и применения временного сглаживания. И это лучший вариант для простых эффектов постобработки с точки зрения производительности и легкости использования.
Здесь вы можете увидеть, как мы использовали вход пользовательской глубины для визуализации силуэта определенных объектов:
Заметьте, что на предыдущем изображении края объекта не были сглажены. Но во время движения вы заметите, что силуэт объекта «дрожит». Это происходит по той причине, что временное сглаживание перемещает рендеринг все сцены каждый кадр на каждый пиксель. Из нескольких кадров, скомбинированных вместе, получается финальное сглаженное изображение. Хотя, мы, конечно, можем переместить материал в более раннее положение в графе постобработки для исправления подобных артефактов.
Вот результат:
Мы получили стабильное и сглаженное изображение. Правда, как говорилось, в движении можно наблюдать появление артефактов, связанных с временным сглаживанием. Из-за использования буфера глубины для перепроецирования старого изображения. В случае рендеринга краев внутри объекта, все работает хорошо, но как только мы назначаем рендер краев поверх объекта, появляются артефакты. Для того, чтобы их избежать, требуется настроить буфер глубины (эта функция пока не реализована полностью и потребляет слишком много ресурсов).
Заметьте, что TemporalAA (Временное сглаживание) еще в процессе разработки.