Проблема базового WorldAlignedNormal
В Unreal Engine 5 есть две версии трилпланарных нормалей: быстрая WorldAlignedNormal и более точная, но дорогая WorldAlignedNormal_HighQuality (используется по умолчанию).
Базовая версия смешивает нормали, проецированные по осям мира (XY, XZ, YZ), прямо в World Space. Для каждой проекции берутся нормали из текстуры и умножаются на соответствующие компоненты маски (NormalMask_R, NormalMask_G, NormalMask_B), затем линейно смешиваются.
Такой подход даёт проблему: нормали остаются «привязаны» к осям мира и не учитывают реальный поворот поверхности объекта. На наклонённых плоскостях итоговый вектор нормали теряет правильное пространственное направление относительно геометрии — рельеф «плывёт», а освещение выглядит неточно.
Автор отдельно подчёркивает важный момент: перед смешиванием нормали ослабляются по весам (компонентам маски), а не просто лерпятся как единичные векторы. Это нужно, чтобы более слабая проекция вносила меньше деталей, а доминирующая — больше, обеспечивая плавный переход и сохранение контраста. Но даже при корректном взвешивании проблема остаётся: смешивание происходит в неверной системе координат.
Как работает WorldAlignedNormal_HighQuality
HighQuality-версия решает ключевую проблему: перед смешиванием все нормали приводятся к общей системе координат, согласованной с ориентацией конкретной поверхности.
Процесс на примере:
- Берутся нормали из трёх проекций (XY, XZ, YZ), например: Nxz(1, 0, 0), Nyz(-0.87, 0.3, 0.4), Nxy(1, 0, 0).
- Из геометрической нормали поверхности извлекаются маски (например, NormalMask_R = 0.81, NormalMask_B = 0.5) — они задают веса проекций.
- Строится ортонормальный базис для текущей поверхности (локальное Tangent Space), с учётом её реального поворота в World Space.
- Нормали из текстур сначала подготавливаются к этому базису: инвертируется компонент Y, а компонент X при необходимости домножается на +1 или -1 в зависимости от знака геометрической нормали по соответствующей оси. Это учитывает ориентацию лица относительно проекции.
- После этого нормали переводятся в новый базис и только затем смешиваются по весам масок.
В стандартной реализации UE часть коррекции делается на этапе переноса нормали из tangent space, а не при построении базиса (например, инверсия Y или порядок векторного произведения при создании третьего ортогонального вектора).
Результат HighQuality-подхода
Итоговое отличие:
- WorldAlignedNormal (base) — смешивает нормали в координатах мира, игнорируя реальный поворот поверхности. На повёрнутых и криволинейных объектах рельеф и направление нормали искажаются, переходы между проекциями заметны.
- WorldAlignedNormal_HighQuality — сначала приводит все проекции к единому базису, согласованному с поверхностью, и только потом смешивает. Рельеф и освещение остаются стабильными и предсказуемыми даже на сложной геометрии.
Автор модернизировала весь набор функций трилпланарной проекции в UE5: WorldAlignedTexture_Modernized, WorldAlignedNormal_Modernized и WorldAlignedNormalHQ_Modernized теперь синхронизированы по возможностям:
- поддержка Local Space;
- общая точка проекции;
- кастомный поворот проекции и зеркалирование.
Благодаря этому трилпланарный маппинг ведёт себя предсказуемо на любых объектах и даёт чистое, бесшовное освещение.
Выводы
- Базовый WorldAlignedNormal смешивает нормали в World Space и даёт искажения на повёрнутых поверхностях.
- Корректное взвешивание нормалей по маскам важно, но без общей системы координат проблему не решает.
- WorldAlignedNormal_HighQuality сначала приводит нормали к базису поверхности, затем смешивает их по весам.
- HQ-версия даёт стабильный рельеф и освещение, особенно на сложной и криволинейной геометрии.
- Модернизированные функции UE5 поддерживают Local Space, общую точку проекции, поворот и зеркалирование, делая трилпланар продакшн-готовым.