Post Process Materials в Unreal Engine 4

0
39
Многослойные Материалы в Unreal Engine 4

Post Process Materials (Материалы пост обработки) позволяют вам настраивать материалы, которые можно использовать с вашим post process, для создания визуальных эффектов экрана для получения эффекта разрушения, эффектов типа области или общего вида вашей игры, которые могут быть достигнуты только через Post Process Materials.

В следующих разделах вы узнаете о настройке Post Process Materials, доступных параметрах, которые вы можете использовать, а также некоторые примеры того, как настроить некоторые из ваших собственных материалов Post Process с использованием разных буферов, смешивания между Материалами Post Process и многое другое.

График Post Process

Движок уже имеет сложную пост-обработку, основанную на графике узлов пост-обработки. Post Processing Materials могут быть дополнительно вставлены в определенную позицию. Смотрите раздел Часто задаваемые вопросы для r.CompositionGraphDebug для получения дампа полного графика. График фактически не только выполняет пост-обработку, но и некоторые части освещения.

Большую часть времени график автоматически создает промежуточные цели рендеринга. Это означает, что если вы хотите сочетаться с прежним цветом, вам нужно выполнить смешение в шейдере (используя вход PostProcessInput0).

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

Применение Post Process Material

Через настройки пост-обработки (обычно определяемые с помощью вольюмов пост-процесса или настроек камеры) можно смешивать (так называемые) сменные активы. На данный момент только материалы и материальные экземпляры – это смешанные активы. Движок предоставляет несколько материалов для пост-обработки, но с помощью этой функции вы можете создать свою собственную пост-обработку без какой-либо помощи программиста.

Просто назначьте один или несколько материалов для процесса пост-обработки в разделе Blendables. Сначала нажмите +, чтобы добавить новые слоты, выберите материал в контент браузере и нажмите стрелку влево, чтобы назначить его. Порядок здесь не важен, а неиспользуемые слоты просто игнорируются.разделе Blendables ue4

Создание простого Post Process Material

Для обзора создания простого эффекта Post Process Material с нуля читайте Пример Post Process Material.создание простого эффекта Post Process Material ue4

Критические настройки для Post Process Materials

Материал пост – обработки должен указывать домен post process материала:домен post process материала ue4

Материал должен использовать только Emissive Color для вывода нового цвета. Кроме того, вы можете определить, где в ходе пост – обработки этот пропуск должен быть применен, и, если их несколько, в каком порядке они должны обрабатываться (Priority – приоритет):свойства PostProcess Material ue4

Смешивающееся местоположениеОписание
Before TonemappingPostProcessInput0 обеспечивает цвет сцены со всем освещением в HDR. Используйте это, чтобы исправить проблемы с временным сглаживанием и поиском GBuffer, например, глубиной, нормалями.
After TonemappingПредпочтительное место для работы, поскольку цвет LDR и, следовательно, требует меньшей точности и пропускной способности. Это происходит после отображения тонов и оценки цвета.
Before TranslucencyЭто даже раньше в системе импорта, чем «Before Tonemapping», прежде чем прозрачность сочетается со цветом сцены. Обратите внимание, что SeparateTranslucency составлен позже, чем обычная полупрозрачность.
Replacing the TonemapperPostProcessInput0 обеспечивает цвет сцены HDR, PostProcessInput1 имеет SeparateTranslucency (Alpha – это маска), PostprocessInput2 имеет входной сигнал с низким разрешением.

Типичный ввод постпроцесса поступает из прохода раньше. Этот цвет можно получить через выражение материала SceneTexture при использовании PostProcessInput0 . Использование SceneColor может не дать вам правильных результатов.

Смешивание между различными экземплярами материала

Применение Post Process Material

С вольюмами пост – обработки легко настроить мягкие переходы между несколькими материалами пост – обработки. Здесь мы используем один вольюм, который помечен как unbound, и один вольюм с большим радиусом смешивания (например, 1000):

Post Process установлен как Unbound ue4Post Process установлен как UnboundBlending A Volume1 ue4Post Process Bound Volume

В каждом вольюме мы указываем другой экземпляр материала того же материала. Цвет определяется как параметр материала, который позволяет использовать разные настройки для двух экземпляров материала.PP_Blended Material-ue4

Экземпляр материала RED ue4Экземпляр материала REDЭкземпляр материала green ue4Экземпляр материала GREEN

В зависимости от положения камеры установка одного вольюма используется и смешивается в диапазоне Blend Radius (радиуса смешения):

Unbound Post Process Volume Material Instance (RED) ue4Unbound Post Process Volume Material Instance (RED) установлен на 0.75Blend Radius - 1000 ue4Blend Radius – 1000
Post Process Volume Material Instance (GREEN) ue4Post Process Volume Material Instance (GREEN) установлен на 0.75

 

