Полезное

Мы Вконтакте

Материалы постобработки

Добавлено Сен 30 2015

График постобработки (Post Processing Graph)

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

Граф создает временные 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»

Вы можете добавить блок материала «SceneTexture» к своему материалу и выбрать, какую текстуру необходимо использовать:

Нода имеет необязательный вход и несколько выходов:

UV-вход определяет, в каком месте вы хотите сделать lookup-текстуру (используется только для цветового выхода). Выход «Color» состоит из четырех выходов, выделенные (в зависимости от ID текстуры сцены (Scene Texture)) под отдельные каналы. Выход «Size» – это 2 компонента вектора: ширина и высота текстуры. Обратную им величину (1/ширина, 1/высота) можно получить на выходе «InvSize».
Это полезно в подобных случаях:

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

Использование параметров G-буфера

G-буфер состоит из нескольких текстур, которые содержат материалы (к примеру, подповерхностный/отраженный цвет, шероховатость; subsurface/specular color, roughness) и атрибуты объекта (нормали, глубина) без данных об освещении и его взаимодействии с материалом. В различных рендерерах мы сначала рендерим G-буфер, затем просчитываем все освещение (отложенное) с атрибутами G-буфера. Так как UE4 использует отложенное затенение (DirectX 11 или последние версии OpenGL), мы получаем доступ к данному буферу в процессе постобработки.

Но здесь нам несколько мешает сглаживание, поскольку пиксель/тексель G-буфера больше не относится как 1:1 с итоговым пикселем (смотрите секцию ниже).

CustomDepth

Эта особенность предоставляет возможность скрывать определенный объект путем его рендера в буфер глубины, называющийся пользовательским буфером глубины (Custom Depth Buffer). Этот метод увеличивает количество вызовов отрисовки при том же количестве материалов. Рендеринг получается крайне дешевым, поскольку на выходе лишь глубина.
Функция активируется для мешей («Static Mesh Properties / Render Custom Depth»; Настройки статичного меша/Рендер пользовательской глубины):

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

Здесь вы можете посмотреть пользовательскую глубину:

А это материал, который мы использовали для визуализации:

Временное сглаживание или Почему G-буфер «дрожит»

Временное сглаживание – это уникальная особенность UE4, которая отлично влияет на качество изображения, потребляя при том среднее количество ресурсов.
По умолчанию, материал постобработки вставляется в конец графа (после тоновой компрессии). Это означает, что вы получаете финальное LDR-изображение после тоновой компрессии, цветокоррекции и применения временного сглаживания. И это лучший вариант для простых эффектов постобработки с точки зрения производительности и легкости использования.
Здесь вы можете увидеть, как мы использовали вход пользовательской глубины для визуализации силуэта определенных объектов:

Заметьте, что на предыдущем изображении края объекта не были сглажены. Но во время движения вы заметите, что силуэт объекта «дрожит». Это происходит по той причине, что временное сглаживание перемещает рендеринг все сцены каждый кадр на каждый пиксель. Из нескольких кадров, скомбинированных вместе, получается финальное сглаженное изображение. Хотя, мы, конечно, можем переместить материал в более раннее положение в графе постобработки для исправления подобных артефактов.
Вот результат:

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

Известные проблемы

  • Блок материала SceneTexture
    • Separate Translucency не работает.
    • Отфильтрованные (билинейно) lookups не работают.
    • Определенные lookups не работают в некоторых проходах (возможно, не все из них будут исправлены, ввиду больших затрат ресурсов компьютера).
    • MaterialFunction может выдавать ошибку, хотя и продолжать работать с доменом постобработки.
  • Материалы
    • UV в PostProcesMaterial не может принимать значения из промежутка от 0 до 1(например, при уменьшении размеров вьюпорта).
    • Миниатюра ассета с материалами постобработки отображается неправильно.
    • Альфа-канал в качестве выхода пока не поддерживается (используйте «Opacity» (Непрозрачность).
    • Предпросмотр материала в редакторе материалов отображается неправильно.
    • В некоторых случаях изменение материала ни к чему не приводит в постобработке. Для исправления – перезагрузите редактор.
    • Браузер контента должен позволять легко фильтровать материалы постобработки.
    • Режим смешивания материалов не работает для материалов постобработки.
  • Смешивание
    • При смешивании двух волюмов постобработки, возможно проявление неаккуратного перехода. Это можно избежать, если использовать непривязанный волюм со стандартными настройками материала.

FAQ

  • Можно ли указать текстуру «Lighting only mode» (только освещение) как вход?
    Нет, поскольку отсутствуют данные этой промежуточной стадии. Для этого режима просмотра мы генерируем текстуру, игнорируя цвета материала. В противном случае, пришлось бы реструктуризировать большой объем кода рендеринга.
  • Почему SceneColor lookup отображается некорректно, но при использовании PostProcessInput0 это незаметно?
    Когда используется SceneColor, создается низкокачественная копия всей сцены, для поиска текстуры, которую мы записываем в данный момент (что невозможно выполнить иным способом, к примеру, при рендеринге любого меша). Так что в постобработке вы должны использовать PostProcessInput0.
  • Сколько памяти уходит на постобработку?
    Затраты зависят от разрешения экрана. Перед тональной компрессией мы используем HDR (8 байтов на пискель), после – LDR (4 байта на пискель).
  • Как снизить стоимость рендера для постобработки?
    Зависти от целевой платформы. В любом случае, уменьшайте количество lookup-текстур, избегайте случайных lookup (может снизить производительность из-за потери кеша текстур).
  • Какое количество проходов можно использовать?
    Каждый проход увеличивает стоимость рендера. Попробуйте комбинировать проходы и активировать их только тогда, когда необходимо. Ключевые игровые особенности, такие как шум, можно выделить в отдельный проход для большей производительности.
  • Какова нагрузка на ЦПУ при постобработке и смешивании?
    Смешивание материалов довольно легкий процесс. Все настройки материалов смешиваются, и в проход попадает лишь один материал постобработки.
  • Мне нужно использовать положение «До тональной компрессии» («Before Tonemapper»), чтобы получить качественное временное сглаживание. Но при изменении цвета, я получаю нежелательный результат. Как это предотвратить?
    Это не простое решение. Вы должны обратить тональную компрессию (дорогая операция). Цвет также может отличаться в зависимости от настроек адаптации глаз: необходимо проверить параметр EyeAdaptationlevel.
  • Как получить полный дамп графа постобработки?
    r.CompositionGraphDebug – вывод графа в консоль. Пример:
Добавил: Flakky Категория: Пост-обработка


Комментарии

На данный момент комментарии отключены.

UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница