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

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

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

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





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

Блок материала SceneTexture

o Separate Translucency не работает.

o Отфильтрованные (билинейно) lookups не работают.

o Определенные lookups не работают в некоторых проходах (возможно, не все из них будут исправлены, ввиду больших затрат ресурсов компьютера).

o MaterialFunction может выдавать ошибку, хотя и продолжать работать с доменом постобработки.

Материалы

o UV в PostProcesMaterial не может принимать значения из промежутка от 0 до 1(например, при уменьшении размеров вьюпорта).

o Миниатюра ассета с материалами постобработки отображается неправильно.

o Альфа-канал в качестве выхода пока не поддерживается (используйте «Opacity» (Непрозрачность).

o Предпросмотр материала в редакторе материалов отображается неправильно.

o В некоторых случаях изменение материала ни к чему не приводит в постобработке. Для исправления – перезагрузите редактор.

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

o Режим смешивания материалов не работает для материалов постобработки.

Смешивание

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


 


Blendables

Blendables – ассет, имеющий свойства, позволяющие ему аккуратно смешиваться с другими такими же. Мы в Epic Games чаще всего используем Blendables для PostProcessMaterials, но эта система подходит для всего, что зависит от вида (т.е. в основном, для связанного с камерой).

Blendable

Ассеты Blendable уже реализованы в движке, хотя и используются только для PostprocessMaterils / PostprocessMaterialInstances. Тем не менее, по идее, основная задача Blendable – предоставить возможность смешивать произвольные данные (как наиболее подходящие примеры: линейные значения, цвета) для выдачи результатов любой из подсистем.

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

Blendable – это объект, который имеет IBlendableInterface, в данный момент реализованный следующими типами ассетов:

● PostprocessMaterials

● PostprocessMaterialInstances

● LightPropagationVolumeBlendable

Контейнер Blendable находится в PostProcessSettings, которые имеются у следующих объектов:

● PostProcessVolume

● PostProcessComponent

● SceneCaptureActor

● CameraComponent

Ассет LightPropagationVolumeBlendable создан как пример создания нового blendable и замены существующих PostProcessSettings. Эта система работает хорошо с малым количеством настроек, в других случаях нужна более сложная система.

Blendable в контент-браузере имеют собственную категорию – «Blendable». Можно использовать кнопку «Add New» или отфильтровать ассеты по категориям.

Плюсы новой системы:

● Простота расширения и обновления (нет необходимости менять целую единую структуру, можно просто создать отдельный модуль)

● Гибкие связи между пакетами позволяют работать с контентом без определенного уровня доступа (СКВ)

● Они же дают возможность использовать один ассет во многих случаях (уменьшение избыточности, большая гибкость)

● Возможно создание отдельного UI для каждого blendable (гораздо сложнее делать это с единой структурой)

● Каждый экземпляр blendable имеет свой «вес», как и ассеты (см. LightPropagationVolumeBlendable), благодаря чему легко определить «вес» каждому свойству

● Разбиение крупной структуры упрощает работу с блупринтами, делая её эффективнее и лаконичнее.

Контейнер Blendables

Контейнер реализован как массив «весов» и ссылок на lendableInterface.

Открыв параметры PostProcessVolume и посмотрев на массив blendable, вы увидите массив «весов» с ссылками на ассет blendable. Значения «веса», как правило, располагаются в промежутке от 0 до 1. А ссылки указывают на ассеты, расположенные в пакете (созданном в браузере контента) или в объекте, содержащем массив blendables.

Blendables-контейнеры можно найти в настройках пост-обработки. Массив здесь имеет три элемента: LightPropagationVolumeBlendable (из объекта волюма), пока не используемый элемент массива и ссылка на ассет LPV0 из пакета. Значение веса равняются 1.0.

Когда вы создаете новый элемент массива, можно выбрать: создать blendable определенного типа (на данный момент только LightPropagationVolumeBlendable), либо использовать (LightPropagationVolumeBlendable, Material, Material Instance). Время от времени нам приходится создавать новые типы blendable (к примеру, Bloom, SceneColor, DepthOfField и другие). Ссылка может быть любого типа blendable (если реализовывается IBlendableInterface). Порядок в массиве обратен тому, как устроены слои, поскольку смешивание применяется к ним сверху вниз, перезаписывая прежние данные. Запомните, данные множества волюмов (или других объектов) комбинируются.

Примечание: Хорошим тоном считается иметь несвязанный «глобальный» PostProcessVolume с низким приоритетом на уровне. Для получения полного контроля над всем уровнем вы можете добавить несвязанный волюм с высоким приоритетом. Тогда, для проверки наличия эффекта у blendable, вам достаточно изменить его вес до 0 и обратно.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: