Blendables в Unreal Engine 4

0
5
смешивания в ue4

Blendable – это актив, который обладает свойствами, которые могут быть легко интерполированы (смешаны) с другими активами blendables. В основном мы использовали blendables для PostProcessMaterials, но система может использоваться для всего, что должно быть в зависимости от вида (обычно в зависимости от положения камеры).

Blendable

У нас есть Blendables в движке лишь некоторое время, но используется только для PostprocessMaterils / PostprocessMaterialInstances. Но концепция имеет более обобщенную цель, так как позволяет смешивать произвольные данные (линейные значения или цвета лучше всего подходят) некоторым конечным данным. Любая подсистема может захватывать данные в представлении и влиять на рендеринг. Поскольку данные смешиваются для просмотра, это означает, что в корпусе splitscreen у вас могут быть разные настройки, смешанные для каждого вида (например, индикатор удара влияет на post process).

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

  • PostprocessMaterials (todo: link)
  • PostprocessMaterialInstances (todo: link)
  • LightPropagationVolumeBlendable (см. Ниже)

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

  • PostProcessVolume
  • PostProcessComponent
  • SceneCaptureActor
  • CameraComponent

Актив LightPropagationVolumeBlendable был создан, чтобы продемонстрировать, как создавать новые blendables (смешивания) и показать, как мы можем заменить существующие PostProcessSettings. Существующая система работала хорошо, когда она была небольшой, но большое количество настроек показало необходимость в более сложной системе.создать смешиваемые активы ue4

Смешиваемые активы отображаются в контент браузере в категории Blendable. Вы можете использовать функцию Add New или же фильтровать по этой категории.

Преимущества новой системы:

  • Легче расширять и поддерживать с изменениями движка (не нужно менять одну центральную структуру, может быть в ее собственном модуле)
  • Направление по пакетам позволяет настраивать контент без доступа к уровню (контроль версий)
  • Направление означает, что один актив может быть повторно использован во многих случаях (меньше избыточности, большей мощности)
  • Пользовательский интерфейс для каждого из возможных вариантов (гораздо сложнее сделать с одной структурой)
  • Каждая ссылка Blendable может иметь свой собственный вес, актив может иметь вес (см. LightPropagationVolumeBlendable), и вес на каждую из них будет легко сделать.
  • Разрушение большой структуры делает взаимодействие с blueprints более эффективным и простым.

Контейнер Blendables

Контейнер реализуется как массив весов и ссылок IBlendableInterface.

Когда вы открываете параметр PostProcessVolume и смотрите на массив blendables, вы видите массив весов со ссылками на смешанный актив. Весы обычно находятся в диапазоне 0..1, и ссылка может быть связана с активом, находящимся в пакете (созданным с помощью контент браузера) или живущим в объекте, который содержит массив blendables.Контейнер Blendables ue4

Контейнер blendables можно найти в настройках Post Process (здесь в вольюме Post Process). Массив здесь имеет три элемента: LightPropagationVolumeBlendable (живет в объекте вольюма), еще не использованный элемент массива и ссылку на актив (живущий в пакете) под названием LPV0. Весы равны 1.0 для обоих компонентов.

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

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

Смешивается в пакете, как часть объекта (например, вольюм) или динамически создается в blueprint

Это ваш выбор, но мы предлагаем пакет (ссылающийся на именованный актив в пакете), поскольку он позволяет упростить массовые корректировки в дальнейшем, сводя к минимуму конфликты управления версиями. Для максимальной программируемости можно создать blendable в blueprint. Поскольку blueprints представляют собой форму программирования, это аналогично установке параметров в пользовательском интерфейсе или жесткому кодированию их в коде. Метод кода более вовлекается и усложняет настройку других.LightPropagationVolumeBlendable в редакторе ue4

Детали LightPropagationVolumeBlendable, как они видны в редакторе. Независимо от того, была ли добавлена ​​blendable в контент браузере (слева) или создана в объекте (например, post process volume), пользовательский интерфейс аналогичен. Хорошая практика – предоставить каждому свойству флажок (вес = 0 или вес = 1) и дать всей структуре blend weight.

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

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

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

Blueprint

Функция blueprint AddOrUpdateBlendable раскрывается там, где вы можете найти PostProcessSettings. Он обеспечивает удобный доступ к контейнеру blendables. Вы передаете объект с контейнером Blendables, весом и ссылкой на blendable. Если ссылка уже была найдена в контейнере, она просто обновляет вес. Она не удаляет элементы контейнера, поскольку это может путать другой код, перемещающийся по контейнеру, и имеет последствия для сбора мусора. Нет реальной стоимости исполнения, которая может быть смешана с весом 0, так как удаление элемента никогда не понадобится.

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

смешивания в ue4

Переменная «BlendableVar» типа LightPropagationVolumeBlendable (Object Reference) используется для ссылки на объект LightPropagationVolumeBlendable, называемый «LPV0».

С помощью функции построения объекта ConstructObjectFromClass вы можете создать новый blendable в blueprint. Установив Outer нового объекта на объект с контейнером blendables, вы получите такое же поведение, как если бы вы создали объект в пользовательском интерфейсе (создайте blendable как часть объекта).создать новый blendable в blueprint ue4

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

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

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

 

В VisualizeLPV отображаются смешанные значения, которые делают его полезным для отладки.

В будущем

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