Введение в нормальную картографию (отображение изгибов)
Карты нормалей являются типом карты изгибов. Они представляют собой особый вид текстуры, которая позволяет добавлять детали поверхности, такие как изгибы, щели и царапины, к модели, которые ловят свет, как если бы они были представлены реальной геометрией.
Unity использует нормальные отображения Y+, иногда известные как формат OpenGL.
Например, вы можете показать поверхность, которая имеет канавки и винты или заклепки по всей поверхности, как корпус самолета. Один из способов сделать это будет моделировать эти детали как геометрию, как показано ниже.
В зависимости от ситуации, обычно не рекомендуется моделировать такие мелкие детали как "реальную" геометрию. Справа вы можете увидеть многоугольники, необходимые для создания детали одной головки винта. На большой модели с большим количеством мелких деталей поверхности это потребует очень большого количества многоугольников, которые должны быть нарисованы. Чтобы избежать этого, мы должны использовать нормальное отображение для представления мелких деталей поверхности, и полигональную поверхность более низкого разрешения для более большой формы модели.
Если мы вместо этого представляем эту деталь с помощью карты изгибов, геометрия поверхности может стать намного проще, и деталь представлена как текстура, которая модулирует, как свет отражается от поверхности. Это то, что современное графическое оборудование может сделать очень быстро. Ваша металлическая поверхность теперь может быть плоской плоскостью с низким поли, и винты, заклепки, канавки и царапины будут ловить свет и выглядеть глубокими из-за текстуры.
В современных художественных процессах разработки игр художники используют свои моделирующие приложения 3D для создания карт нормалей на основе исходных моделей очень высокого разрешения. Карты нормалей затем отображаются на игровую версию модели с более низким разрешением, так что оригинальные детали высокого разрешения отображаются с помощью нормального отображения.
Как работает нормальное сопоставление
Нормальное отображение делает эту модификацию поверхностных нормальных на шаг дальше, используя текстуру для хранения информации о том, как изменить поверхностные нормальные по всей модели. Нормальное отображение представляет собой текстуру изображения, отображаемую на поверхность модели, аналогичную обычным цветным текстурам, однако каждый пиксель в текстуре нормального отображения (называемый текселом) представляет отклонение в направлении поверхностной нормы от «истинной» поверхностной нормы плоского (или гладко интерполированного) многоугольника.
На этой диаграмме, которая опять-таки является 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), который является «вверх» для целей обычного отображения — и не представляет никаких изменений в поверхности модели. Это цвет, который вы видите в плоских областях «примерной» карты нормалей выше на этой странице.
Значение (0.43, 0.91, 0.80) дает вектор (–0.14, 0.82, 0.6), который является довольно резкой модификацией поверхности. Цвета, подобные этому, можно увидеть в ярко-синих областях карты нормалей каменной стены в верхней части некоторых краев камня. Результатом является то, что эти края ловят свет под очень разным углом по сравнению с более плоскими поверхностями камней.
Карты нормалей
Ограничения
- Unity не поддерживает нормальный масштаб карт на мобильных платформах.