При движении камеры вы можете воспринимать мягкий линейный переход между двумя настройками эффектов.

На следующем рисунке показан верхний вид уровня, который имеет два вольюма. Большой несвязанный вольюм имеет экземпляр красного материала, а в маленьком вольюме есть зеленый экземпляр материала, указанный как сменный. Меньший вольюм имеет более высокий приоритет. Материальные параметры смешиваются в зависимости от положения камеры. Нечеткие границы определяются свойством Blend Radius, указанным в вольюмах, и расширяют форму вольюма.

При правильной настройке все смешение происходит так, как ожидалось.

Плохая настройка PPM ue4Плохая настройкаправильная настройка PPM ue4Хорошая настройка

Разница между обеими настройками – это значение по умолчанию, заданное для параметров материала (скалярного или векторного). Хорошая настройка имеет значения, которые заставляют проход казаться неэффективным (например, умножить на белый или lerp с 0).

В обеих настройках мы видим следующее: когда камера находится вне влияния любого из вольюмов, проход postprocess не получается (визуализируется серой сеткой). Если мы полностью находимся внутри одного из вольюмов, мы также видим правильное смешивание.

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

Хорошая настройка: переход в камеру с радиусом влияния хорошо скрыт, и мы видим плавный переход к цветам вольюма.

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

Выражение Материала «SceneTexture»

Вы можете добавить выражение материала SceneTexture в свой материал и выбрать, какую текстуру вы хотите ссылаться в свойствах выражения:выражение материала SceneTexture ue4

Узел имеет дополнительный вход и несколько выходов:узел материала SceneTexture ue4

UV вход позволяет указать, где вы хотите сделать поиск текстуры (используется только для вывода цвета). Выходной сигнал цвета представляет собой 4-канальный выход (фактическое назначение канала зависит от идентификатора текстуры сцены). Размер представляет собой 2-компонентный вектор с шириной и высотой текстуры. Обратное к этому (1/ширина, 1/высота) доступно на выходе InvSize. Это удобно при ссылках на соседние образцы, как в приведенном ниже примере:Выражение материала вычисляет разность глубин текущего пикселя на соседний пиксель ue4

Выражение материала вычисляет разность глубин текущего пикселя на соседний пиксель (например, In = 0,1 для возврата дельта к пикселю ниже).

Использование свойств GBuffer

GBuffer состоит из нескольких текстур, которые хранят материал (например, подповерхностный/зеркальный цвет, резкость…) и атрибуты объекта (например, нормаль, глубина) без освещения для вычисления затенения (как свет взаимодействует с материалом). В отложенном рендерере мы сначала выводим GBuffer, а затем вычисляем все освещение (отложенное) с атрибутами GBuffer. Если UE4 использует путь отложенного затенения (например, DirectX 11 или high end OpenGL), мы можем получить доступ к этим буферам во время пост-обработки.

Сглаживание обычно делает это немного сложнее, поскольку пиксель / тексель GBuffer больше не равен 1:1, связанный с выходным пикселем (смотрите раздел ниже).

CustomDepth

Эта отдельная функция позволяет маскировать определенные объекты путем рендеринга их в другой буфер глубины (называемый пользовательским буфером глубины). Это добавляет дополнительные draw calls, но не больше материалов. Реализация довольно дешевая, так как мы выводим только глубину. Эта функция может быть активирована на меши (например, свойства статик меши / настраиваемая Custom Depth):настройка Custom Depth ue4

В этой сцене мы активировали функцию на двух объектах, но без прохождения пост-обработки, визуализирующей контент, эта функция остается невидимой:без функции Custom Depth ue4

Здесь мы видим, как выглядит визуализация Custom Depth:визуализация CustomDepth ue4

Это материал, который мы использовали для его визуализации:CustomDepth Material-ue4

Шаблон CustomDepth 

Custom Depth Stencil – это расширение Custom Depth, где вы можете использовать шаблон или вырезку вашего рендированного объекта, чтобы затем делать визуально интересные вещи, как пример, который позволяет вам визуализировать объекты occlude, рисовать контуры объектов или только быть видимыми из некоторых углов обзора. Существует много возможностей с тем, что вы можете сделать, имея доступ к шаблону актера в вашей сцене. Использование следующих параметров для включения и назначения значений шаблона.

CustomStencilSettings UE4

В этой сцене Custom Depth активируется на трех объектах, и для каждого из них устанавливается значение Custom Depth Stencil Value, но без прохождения пост-обработки для визуализации контента эта функция остается невидимой.Custom Depth активируется на трех объектах ue4

После того, как вы настроите свой Материал Post Process, вы сможете визуализировать, как выглядит Custom Depth Stencil. Окклюдированные объекты визуализируются со случайно назначенным цветом на основе используемого значения Custom Depth Stencil Value.значение Custom Depth Stencil Value ue4

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

