Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Карта нормалей. Создание и использование Bump Maps

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

Например, вы можете захотеть показать поверхность с канавками и винтами или заклепками на поверхности, например корпус самолета. Один из способов сделать это — смоделировать эти детали как геометрию, как показано ниже.

Лист авиационного металла с деталями, смоделированными как реальная геометрия.
Лист авиационного металла с деталями, смоделированными как реальная геометрия.

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

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

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

В современных конвейерах разработки игр художники будут использовать свои приложения для 3D-моделирования для создания карт нормалей на основе исходных моделей с очень высоким разрешением. Затем карты нормалей сопоставляются с готовой к игре версией модели с более низким разрешением, так что исходные детали с высоким разрешением визуализируются с использованием карты нормалей.

Рефленое наложение — это относительно старый графический метод, но он по-прежнему является одним из основных методов, необходимых для создания детализированной реалистичной графики в реальном времени. Карты рельефа также часто называют картами нормалей или картами высот, однако эти термины имеют немного разные значения, которые будут объяснены ниже.

Что такое нормали поверхности?

Чтобы действительно объяснить, как работает карта нормалей, мы сначала опишем, что такое «нормаль» и как она используется в освещении в реальном времени. Возможно, самым простым примером будет модель, в которой каждый многоугольник поверхности освещается просто в соответствии с углами поверхности относительно источника света. Угол поверхности можно представить в виде линии, выступающей в перпендикулярном направлении от поверхности, и это направление (которое является вектором) относительно поверхности называется «нормалью к поверхности» или просто нормально.

Два 12-гранных цилиндра, слева с плоской штриховкой и справа со сглаженной штриховкой.
Два 12-гранных цилиндра, слева с плоской штриховкой и справа со сглаженной штриховкой.

На изображении выше левый цилиндр имеет базовое плоское затенение, и каждый многоугольник затенен в соответствии с его относительным углом к источнику света. Освещение на каждом полигоне постоянно по всей площади полигона, потому что поверхность плоская. Вот те же два цилиндра с их каркасной сеткойосновным графическим примитивом Unity. Меши составляют большую часть ваших 3D-миров. Unity поддерживает триангулированные или четырехугольные полигональные сетки. Поверхности Nurbs, Nurms, Subdiv должны быть преобразованы в полигоны. More info
See in Словарь
visible:

Два 12-гранных цилиндра, слева с плоской штриховкой и справа со сглаженной штриховкой.
Два 12-гранных цилиндра, слева с плоской штриховкой и справа со сглаженной штриховкой.

Модель справа имеет то же количество полигонов, что и модель слева, однако затенение кажется гладким — освещение, пересекающее полигоны, создает впечатление изогнутой поверхности. Почему это? Причина в том, что нормаль к поверхности в каждой точке, используемой для отражения света, постепенно меняется по ширине многоугольника, так что для любой заданной точки на поверхности свет отражается как если бы эта поверхность был изогнут, а не плоским постоянным многоугольником, каким он является на самом деле.

В виде 2D-диаграммы три полигона поверхности вокруг внешней стороны заштрихованного цилиндра будут выглядеть следующим образом:

Плоское затенение трех полигонов, рассматриваемое как 2D-диаграмма
Плоское затенение трех полигонов, рассматриваемое как 2D-диаграмма

Нормали поверхности представлены оранжевыми стрелками. Это значения, используемые для расчета того, как свет отражается от поверхности, поэтому вы можете видеть, что свет будет реагировать одинаково по длине каждого полигона, потому что нормали поверхности указывают в одном направлении. Это дает «плоское затенение» и является причиной того, что полигоны левого цилиндра имеют четкие края.

Однако для гладкого заштрихованного цилиндра нормали поверхности плоских многоугольников различаются, как показано здесь:

Плавное затенение трех полигонов в виде 2D-диаграммы
Плавное затенение трех полигонов в виде 2D-диаграммы

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

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

Что такое сопоставление нормалей?

Планирование нормалей продвигает эту модификацию нормалей поверхности на один шаг вперед, используя текстуру для хранения информации о том, как изменять нормали поверхности по всей модели. Карта нормалей — это текстура изображения, наложенная на поверхность модели, похожая на обычные цветные текстуры, однако каждый пиксельнаименьшая единица в компьютерном изображении. Размер пикселя зависит от разрешения вашего экрана. Пиксельное освещение рассчитывается для каждого пикселя экрана. Подробнее
См. в Словарь
в текстуре карты нормалей (называемой texel) представляет собой отклонение направления нормали к поверхности от «истинной» нормали к поверхности плоского (или сглаженного интерполированного) многоугольника.

Отображение нормалей по трем полигонам, представленное в виде 2D-диаграммы
Отображение нормалей по трем полигонам, представленное в виде 2D-диаграммы

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

