Открыта запись на курс Vehicles and Props Старт обучения 28 ноября 2024 Преимущества курса: - разбор домашних работ только автором курса; - справедливые фидбеки каждую неделю; - помощь в выполнении тестового задания при трудоустройстве; - рекомендации в топовые студии в РФ при успешном прохождении курса.
История Normal Map

История, принципы работы и… роль в геймдеве

Normal map (не “нормальная карта”, а “карта нормалей”) — это 2D-текстурное изображение, которое используется в компьютерной графике для имитации детализации поверхности объекта без добавления дополнительной геометрии. Она представляет собой специальный тип карты высот, с помощью которой создается иллюзия трехмерности на плоской поверхности.

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

Кажется слишком сложным? Сейчас разберемся со всем по порядку. Пока запомните ключевые слова: “имитация”, “иллюзия”, “детализация”, “карта высот”.

Начало истории Normal Map

История развития Normal map начинается с Джима Блинна. Он был экспертом по компьютерной графике в лаборатории реактивного движения НАСА и работал в том числе над новыми методами отображения взаимодействия света и объектов и занимался рельефным текстурированием.

Также Блинн руководил анимацией нескольких проектов, которые из-за своей специфики (например, один из них был посвящен Карлу Сагану и космосу) использовали в основном компьютерную графику. Фактически, Джим Блинн одним из первых близко столкнулся с проблемой, которую нужно было как-то решать: развитие технологий позволило создавать более сложные и детализированные 3D-объекты — но использование таких элементов, как текстуры и детали на поверхности моделей, значительно увеличивало время, необходимое для визуализации.

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

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

01_normalmap_cgitems.ru.jpg Авторство цитат в Интернете, конечно, вызывает сомнение, но эта фраза появилась еще до расцвета Интернета

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

В 1978 году Блинн выпустил статью “Simulation of wrinkled surfaces”, где нащупал верный путь, которым нужно было двигаться — путь имитации неровностей.

Однако следующие почти два десятка лет движение было очень медленным и хаотичным. Пока в 1996 году не появилась статья “Fitting Smooth Surfaces to Dense Polygon Meshes” за авторством Венката Кришнамурти и Марка Левоя. К тому моменту Левой уже занимался компьютерной мультипликационной анимацией (1970-е), объемным рендерингом (1980-е) — а позже переберется в Google и запустит, например Street View и займется Pixel, а потом вообще станет вице-президентом Adobe. Кришнамурти же найдет себя в “3D-бизнесе” (как писали в газетах того времени) и программной разработке, основав несколько компаний и активно продвигая их.

Главной идеей этой статьи было взятие геометрических деталей из модели с большим количеством полигонов — собственно, на чем и основывается концепция Normal map.

02_normalmap_cgitems.ru.jpg Иллюстрация к статье “Fitting Smooth Surfaces to Dense Polygon Meshes”. Кажется, достаточно наглядно

Далее было уже развитие темы: в 1998 году выходят сразу две работы — "Appearance Preserving Simplification" (Джонатан Коэн, Марк Олано и Димеш Маноча), в которой предложили сохранять нормали в виде текстуры, и "A general method for preserving attribute values on simplified meshes" (Паоло Чиньони, Ч. Монтаний, Ч. Роччиниз, Р. Скопиньо), где описали подход к сохранению деталей на упрощенных сетках.

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

03_normalmap_cgitems.ru.png Свет - взаимодействие - нормаль

Что из себя представляет текстурная карта Normal Map

Normal map содержит информацию о направлениях нормалей (векторов, перпендикулярных поверхности в каждой точке) реального 3D-объекта. При рендеринге эти нормали используются для определения того, как свет взаимодействует с поверхностью объекта, создавая эффекты теней, бликов и отражений — то есть, проще говоря, нормали определяют, как свет будет отражаться от каждой точки поверхности. Обычно каждая точка имеет три нормали, направленные вдоль осей X, Y и Z. Карты нормалей обычно хранятся в виде обычных изображений RGB, где компоненты RGB соответствуют координатам X, Y и Z соответственно нормали к поверхности.

04_normalmap_cgitems.ru.jpg Это не радужного инопланетянина переехал каток - это просто RGB карты нормалей. Можете потренировать воображение и преставить, что в итоге получится.

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

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

05_normalmap_cgitems.ru.jpg Вот так можно получить текстуру камня

Normal map используется в следующих случаях:

Создание реалистичных деталей на поверхности объектов

Из примеров уже понятно, что Normal map может использоваться, например, для получения неровностей на металлической поверхности или для имитации текстуры дерева на деревянной поверхности, или же булыжников в каменной кладке. Также сюда относятся шрамы, морщины и даже структура причесок или шерсти персонажей.

Увеличение детализации объектов без увеличения их размера

Например, если у вас есть модель здания, которую вы хотите детализировать, вы можете использовать Normal map для добавления окон, дверей и других мелких деталей без необходимости создавать новую, более детальную модель. Или если у вас есть сложное платье героини с изысканной вышивкой — тоже смело можно обращаться к Normal map.

Оптимизация производительности в играх и других приложениях