Это отнюдь не единственный способ использования Custom Depth Stencil, а в этой конкретной настройке материала шаблон разделяется так, что он использует значения от 1 до 255, причем маска используется для любого значения, которое находится между этими значениями, для этих значений создается случайный цвет, так что изменяется значение параметра шаблона Custom Depth так же, как и цвет, и, наконец, созданная маска используется таким образом, который только окрашивает шаблон, если объект закрыт.

Временное Сглаживание или почему GBuffer дрожит

Временное сглаживание (Temporal anti-aliasing) – уникальная функция UE4, которая значительно улучшает качество изображения с очень умеренной производительностью.

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

Здесь вы можете увидеть, как мы использовали custom depth input для визуализации силуэта вокруг конкретных объектов:custom depth input для визуализации силуэта ue4

Обратите внимание, что прежнее изображение не имеет сглаживания на силуэте, но в движении вы также увидите, что силуэт дрожит вокруг 1 пикселя. Это связано с тем, что временное сглаживание перемещает рендеринг всей сцены по суб-пикселю в каждом кадре. Несколько кадров вместе объединяются для создания окончательного сглаженного изображения. Однако мы можем перенести материал на более раннее место в графе пост-обработки, чтобы исправить эту проблему.

Вот результат:сцена до Tonemapper-ue4

Мы получаем стабильное и сглаженное изображение. В движении мы можем увидеть некоторые артефакты с временным сглаживанием. Эта функция использует буфер глубины для замены старых изображений. С границей, сделанной внутри объекта, она работает нормально, но вне объекта нам также нужно будет отрегулировать буфер глубины (еще не сделано, стоит дополнительной производительности), но в идеале этого не должно быть.

UV и ScreenPosition

С материалами пост-обработки вы можете посмотреть в выравниваемые по горизонтали буферы, но вам нужно знать правильные UVs. Выражение материала ScreenPosition с параметром сопоставления, установленным в ViewportUV, выводит UV с 0,0 в левом верхнем углу вьюпорта и 1,1 в правом нижнем углу. Напротив, использование отображения SceneTextureUV в этом выражении материала может дать вам разные результаты. Это связано с тем, что фактическая текстура (вернее это цель рендеринга) потенциально больше, чем область просмотра. Он может быть больше в редакторе, потому что мы разделяем эту текстуру для нескольких видовых экранов, и наибольшая степень используется для всех видовых экранов. Даже в игре он может быть больше в некоторых случаях (например, SceneCaptureActors может иметь меньший вьюпорт, черные рамки Matinee, Splitscreen, VR…). Опция SceneTextureUV дает UV для этой большей текстуры. Если вам нужно только относительное смещение (например, определение размера края пикселя), вам нужно масштабировать с нужным размером. Выражение материала SceneTexture имеет выходы для размера и обратного размера (эффективные и полезные для смещений пикселей). Чтобы проверить все это, вы можете использовать консольную переменную r.ViewPortTest, которая позволяет тестировать различные конфигурации видовых экранов.

Поиски текстуры с помощью фильтра 

Выражение материала SceneTexture имеет флажок, чтобы получать [билинейные] отфильтрованные запросы. Использование этого параметра может привести к более медленному рендерингу, поэтому его следует использовать только при необходимости. Многие текстуры экранного пространства не поддерживают фильтрацию (например, GBuffer). Не применяя это свойство, он позволяет движку сжимать данные, если это необходимо (упаковка предотвращает фильтрацию).

Замена Tonemapper

Можно переопределить встроенный движок tonemapper своим собственным с помощью сменной локации “Replacing the Tonemapper”. Это незавершенная работа, означающая, что она, скорее всего, изменится, и у нее еще нет всех функций.Замена Tonemapper ue4

Мы начали выставлять некоторые параметры настройки Post process на tonemapper, но эта часть, скорее всего, совсем немного изменится. Значения отображаются как параметры материала и должны иметь точное имя.

Векторный параметр:


<span class="typ">Engine</span><span class="pun">.</span><span class="typ">FilmWhitePoint</span>

Скалярный параметр:


<span class="typ">Engine</span><span class="pun">.</span><span class="typ">FilmSaturation</span>
<span class="typ">Engine</span><span class="pun">.</span><span class="typ">FilmContrast</span>

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

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