Цвета, видимые в необработанном файле карты нормалей, обычно имеют голубоватый оттенок и не содержат реальных светлых или темных оттенков, потому что сами цвета не предназначены для отображения такими, какие они есть. Вместо этого значения RGB каждого тексела представляют собой значения X, Y и Z вектора направления и применяются как модификация базовых интерполированных гладких нормалей полигональных поверхностей.

Пример текстуры карты нормалей
Пример текстуры карты нормалей

Это простая карта нормалей, содержащая информацию о выступах для некоторых приподнятых прямоугольников и текст. Эту карту нормалей можно импортировать в Unity и поместить в слот карты нормалей стандартной Shaderпрограммы, работающей на графическом процессоре. Подробнее
См. в Словарь
. При объединении материала с цветовой картой (карта альбедо) и применении к поверхности меша цилиндра выше результат выглядит следующим образом:

Пример карты нормалей, примененной к поверхности сетки цилиндра, использованной выше
Пример карты нормалей, примененной к поверхности сетки цилиндра, использованной выше

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

Как получить или сделать карты нормалей?

Обычно карты нормалей создаются 3D-художниками или художниками по текстурам в сочетании с моделью или текстурами, которые они создают, и они часто отражают макет и содержимое карты альбедо. Иногда они создаются вручную, а иногда визуализируются в 3D-приложении.

Как визуализировать карты нормалей из 3D-приложения выходит за рамки этой документации, однако основная концепция заключается в том, что 3D-художник создает две версии модели: модель с очень высоким разрешением, содержащую все детали в виде полигонов, и «Готовая к игре» модель с более низким разрешением. Модель с высоким разрешением была бы слишком детализирована для оптимальной работы в игре (слишком много треугольников в сетке), но она используется в приложении 3D-моделирования для создания карт нормалей. Версия модели с более низким разрешением может затем опустить очень тонкий уровень детализации геометрии, который теперь хранится в картах нормалей, чтобы вместо этого ее можно было визуализировать с использованием сопоставления нормалей. Типичным вариантом использования для этого было бы показать выпуклые детали складок, пуговиц, пряжек и швов на одежде персонажа.

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

Вот два примера: простая повторяющаяся текстура каменной стены с соответствующей картой нормалей и атлас текстур персонажа с соответствующей картой нормалей:

Текстура каменной стены и соответствующая ей текстура карты нормалей
Текстура каменной стены и соответствующая ей текстура карты нормалей
Атлас текстуры персонажа и соответствующий ему атлас текстуры карты нормалей.
Атлас текстуры персонажа и соответствующий ему атлас текстуры карты нормалей.

В чем разница между картами рельефа, картами нормалей и картами высот?

Карты нормалей и карты высот являются типами рельефных карт. Оба они содержат данные для представления видимых деталей на поверхности более простых полигональных сеток, но хранят эти данные по-разному.

Слева карта высот для бамп-мэппинга каменной стены. Справа карта нормалей для бамп-мэппинга каменной стены.
Слева карта высот для бамп-мэппинга каменной стены. Справа карта нормалей для бамп-мэппинга каменной стены

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

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

Современное оборудование для трехмерной графики в реальном времени использует карты нормалей, поскольку они содержат векторы, необходимые для изменения того, как свет должен отражаться от поверхности. Unity также может принимать карты высот для бамп-мэппинга, но для их использования их необходимо преобразовать в карты нормалей при импорте.

Почему сине-фиолетовые цвета?

Понимание этого не обязательно для использования карт нормалей! Можно пропустить этот абзац. Однако, если вы действительно хотите знать: значения цвета RGB используются для хранения направлений X, Y, Z вектора, где Z означает «вверх» (вопреки обычному соглашению Unity об использовании Y как «вверх»). Кроме того, значения в текстуре считаются уменьшенными вдвое с добавлением 0,5. Это позволяет сохранять векторы всех направлений. Следовательно, чтобы преобразовать цвет RGB в направление вектора, вы должны умножить его на два, а затем вычесть 1. Например, значение RGB (0,5, 0,5, 1) или #8080FF в шестнадцатеричном формате дает вектор (0,0, 1), который находится «вверху» для целей сопоставления нормалей и не представляет собой изменение поверхности модели. Это цвет, который вы видите в плоских областях «примерной» карты нормалей ранее на этой странице.

Карта нормалей, использующая только #8080FF, что соответствует вектору нормали 0,0,1 или прямо вверх. Это не меняет нормаль к поверхности многоугольника и, следовательно, не влияет на освещение. Любые пиксели, которые отличаются от этого цвета, приводят к векторам, которые указывают в другом направлении, что, следовательно, изменяет угол, который используется для расчета отражения света в этой точке..
Карта нормалей, использующая только #8080FF, что соответствует вектору нормали 0,0,1 или прямо вверх. Это не меняет нормаль к поверхности многоугольника и, следовательно, не влияет на освещение. Любые пиксели, которые отличаются от этого цвета, приводят к векторам, которые указывают в другом направлении, что, следовательно, изменяет угол, который используется для расчета отражения света в этой точке.

