Unreal Engine
February 24, 2023

Как работает Custom Depth и Custom Depth Stencil в Unreal Engine 4

Superyateam выясняет, как работают ноды Custom Depth и Custom Depth Stencil.

Вы когда-нибудь задавались вопросом, как реализовать occlusion masking в UE4? Я хотел использовать этот эффект для своей игры и потратил некоторое время на «гугление». И в итоге набрел на раздел Post Process material в документации Unreal Engine. Возможно, вы тоже там побывали. В Интернете есть множество руководств по использованию нод Custom Depth и Custom Depth Stencil Value. Лично мне очень помогло это видео на youtube:

Туториалы от Тома Лумана тоже очень хороши: https://www.tomlooman.com/the-many-uses-of-custom-depth-in-unreal-4/.

Но вот чего я не нашел, и в чем мне пришлось разбираться самостоятельно, так это — КАК ИМЕННО работают Custom Depth и Custom Depth Stencil. Я имею в виду не то, как работает сам шейдер, а то, какие значения возвращают эти ноды. В официальной документации дается расплывчатое описание этих нод, что не очень помогает (я уже обсуждал качество официальной документации здесь).

Custom Depth

Я начну с ноды Custom Depth. В инструкции сказано:

Эта отдельная функция позволяет маскировать определенные объекты путем рендеринга их в другой буфер глубины (называемый Custom Depth буфером).

Честно говоря, мне это ни о чем не говорит: непонятно, какой диапазон значений возвращает нода, и что такое custom depth.

Насколько я понимаю, Custom Depth возвращает расстояние в единицах измерения UE4 (см) от камеры игрока до объекта с включенной опцией Custom Depth Enabled. Другие объекты не имеют никакого значения в этом вспомогательном буфере, и нода возвращает для них положительную бесконечность. Чтобы доказать подобное утверждение, проведем эксперимент:

Поместим объект (шар) с включенной функцией Custom Depth за кубом на этой сцене:

Рассматриваемый эксперимент

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

  1. Сфера с включенной функцией. Custom Depth равна Scene Depth.
  2. Куб перед сферой. Scene Depth куба меньше, чем Custom Depth сферы.
  3. Объекты с отключенной функцией (по умолчанию). Custom depth возвращает положительную бесконечность, а Scene Depth возвращает фактическое расстояние до таких объектов.

ПРИМЕЧАНИЕ: Здесь есть небольшая проблема. Случай #2 логически совпадает со случаем #3: в обоих случаях Scene Depth меньше, чем Custom Depth. Чтобы отличить эти случаи и просто ради эксперимента, мы можем сравнить custom depth с некоторым произвольным значением, которое меньше положительной бесконечности, но больше расстояния до любого объекта в сцене. Пусть это будет 10 метров (1000 единиц ue4):

Постобработка материала с помощью ноды Custom Depth
Сцена с материалом Custom Depth

Видите? У нас получилось что-то вроде Occlusion Masking. Конечно, вам нужно будет отполировать его перед использованием в продакшене, но, по крайней мере, становится понятно, что такое Custom Depth.

Custom Depth Stencil

Другой полезной нодой является Custom Depth Stencil. Вы можете использовать ее для того, чтобы различать объекты в сцене. По умолчанию она возвращает 0 (ноль) для всех объектов и пользовательское значение, установленное вручную в настройках меша.

Постобработка материала с помощью ноды Custom Depth Stencil
Постобработка материала с помощью ноды Custom Depth Stencil

Я установил значение Custom Depth Stencil, равное 50 для сферы слева и 100 для той, что справа. Я также расширил блюпринт материала для случая, когда функция Custom Depth на меше включена, и проверил значения Custom Depth Stencil. Теперь, чтобы выяснить, какого цвета должна быть сфера, достаточно выполнить два оператора «if». Если значение Custom Depth Stencil равно 50, то цвет будет красным. Если 100, то цвет — белый.


P. S. Важный апдейт от 29.02.2020

Оказалось, что нода CustomDepth возвращает 100000000 см, а не положительную бесконечность, когда эта опция не включена на объекте. (Ниже привожу тестовый Post Process материал, который, вроде как, это доказывает). Я не смог найти исходный код, откуда взято это число. Поэтому буду благодарен, если вы укажете мне, где оно определено.

Тестовый Post Process материал

Оригинал: https://superyateam.com/2019/06/17/custom-depth-and-custom-depth-stencil-in-ue4/