Соглашения о Normal Maps: OpenGL vs DirectX объяснено
Почему ваша normal map выглядит инвертированной в Unreal, но нормально в Unity — простое объяснение соглашений оси Y в касательном пространстве с конкретными решениями.
Вы загружаете normal map в Unreal, и поверхность освещается так, как будто солнце светит снизу. Вы загружаете тот же файл в Unity или Blender — выглядит отлично. Сетка идентична. Текстура идентична. Что здесь происходит?
Две отрасли, одна ось разногласия
Normal maps хранят направление поверхности в своих RGB-каналах. Red = X, green = Y, blue = Z. Каждый PBR-движок декодирует их одинаково с одним исключением: знак Y.
Соглашение OpenGL (Y+): более яркий зелёный канал означает, что поверхность указывает вверх. Используется в Unity, Godot, Blender (Cycles и Eevee), Substance Painter по умолчанию и во всех WebGL-движках.
Соглашение DirectX (Y−): более яркий зелёный означает, что поверхность указывает вниз. Используется в Unreal Engine, устаревшей цепочке инструментов Direct3D и некоторых ассетах CryEngine/Xbox-эры.
Одинаковые байты в PNG. Противоположное физическое значение.
Как определить с первого взгляда
Посмотрите на полусферический бамп (например кнопку или купол) в вашей normal map. При соглашении OpenGL нижняя часть бампа будет темнее зелёным, потому что поверхность поворачивается в сторону Y−, от света. При соглашении DirectX нижняя часть ярче зелёным.
Если в движке освещение кажется перевёрнутым — блики там, где должны быть тени — у вас рассогласование соглашений.
Исправление займёт 5 секунд
В Unreal диалог импорта текстур имеет чекбокс Flip Green Channel. Включите его, и движок инвертирует G-канал во время выборки. Нет необходимости переэкспортировать исходник.
В Unity установите тип текстуры на Normal map, и импортер всё обработает — Unity использует OpenGL, но предупредит вас, если файл выглядит неправильно. В Blender используйте цепочку узлов Separate Color → Invert G → Combine Color или просто выберите входные данные в стиле DirectX прямо в узле Normal Map.
Почему два стандарта с самого начала?
В 1990-х годах OpenGL и DirectX определили противоположные пространства координат текстур — в OpenGL Y возрастала вверх, в DirectX Y возрастала вниз. Когда normal maps стали распространены в середине 2000-х, каждая цепочка инструментов встроила своё пространство в свои выходные данные. Расхождение осталось, потому что переворот установленного конвейера обходится дорого.
Генерирование Normal Maps без путаницы
Генератор Normal Map aukimi позволяет вам явно выбрать соглашение при экспорте. Он применяет градиент Собеля к яркости вашей heightmap, затем упаковывает (−dx·s, −dy·s, 1) в RGB — с инвертированным Y при выборе DirectX. Вы можете переключить соглашение после генерации и переза́грузить без повторной загрузки.
Внутренне формула идентична. Единственное различие — знак, который мы применяем к компоненте Y перед записью в зелёный канал. Зная это, вы можете конвертировать файл между соглашениями любым редактором изображений: откройте PNG, выберите зелёный канал, инвертируйте его, сохраните. Это всё, что делает «Flip Green Channel» в Unreal.
Краткая справка
- Unity, Godot, Blender, Substance Painter (по умолчанию): OpenGL (Y+).
- Unreal Engine, устаревший Direct3D: DirectX (Y−).
- Выглядит неправильно в Unreal? Включите Flip Green Channel в настройках импорта.
- Выглядит неправильно в Unity? Вы, вероятно, экспортировали из инструмента DirectX-соглашения — инвертируйте зелёный канал или переэкспортируйте.
Как только вы усвоите соглашение, исправление становится тривиальным. Сложнее всего распознать это в первый раз.
Понравилась эта статья?
Похожие статьи
Творческий стек только что рухнул: одна неделя AI-инструментов, конец апреля 2026
С 27 апреля по 4 мая 2026 года Adobe, Luma, Novi, fal, Figma, Canva, HeyGen и Anthropic все пересекли один и тот же порог за восемь дней. Вот что вышло, что это означает и где это оставило браузерные творческие наборы, пытающиеся всё консолидировать.
AI-музыка и звуковые эффекты в 2026: что на самом деле работает в звуке инди-игр
Три года назад звук в инди-играх был либо лицензионными royalty-free библиотеками (дёшево, generics, все игры звучат одинаково), либо нанятым композитором (хорошо, дорого). В 2026 году AI генерирует музыку, которая отправляется в производство. Вот какие инструменты действительно работают — и где человеческий композитор всё ещё побеждает.
Генерация AI-мешей в 2026: Что на самом деле поставляется в игровые конвейеры
Image-to-3D превратилась из «жуткой демки» в «поставка в инди-проекты» за восемнадцать месяцев. Вот что на самом деле делают Tripo, Meshy, Rodin и Hyper3D в продакшене — и где 3D-художник по-прежнему побеждает модель каждый раз.