Отображение Рельефа без Касательного Пространства в Unreal Engine 4

0
13
Отображение Рельефа без Касательного Пространства в Unreal Engine 4

Отображение Рельефа (Bump mapping) – это старый трюк графических программистов (1978 Джеймс Блинн), который создает иллюзию рельефных поверхностей через скорректированное вычисление тени, не добавляя больше геометрии. Вместо использования нормали поверхности для затенения используется новая нормаль. Новая нормаль может быть отрегулирована с помощью функции 1d (например, шум Perlin, оттенки серого). Этот трюк намного быстрее реальных отображений перемещения с небольшими короткими событиями (например, силуэты, окклюзия, тени).

отображение рельефа UE4С отображением рельефаТолько рельефное отображение UE4Только рельефное отображениеотображение рельефа и нормали UE4С отображением рельефа и нормали

В режиме реального времени мы обычно используем вариант отображения рельефа (bump mapping), называемый normal mapping – отображением нормали (синеватые текстуры). Карты нормалей сохраняют цвет в каждом пикселе текстуры, который на самом деле является трехмерным вектором с длиной 1.

Существует два способа создания карты нормали:

  • Создайте карту нормали из изображения в оттенках серого. Предварительно сравните разность каждого пикселя с вертикальными и горизонтальными соседями. Преобразуйте два результирующих числа (производные) в единицу нормали и сохраните как цвет.
  • Запекайте нормаль из высокополигональной 3d-модели. Свяжите каждый пиксель текстуры с трехмерным расположением поверхности на высокополигональном объекте и сохраните его кодирование нормали как цвет.

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

Что делать, если мы хотим использовать функцию трехмерного оттенка серого, такую ​​как шум Perlin? Функция не требует никакого UV-отображения и может улучшить детализированный рендеринг поверхностей рельефа. Внедрение отображения рельефа, не требующее касательного пространства, делает это возможным.

ddx и ddy

Чтобы реализовать отображение рельефа без касательного пространства, мы добавили два новых выражения материала в редактор материалов: ddx и ddyКаждое из этих выражений возвращает приближение производной от его ввода. Графическое оборудование вычисляет эту примерную производную путем затенения двух пикселей и вычитания результатов (ddx = right – left, ddy = bottom – top).

Эти функции могут использоваться только в пиксельном шейдере и обычно полезны только в Material Functions для реализации больших эффектов.

НазваниеОписание
Inputs
ValueЗначение для вычисления производной.
Outputs
OutПримерная производная ввода. Тип будет соответствовать типу ввода. Например, скаляр приводит к скалярному выводу, 2d в 2d-выходе и так далее.
ddx и ddy вычисляются для блока 2×2 и поэтому показывают некоторые блокированные артефакты при использовании с высокочастотным входом.

Функции Материала, отражающие рельеф

Для реализации отображения рельефа в ваших материалах предусмотрено несколько Функций Материала, не полагаясь на карты нормали касательного пространства.

ComputeFilterWidth

функция ComputeFilterWidth UE4Эта функция использует ddx и ddy для вычисления того, как быстро изменяется значение по экрану. Это позволяет притушить процедурный шейдер на расстоянии, где он начнет шуметь. Затухание приводит к меньшему мерцанию, которое еще более заметно в движении и чрезвычайно важно для воспроизведения рельефа, поскольку зеркальность на рельефных поверхностях может создавать экстремальные артефакты сглаживания.

На следующих примерах показано, как на расстоянии может быть поникшей процедурная функция отображения рельефа.

Без фильтра FilterWidth UE4Без фильтра FilterWidth

С фильтром FilterWidth UE4С фильтром FilterWidth

НазваниеОписание
Inputs
InЗначение, для которого вычисляется filter width
Outputs
ResultКак быстро вход меняется с пикселя на пиксель

PerturbNormalLQ

