Unity 6.3
0 онлайн 134 гостей 3 в системе
Вход
Материалы и шейдеры Шаг 27 из 442

Введение в нормальную картографию (отображение изгибов)

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

Unity использует нормальные отображения Y+, иногда известные как формат OpenGL.

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

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

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

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

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

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

Как работает нормальное сопоставление

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

Нормальное отображение через три полигона, рассматриваемое как диаграмма 2D
Нормальное отображение через три полигона, рассматриваемое как диаграмма 2D

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

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

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

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

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

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

Различия между картами изгибов, картами нормальных участков и картами высот

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

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

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

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

Современные графические устройства реального времени 3D полагаются на Карты нормалей, потому что они содержат векторы, необходимые для изменения того, как свет должен отражаться от поверхности. 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), который является довольно резкой модификацией поверхности. Цвета, подобные этому, можно увидеть в ярко-синих областях карты нормалей каменной стены в верхней части некоторых краев камня. Результатом является то, что эти края ловят свет под очень разным углом по сравнению с более плоскими поверхностями камней.

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

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

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

Ограничения

  • Unity не поддерживает нормальный масштаб карт на мобильных платформах.