Необходимо устранить следующие проблемы:

  • Выражение материала SceneTexture
    • SeparateTranslucency не работает.
    • Некоторые поисковые запросы не работают в определенных проходах (например, некоторые из них не могут исправить, потому что они будут стоить слишком много производительности).
    • MaterialFunction может сообщить об ошибке, но ее все еще можно использовать в материале с доменом Post Process.
  • Материал
    • UV в PostProcesMaterial может быть не в диапазоне 0-1 (например, в редакторе при уменьшении размера видового экрана), это выравнивается с поиском, но затрудняет реализацию чего-то вроде эффекта виньетки.
    • Эскиз ресурса материала пост-обработки не выглядит правильным.
    • Вывод альфа еще не поддерживается (должен пройти через непрозрачность).
    • Материал предварительного просмотра в редакторе материалов выглядит неправильно.
    • Был случай, когда существенное изменение не привело к изменению пост-обработки. Обход проблемы: перезапустите редактор.
    • Контент Браузер должен позволять легко фильтровать материалы пост-обработки.
  • Смешивание
    • При смешивании двух вольюмов пост-обработки с радиусом смешивания можно видеть не мягкий переход. Этого можно предотвратить с помощью несвязанного вольюма с настройкой экземпляра материала, который представляет значение по умолчанию.

Вопросы – Ответы

  • Могу ли я использовать текстуру «Lighting only mode» в качестве инпута?Нет, у нас нет этих данных в качестве промежуточного шага. Для этого режима просмотра мы генерируем его, игнорируя цвета материала. Чтобы сделать это быстрым вариантом, потребуется реструктуризация значительной части кода рендеринга.
  • Почему SceneColor lookup показывает группировку, но при использовании PostProcessInput0 я этого не вижу? Когда используется SceneColor, мы создаем более низкую качественную копию сцены, чтобы разрешить поиск текстуры, которую мы в настоящее время пишем (общий случай – это рендеринг любой меши, где это невозможно). В Post Processing вы должны использовать PostProcessInput0.
  • Сколько я заплачу памяти за post process? Стоимость памяти зависит от разрешения экрана. Перед отображением тона мы используем HDR (8 байт на пиксель), после использования LDR (4 байта на пиксель).
  • Как снизить стоимость рендеринга для пост-обработки? Измерьте целевую платформу, держите подсчет поиска текстуры низким, делайте меньше математических операций и уменьшайте зависимость от зависимостей текстуры, избегайте рандомизированного поиска текстуры (может быть медленнее из-за промахов в кэш-памяти).
  • Сколько проходов я могу использовать? Каждый проход добавляет к стоимости исполнения. Попробуйте комбинировать проходы и активировать проходы только при необходимости. Общие характеристики игры, например, шум может быть добавлен к проходу движка для повышения производительности.
  • Сколько процессорной производительности я плачу за post process и за смешение? Смешивание материалов очень дешево. Все свойства экземпляров материалов смешиваются, и только один материал пост-обработки проходит с получением этих настроек.
  • Мне нужно использовать «Before Tonemapper», чтобы получить правильный TemporalAA. Когда я использую цвет, отображается тон и, следовательно, он выглядит по-другому. Как я могу это предотвратить? Нет простого решения. Вам нужно будет выполнить операцию обратного тонирования (дорогостоящую). Цвет может также отличаться в зависимости от адаптации. Вы можете выделить уровень EyeAdaptation для SceneTextures, чтобы компенсировать это.
  • Как я могу получить полный дамп графика пост-обработки?r.CompositionGraphDebug может записывать график в консоль. Пример:
FRenderingCompositePassContext:Debug 'PostProcessing' ---------
Node#1 'SceneColor'
    ePId_Output0 (2D 1136x768 PF_FloatRGBA RT) SceneColor Dep: 2
Node#4 'Velocity'
    ePId_Output0 (2D 1136x768 PF_G16R16 RT) Velocity Dep: 1
Node#2 'SceneDepthZ'
    ePId_Output0 (2D 1136x768 PF_DepthStencil) SceneDepthZ Dep: 1
Node#5 'MotionBlurSetup0MotionBlurSetup1'
    ePId_Input0: Node#4 @ ePId_Output0 'Velocity'
    ePId_Input1: Node#1 @ ePId_Output0 'SceneColor'
    ePId_Input2: Node#2 @ ePId_Output0 'SceneDepthZ'
    ePId_Output0 (2D 568x384 PF_FloatRGBA RT) MotionBlurSetup0 Dep: 2
    ePId_Output1 (2D 568x384 PF_FloatRGBA RT) MotionBlurSetup1 Dep: 1
Node#6 'QuarterResVelocity'
    ePId_Input0: Node#5 @ ePId_Output0 'MotionBlurSetup0MotionBlurSetup1'
    ePId_Input1:
    ePId_Output0 (2D 284x192 PF_FloatRGBA RT) QuarterResVelocity Dep: 1
Node#7 'VelocityBlurX'
    ePId_Input0: Node#6 @ ePId_Output0 'QuarterResVelocity'
    ePId_Input1:
    ePId_Output0 (2D 284x192 PF_FloatRGBA RT) VelocityBlurX Dep: 1
...