Функция PerturbNormalLQ преобразует входной сигнал карты градаций серого в мировое пространство нормали. Однако, поскольку он использует ddx и ddy, у которых есть вышеупомянутые артефакты размером 2 × 2, нормаль мирового уровня выхода всегда низкого качества.

Низкое качество bump mapping UE4Низкое качествоВысокое качество bump mapping UE4Высокое качество
НазваниеОписание
Inputs
BumpСкалярное значение рельефа (оттенки серого), из которого вычисляется нормаль мирового пространства.
Outputs
WS NormalВычисляемая нормаль мирового пространства
Для того, чтобы использовать нормаль мирового пространства, которую выводит эта функция, настройка нормали касательного пространства на узле Material должна быть false.
Эта функция существует только как ссылка и не отображается в Библиотеке Материальных Функций. Вместо этого используйте функцию PerturbNormalHQ.

PerturbNormalHQ

Функция PerturbNormalHQ обеспечивает более высокое качество, вычисляя более точную производную, чем ddx и ddy. Он делает это, вычисляя скалярную функцию несколько раз, используя три позиции образца.

НазваниеОписание
Inputs
Bump one pixel rightСкалярное значение рельефа (оттенки серого) на один пиксель справа от текущей позиции.
Bump centerСкалярное значение рельефа (оттенки серого) в текущей позиции.
Bump one pixel downСкалярное значение рельефа (в оттенках серого) на один пиксель вниз от текущей позиции.
WS NormalФакультативный. Нормаль морового пространства, которая сочетается с картой рельефа. Нормаль касательного пространства может быть преобразована в нормаль мирового пространства с выражением векторного преобразования.
Outputs
WS NormalСовокупная нормаль мирового пространства
Для того, чтобы использовать нормаль мирового пространства, которую выводит эта функция, настройка нормали касательного пространства на узле Material должна быть false.

PreparePerturbNormalHQ

Функция PreparePerturbNormalHQ вычисляет три позиции образца, необходимые для функции PerturbNormalHQ, для вычисления нормали мирового пространства.Отображение Рельефа без Касательного Пространства в Unreal Engine 4

НазваниеОписание
Inputs
ValueСкалярное значение рельефа (оттенки серого) в текущей позиции.
Outputs
Value one pixel rightСкалярное значение рельефа (оттенки серого) на один пиксель справа от текущей позиции.
ValueСкалярное значение рельефа (оттенки серого) в текущей позиции.
Value one pixel downСкалярное значение рельефа (в оттенках серого) на один пиксель вниз от текущей позиции.
FilterWidthОн также вычисляет ширину фильтра, которая полезна для уменьшения деталей на расстоянии.

Одна единственная функция вместо 3 функций

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

Использование текстур

Текстуры могут использоваться с материальной функцией отображения рельефа для лучшей производительности; однако артефакты могут быть введены из-за того, как графическая карта обрабатывает фильтрацию текстур. Обычно фильтрованный цвет интерполируется с линейной интерполяцией, производная которого является константой. Это означает, что использование текстуры в градациях серого дает вам нормали, которые не будут плавно интерполировать поверхность.

Заметки

Описанный метод основан на работах Мортена С. Миккельсена (см. Ссылки).

Представление

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

Вопросы

  • Flipped / Mirrored (сложенные / отраженные) UV пока еще регулируются неправильно.

Будущая работа

Этот метод может быть использован для замены явного хранимого касательного пространства. Чтобы идти в этом направлении, нам нужно получить больше опыта. Текущая реализация не только позволяет художникам использовать это для сопоставления рельефа, но также предоставляет способ проведения исследований.

Рекомендации

  • Отображение Bump Unparametrized Surfaces на графическом процессоре (Morten S. Mikkelsen) Отображение Bump Unparametrized Surfaces на графическом процессоре.
  • Производные Карты (блог Mikkelsen и 3D Graphics) mmikkelsen3d.blogspot.com/2011/07/derivative-maps.html