Значение (0,43, 0,91, 0,80) дает вектор (–0,14, 0,82, 0,6), что представляет собой довольно крутую модификацию поверхности. Подобные цвета можно увидеть в ярко-голубых областях карты нормалей каменной стены в верхней части некоторых краев камня. В результате эти грани улавливают свет под совсем другим углом, чем более плоские поверхности камней.

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

Карты нормалей

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

Как импортировать и использовать карты нормалей и карт высот

Карту нормалей можно импортировать, как обычно, поместив файл текстуры в папку ресурсов. Однако вам нужно сообщить Unity, что эта текстура является картой нормалей. Это можно сделать, изменив параметр «Тип текстуры» на «Карта нормалей» в инспектореокна Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройках проекта, что позволяет вам проверять и редактировать значения. More info
See in Словарь
settings.

Чтобы импортировать черно-белую карту высоттекстуру в оттенках серого, в которой хранятся данные о высоте объекта. Каждый пиксель хранит разницу высот перпендикулярно лицу, которое представляет пиксель.
Посмотрите в Словарь
как на карту нормалей, процесс почти идентичен, за исключением того, что вы необходимо установить флажок «Создать из оттенков серого».

Если выбран параметр «Создать из оттенков серого», в инспекторе появится ползунок Bumpiness. Вы можете использовать это, чтобы контролировать, насколько крутыми являются углы в карте нормалей при преобразовании из высот в вашей карте высот. Низкое значение шероховатости будет означать, что даже резкий контраст на карте высот будет преобразован в плавные углы и неровности. Высокое значение создаст преувеличенные выпуклости и очень контрастные реакции освещения на неровности.

Настройки Low и High Bumpiness при импорте карты высот в качестве карты нормалей и результирующий эффект на модель.
Настройки Low и High Bumpiness при импорте карты высот в качестве карты нормалей и результирующий эффект на модель.

После того как у вас есть карта нормалей в ваших ресурсах, вы можете поместить ее в слот карты нормалей вашего материала в инспекторе. В стандартном шейдере есть слот карты нормалей, и многие из старых устаревших шейдеров также поддерживают карты нормалей.

Размещение текстуры карты нормалей в правильном слоте материала с использованием стандартного шейдера
Размещение текстуры карты нормалей в правильном слоте материала с использованием стандартного шейдера

Если вы импортировали карту нормалей или карту высот и не пометили ее как карту нормалей (выбрав Тип текстуры: Карта нормалей, как описано выше), инспектор материалов предупредит вас об этом и предложит исправить это так:

Предупреждение «Исправить сейчас» появляется при попытке использовать карту нормалей, которая не помечена как таковая в инспекторе.
Предупреждение «Исправить сейчас» появляется при попытке использовать карту нормалей, которая не помечена как таковая в инспекторе.

Нажатие кнопки «Исправить сейчас» имеет тот же эффект, что и выбор Тип текстуры: карта нормалей в настройках инспектора текстур. Это будет работать, если ваша текстура действительно является картой нормалей. Однако, если это карта высот в оттенках серого, она не обнаружит это автоматически, поэтому для карт высот вы всегда должны выбирать параметр «Создать из оттенков серого» в окне инспектора текстуры.

Вторичные карты нормалей

Вы также можете заметить, что внизу в инспекторе материалов для стандартного шейдера есть второй слот карты нормалей. Это позволяет вам использовать дополнительную карту нормалей для создания дополнительных деталей. Вы можете добавить карту нормалей в этот слот так же, как и в обычный слот карты нормалей, но цель здесь состоит в том, чтобы вы использовали другой масштаб или частоту тайлинга, чтобы две карты нормалей вместе давали высокий уровень детализацииТехника Уровень детализации (LOD) – это оптимизация, которая уменьшает количество треугольников, которые Unity должна обрабатывать. визуализировать для GameObject, когда его расстояние от камеры увеличивается. Подробнее
См. в Словарь
в разных масштабах. Например, ваша обычная карта нормалей может определять детали облицовки стен или транспортных средств с канавками для краев панелей. Вторичная карта нормалей может обеспечить очень точную детализацию выпуклостей для царапин и износа на поверхности, которая может быть мозаичной в 5-10 раз больше масштаба базовой карты нормалей. Эти детали могут быть настолько мелкими, что их можно увидеть только при внимательном рассмотрении. Чтобы иметь такое количество деталей на базовой карте нормалей, потребуется, чтобы базовая карта нормалей была невероятно большой, однако, комбинируя две карты разных масштабов, можно достичь высокого общего уровня детализации с двумя относительно небольшими текстурами карты нормалей.

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3