Полезное
Мы Вконтакте
Discord канал
Vignette – Виньетирование. Эффект затемнения по краям изображения при использовании обычных линз. Высококачественные линзы стараются компенсировать его.
Настройки виньетирования можно найти в настройках постобработки под вкладкой Scene Color.
Свойство | Описание | ||
Vignette Intensity | Обеспечивает затемнение по краям экрана. Не влияет на блюм (из-за возможных проблем с производительностью, но при необходимости, можно изменить настройку). Возможное использование: симуляция несовершенств камеры.
|
В Unreal Engine, термин Цветокоррекция (Color Grading) включает в себя Тональную компрессию (Tone Mapping; трансформация HDR в LDR) и Коррекцию цвета (Color Correction; трансформация из гаммы LDR в гамму монитора).
Цель тональной компрессии в том, чтобы перевести цвета широкого диапазона HDR (Высокий Динамический Диапазон) в более узкий LDR (Низкий Динамический Диапазон). Это позволяет монитору правильно отображать цвета. Процесс происходит после обычного рендеринга в процессе постобработки.
Глобальная тональная компрессия – это функция, имеющая три входа (RGB) и три выхода (RGB). Локальная, помимо этого, учитывает свойства окружающих пикселей, что, естественно, ведет к большему количеству вычислений (и падениям производительности). В идеале, тональная компрессия обязана сохранять цвет пикселя даже в том случае, если он крайне яркий.
Следующий график показывает, как каждый канал в диапазоне от 0 до 5 преобразовывается в диапазон от 0 до 1:
В данном случае используется функция:
Заметьте, что светлые цвета постепенно становятся светлее, но гораздо медленнее, нежели темные. Черный остается черным и это наиболее линейная часть кривой, которая несколько круче, чем должна быть. Это приводит к увеличению контраста, что вполне нормально и ожидаемо при использовании тональной компрессии. Для получения хорошего результата, исходное изображения должно иметь больше динамики в яркости (HDR).
Представленная функция уже имеет две константы. Дополнительные переменные могли бы увеличить гибкость настроек, но выведение хорошей, с точки зрения качества/гибкости/производительности, функции довольно сложно. По этой причине мы решили придерживаться простой формулы и изменять уже получившееся LDR-изображение.
Переведя цвета из HDR в ограниченный диапазон, мы получили выразительные темные цвета. Что касается светлых, то их мы можем изменять по желанию. Этот метод прост для понимания, гибок в настройке и обладает едва ли не постоянной производительностью.
Свойство | Описание |
Scene Color Tint | Цвет, являющийся фильтром, применяемым к HDR-сцене. |
Tonemapper Toe Factor | Корректирование оттенков темных цветов. Значения в промежутке [0.0, 1.0] |
Коррекция цвета реализована как таблица поиска (lookup tables; LUTs). Причем, вместо использования трех 1D-таблиц, у нас применяется всего лишь одна, но 3D-таблица, благодаря этому становятся возможным более сложные и комплексные трансформации цвета (такие как обесцвечивание).
Следующее изображение показывает, как таблица нейтрального цвета размером 16x16x16 развернута в текстуру размером 256×16 (схоже с браузером текстур):
Измененная текстура может выглядеть так:
Для того, чтобы использовать таблицу поиска (LUT), вам необходимо применить LUT-текстуру к волюму постобработки.
Свойство | Описание |
Color Grading Intensity | Свойство, регулирующее силу цветокоррекции. |
Color Grading LUT | LUT-текстура, используемая как таблица при цветокорреции. |
Инструкция:
Возможны различные изменения цвета. Вот несколько примеров:
Bloom – это особое явление, наблюдаемое в реальном мире, которое можно использовать для придания эффекта свечения ярким участкам изображения. Свечения можно заметить, если смотреть на яркий и светлый объект, расположенный на гораздо более темном фоне. В этом случае наблюдаются и другие эффекты, такие как блики, но они не входят в понятие обычного Блума.
Наши дисплеи (ТВ, TFT и другие) обычно не поддерживают HDR (Высокий Динамический Диапазон, High Dynamic Range), поэтому мы не можем по-настоящему рендерить крайне яркие объекты. Вместо этого, мы симулируем сопутствующие эффекты, которые воспринимаются нашими глазами (подповерхностное рассеивание; subsurface scattering). Эффект, вероятно, физически не особо правильный, но он помогает передать необходимую яркость объекта и привнести реализма в LDR-изображение (Низкий Динамический Диапазон; Low Dynamic Range).
Свечение можно реализовать с единичным размытием по Гауссу. Но для лучшего качества, комбинируются несколько подходов с различным радиусом. А для лучшей производительности – создается большее размытие при меньшем разрешении. В UE3 у нас имелось 3 размытия по Гауссу в разрешении ¼, 1/8, 1/16. Теперь же – 5 видов. От Blur1 до Blur5, от ½, до 1/32, соответственно. Более того, если потребуется, можно добавить Blur0 для исходного разрешения.
Варианты размытия комбинируются несколькими подходами, дабы достичь гибкости и высокого качества: для лучшей производительности, размытия высокого разрешения (низкие значения свечения) должны использоваться редко и в малом количестве, а при большом размытии стоит использовать меньшее разрешение (высокие значения).
Свойство | Описание |
Intensity | Масштабирование цвета всего bloom-эффекта (линейно). Возможное использование: продолжительное исчезновение или появление, затемнение. |
Threshold | Определяет, как много единиц яркости необходимо цвету для создания свечения. В дополнение к порогу (Threshold), существует часть, где цвет частично подвергается воздействию эффекта. Чтобы передать все цвета сцены в свечении, требуется использовать значение -1. |
Tint | Модификатор яркости и цвета каждого эффекта bloom. |
Size | Размер в процентном соотношении от ширины изображения. Если вам необходим больший размер, используйте меньшее разрешение размытия (большее значение блюма). |
Bloom Dirt Mask использует текстуру для выделения определенных зон на дисплее. Это может использоваться для создания дефектов камеры или впечатляющего HDR-эффекта
Свойство | Описание |
Dirt Mask | Texture2D используется в качестве маски. Рекомендуется использовать две текстуры, так как это помогает лучше распределять пространство экрана. Текстура низкого разрешения подходит для имитации грязи на камере, так как навряд ли она попадет в фокус и все равно будет размытой. Создать текстуру можно с помощью фильтра Photoshop Lens blur. Хроматическая аберрация может помочь улучшить эффект, однако, остерегайтесь артефактов сжатия. И, кстати, это свойство не может участвовать в смешивании. Но не волнуйтесь: мы планируем в скором времени сделать настройки более гибкими с помощью шейдеров. |
Dirt Mask Tint Color | Это свойство можно использовать для изменения цвета маски, её яркости. |
Dirt Mask Intensity | Увеличивает контрастность эффекта (линейно). |
Blendables – ассет, имеющий свойства, позволяющие ему аккуратно смешиваться с другими такими же. Мы в Epic Games чаще всего используем Blendables для PostProcessMaterials, но эта система подходит для всего, что зависит от вида (т.е. в основном, для связанного с камерой).
Ассеты Blendable уже реализованы в движке, хотя и используются только для PostprocessMaterils / PostprocessMaterialInstances. Тем не менее, по идее, основная задача Blendable – предоставить возможность смешивать произвольные данные (как наиболее подходящие примеры: линейные значения, цвета) для выдачи результатов любой из подсистем.
К примеру, в случае со сплит-скрином вы сможете раздельно реализовывать постобработку для каждого из экранов.
Blendable – это объект, который имеет IBlendableInterface, в данный момент реализованный следующими типами ассетов:
Контейнер Blendable находится в PostProcessSettings, которые имеются у следующих объектов:
Ассет LightPropagationVolumeBlendable создан как пример создания нового blendable и замены существующих PostProcessSettings. Эта система работает хорошо с малым количеством настроек, в других случаях нужна более сложная система.
Blendable в контент-браузере имеют собственную категорию – «Blendable». Можно использовать кнопку «Add New» или отфильтровать ассеты по категориям.
Плюсы новой системы:
Контейнер реализован как массив «весов» и ссылок на 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 прямо в блупринте. Так как блупринты, по сути, форма программирования, передача параметров в UI равносильна их жесткому определению в коде. Хотя последний метод считается менее гибким для других разработчиков.
LightPropagationVolumeBlendable описывает свое отображение в редакторе. Неважно, был ли создан blendable в контент-браузере (слева) или в объекте (т.к. волюм постобработки): пользовательский интерфейс не меняется. Хорошим тоном считается давать каждому свойству свой чек-бокс (weight=0 или weight=1), а всей структуре – смешанный вес.
Примечание: Параметры LightPropagationVolumeBlendable до сих пор существуют в PostProcessSettings для обратной совместимости. Однако мы планируем удалить их и сделать blendables одним методом.
На данный момент мы советуем скопировать плагин 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 отображается смешанные значения, что полезно при отладке.
Движок уже имеет полноценную постобработку, основанную на графе узлов постобработки. Помимо этого можно, в некоторых особых случаях, использоват, материалы постобработки.
В данный момент граф занимается не только процессом постобработки, но и освещением. Со временем, мы планируем сделать большее количество вещей, изменяемых через редактор материалов.
Граф создает временные 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» к своему материалу и выбрать, какую текстуру необходимо использовать:
Нода имеет необязательный вход и несколько выходов:
UV-вход определяет, в каком месте вы хотите сделать lookup-текстуру (используется только для цветового выхода). Выход «Color» состоит из четырех выходов, выделенные (в зависимости от ID текстуры сцены (Scene Texture)) под отдельные каналы. Выход «Size» – это 2 компонента вектора: ширина и высота текстуры. Обратную им величину (1/ширина, 1/высота) можно получить на выходе «InvSize».
Это полезно в подобных случаях:
В примере выше, блок материала просчитывает разницу глубины данного пикселя и соседнего.
G-буфер состоит из нескольких текстур, которые содержат материалы (к примеру, подповерхностный/отраженный цвет, шероховатость; subsurface/specular color, roughness) и атрибуты объекта (нормали, глубина) без данных об освещении и его взаимодействии с материалом. В различных рендерерах мы сначала рендерим G-буфер, затем просчитываем все освещение (отложенное) с атрибутами G-буфера. Так как UE4 использует отложенное затенение (DirectX 11 или последние версии OpenGL), мы получаем доступ к данному буферу в процессе постобработки.
Но здесь нам несколько мешает сглаживание, поскольку пиксель/тексель G-буфера больше не относится как 1:1 с итоговым пикселем (смотрите секцию ниже).
Эта особенность предоставляет возможность скрывать определенный объект путем его рендера в буфер глубины, называющийся пользовательским буфером глубины (Custom Depth Buffer). Этот метод увеличивает количество вызовов отрисовки при том же количестве материалов. Рендеринг получается крайне дешевым, поскольку на выходе лишь глубина.
Функция активируется для мешей («Static Mesh Properties / Render Custom Depth»; Настройки статичного меша/Рендер пользовательской глубины):
В этой сцене мы активировали пользовательскую глубину для двух объектов, но без визуализирующего прохода постобработки, её невозможно заметить.
Здесь вы можете посмотреть пользовательскую глубину:
А это материал, который мы использовали для визуализации:
Временное сглаживание – это уникальная особенность UE4, которая отлично влияет на качество изображения, потребляя при том среднее количество ресурсов.
По умолчанию, материал постобработки вставляется в конец графа (после тоновой компрессии). Это означает, что вы получаете финальное LDR-изображение после тоновой компрессии, цветокоррекции и применения временного сглаживания. И это лучший вариант для простых эффектов постобработки с точки зрения производительности и легкости использования.
Здесь вы можете увидеть, как мы использовали вход пользовательской глубины для визуализации силуэта определенных объектов:
Заметьте, что на предыдущем изображении края объекта не были сглажены. Но во время движения вы заметите, что силуэт объекта «дрожит». Это происходит по той причине, что временное сглаживание перемещает рендеринг все сцены каждый кадр на каждый пиксель. Из нескольких кадров, скомбинированных вместе, получается финальное сглаженное изображение. Хотя, мы, конечно, можем переместить материал в более раннее положение в графе постобработки для исправления подобных артефактов.
Вот результат:
Мы получили стабильное и сглаженное изображение. Правда, как говорилось, в движении можно наблюдать появление артефактов, связанных с временным сглаживанием. Из-за использования буфера глубины для перепроецирования старого изображения. В случае рендеринга краев внутри объекта, все работает хорошо, но как только мы назначаем рендер краев поверх объекта, появляются артефакты. Для того, чтобы их избежать, требуется настроить буфер глубины (эта функция пока не реализована полностью и потребляет слишком много ресурсов).
Заметьте, что TemporalAA (Временное сглаживание) еще в процессе разработки.