Использование Normal map позволяет уменьшить количество полигонов на объекте, что может улучшить производительность без потери качества изображения. Собственно, именно поэтому работа с Normal map и стала так активно развиваться — новые, все более сложные игры, требовали все больше ресурсов, в рамки которых очень тяжелые hi-poly модели просто не вписывались, а использование low-poly объектов предполагало уже определенный специфический стиль, который к многим играм больше не подходил.

06_normalmap_cgitems.ru.png Каменная кладка выглядит весьма реалистично - а вес объекта не сильно увеличился

Кроме того, преимуществами Normal map являются:

Простота использования

Normal map достаточно проста в использовании и не требует глубоких знаний в 3D моделировании.

Широкий спектр применения

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

В итоге на данный момент утвердился определенный алгоритм работы с Normal map, который выглядит так:

1. Создание hi-poly (высокодетализированной) модели:

Создание модели с высоким уровнем детализации, включая все нужные детали, разрезы, неровности и т.д. Здесь можно использовать такие программы, как ZBrush или Mudbox.

2. Создание low-poly (низкополигональной) модели:

Создание модели с низким уровнем детализации, которая будет использоваться в реальном времени, например, в игровых движках. Эта модель должна иметь меньшее количество полигонов, чтобы обеспечить оптимальную производительность. Ее можно получить с помощью программ Maya или 3ds Max.

3. Создание UV-развертки:

Низкополигональная модель требует правильного создания UV-развертки, чтобы корректно отобразить текстуры и нормали. Это может быть сделано с помощью Maya, 3ds Max или Unwrap UVW в 3ds Max.

07_normalmap_cgitems.ru.jpg Low-poly модель + Normal map

4. Запекание Normal map:

На этом этапе данные о высоте, полученные из hi-poly модели, переносятся на low-poly модель. Точность данных о высоте зависит от настроек и выбранной программы, в которой происходит работа. Также важно правильно сделать UV-развёртку и задать оптимальные параметры запекания.

5. Настройка Normal map:

После запекания Normal map может потребоваться некоторая корректировка для получения желаемых результатов. Это может включать в себя использование программных средств, таких как Photoshop, для изменения контрастности, яркости, увеличения деталей и прочих настроек.

08_normalmap_cgitems.ru.jpg Использование карты нормалей идеально для получения объема разнообразных текстур, особенно камня/древесины/ткани

6. Применение Normal map:

После окончания настройки Normal map ее можно применять на низкополигональную модель.

Да, Normal map дает иллюзию дополнительного объема и деталей на модели, делая ее более реалистичной и привлекательной для визуализации — но, к сожалению, в мире нет ничего идеального. И использование Normal map — всего лишь разумный и удобный компромисс, а не панацея.

Нужно учитывать как минимум три минуса:

Необходимость использования специализированного программного обеспечения

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

Ограничения в детализации

Хотя Normal map и позволяет увеличить детализацию объектов, про очень сложные детали, такие как мелкие текстуры или сложные узоры, можно забыть. Дело в том, что в тех же играх разрешение текстур ограничено и не может быть более чем 4096х4096 пикселей, поэтому мелкую детализацию просто не получится передать. Особенно это будет заметно, если вы предполагаете, что ваш объект можно будет сильно увеличивать.

Снижение производительности

Хотя использование Normal map направлено на улучшение производительности — оно может, наоборот, стать причиной её снижения, если модель неправильно оптимизирована под карту нормалей. В итоге может и проект начать тормозить, и сам объект будет выглядеть неидеально, а то и хуже, чем если бы он был создан без normal mapping.

09_normalmap_cgitems.ru.png Несмотря на то, что высокополигональная модель и модель, в которой использовалась карта нормалей, со стороны выглядят идентично, модель с Normal map не получится бесконечно детализировать: детали не отобразятся из-за ограниченного разрешения текстуры.

В идеале Normal map обычно используется в сочетании с другими текстурными картами, такими как цветовая (диффузная) карта, карты отражений, карты прозрачности и т.д. Всё они широко применяются в игровой индустрии для достижения высококачественного визуального представления игровых персонажей, окружения и объектов.

Первой игровой системой, способной аппаратно отображать нормали, была консоль Sega Dreamcast и её аркадный аналог Naomi в 1998 году. А вот Sony PlayStation 2 , выпущенная в 2000 году, уже была единственной на тот момент, которая не поддерживала Normal map. В 2001 году вышли GameCube и Xbox, в которые вернулась карта нормалей, и теперь все игры (кроме тех, где low-poly являются концептуальным решением) используют её.

010_normalmap_cgitems.ru.jpg Игроки пытаются выяснить, в какой же игре впервые появилась поддержка Normal map. Возможно, в этой.

Normal map — это не просто удачный компромисс между детализацией и производительностью, это еще и момент, который оказал большое влияние на современный облик игр. Фактически, использование карты нормалей позволило высвободить вычислительную мощность игровых движков — и направить её на решение других вопросов. Сложный геймплей, ветки развития сюжета, интерактивные составляющие, побочные квесты, прописанные NPC и многое другое — всего этого пока могло бы и не быть, не существуй возможность использовать Normal map. Без нее высокая детализация просто сожрала бы большую часть ресурсов — и прогресс в геймдеве топтался бы на месте…

011_normalmap_cgitems.ru.jpg Вот во что при запекании превращается радужный блин
Ваша заявка отправлена!
Если во входящих на почте: нет письма, проверьте папку спам или напишите нам в телеграм