Полезное

Мы Вконтакте

Discord канал

Blendables

Добавлено Окт 12 2015

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 и обратно.

Blendable в пакете: как часть объекта (к примеру, волюма)/динамически созданные в блупринте

Это ваш выбор, но мы советуем метод с пакетом (ссылаться на ассет в пакете), так как это позволяет минимизировать конфликты в системе контроля версий. Для максимальной гибкость, конечно, можно создавать blendable прямо в блупринте. Так как блупринты, по сути, форма программирования, передача параметров в UI равносильна их жесткому определению в коде. Хотя последний метод считается менее гибким для других разработчиков.

LightPropagationVolumeBlendable описывает свое отображение в редакторе. Неважно, был ли создан blendable в контент-браузере (слева) или в объекте (т.к. волюм постобработки): пользовательский интерфейс не меняется. Хорошим тоном считается давать каждому свойству свой чек-бокс (weight=0 или weight=1), а всей структуре – смешанный вес.

Примечание: Параметры LightPropagationVolumeBlendable до сих пор существуют в PostProcessSettings для обратной совместимости. Однако мы планируем удалить их и сделать blendables одним методом.

Как создать свой собственный Blendable (в C++)

На данный момент мы советуем скопировать плагин LightPropagationVolumeBlendable. После создания ассета вы можете отбирать данные таким же способом, каким это делает Light Propagation System. Метод GetSingleFinalDataConst() используется для получения данных после их смешивания. Для лучшей производительности, возможно, вы захотите избежать ненужных вызовов этой функции (слишком часто).

Блупринт

Блупринт AddOrUpdateBlendable обеспечивает удобный доступ к контейнеру blendables. Вы передаете объекту, содержащему контейнер blendables, вес и ссылку на blendable. При наличии этих параметров они просто обновляются. Элементы контейнера не удаляются, так как это может привести к нарушению работы другого кода и сборки мусора. Удаление элементов не является необходимостью, ввиду малых затрат ресурсов.

Здесь вы можете увидеть, как ссылаться на ассет blendable в контент-браузере:

Переменная ‘BlendableVar’ типа LightPropagationVolumeBlendable (Object Reference) используется в качестве ссылки на ассет под названием LightPropagationVolumeBlendable ‘LPV0′.

С блупринт-функцией ConstructObjectFromClass вы можете создавать новый blendable непосредственно в блупринте. Соединяя вход «Outer» нового объекта с объектом, имеющим контейнер blendable, вы добьетесь аналогичного поведения, если бы создавали объект в UI.

Здесь мы создаем объект типа LightpropagationVolumeBlendable, получаем настройки и определяем членов с функцией SetMembersIn.

Примечание: Вам понадобится вручную определить флаг как true (установленный чек-бокс), иначе свойство с тем же именем не будет выбрано.

В качестве эксперимента вы можете использовать showflag VisualizeLPV (в редакторе: Visualize/Light Propagation Volume) для отображения смешанных параметров. Это реализовано в коде на C++ и только для данного типа blendable, но позже мы реализуем подобную возможность для каждого свойства без необходимости привносить в код какие бы то ни было изменения.

Showflag Visualize отображается смешанные значения, что полезно при отладке.

В будущем

  • Контекстно-зависимый просмотр пока не работает при работе с функцией AddOrUpdateBlendable (совет: отключайте чек-бокс ‘context sensitive’).
  • Мы собираемся преобразовать все PostprocessSettings в объект, как и LightPropagationVolumeBlendable, поэтому однажды PostProcessSettings могут быть удалены. Старые уровни конвертируются без потери данных при загрузке. Чтобы избежать спама пакетов контента, мы предпочитаем создавать объекты как часть уровня.
  • Мы хотим еще лучше отладить взаимодействие блупринтов для упрощения использования.
  • Сделаем доступным Blendable массив в настройках сцены и всего проекта.
  • Для придания большей прозрачности, получаемой при их применении необходимы виды отладки, показывающие веса, имена и типы ассетов/объектов.
Добавил: Flakky Категория: Пост-обработка


Комментарии

На данный момент не добавлено ни одного комментария.

Оставить комментарий

Вы должны войти, что бы оставлять комментарии.

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