Карты детализации: зачем они нужны и как их использовать

Карты детализации: зачем они нужны и как их использовать

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

Для решения этой проблемы был придуман способ, как перенести детализацию с высокополигональной модели (Highpoly) на низкополигональную (Lowpoly). Это делается с помощью особых текстурных карт, которые позволяют сократить многомиллионный полигонаж до нескольких сотен тысяч для кино и нескольких десятков тысяч для игр. А о том, какими бывают карты детализации и как они работают, рассказывает художник по персонажам и преподаватель курса XYZ School Movie Man Артём Гансиор.

Карты детализации: зачем они нужны и как их использовать

Карты детализации

Карты детализации бывают четырёх видов — displacement, vector displacement, bump и normal. По принципу работы их можно разделить на две группы. Карты displacement и vector displacement честно меняют геометрию модели, добавляя ей необходимые рельефы и детали. Карты bump и normal, в свою очередь, никак не влияют на геометрию и вместо этого имитируют наличие деталей путём смещения нормалей, то есть просто изменяют поведение света на поверхности модели.

Давайте рассмотрим каждую карту по отдельности.

Карта displacement

Displacement — это чёрно-белая текстура, каждый пиксель на которой имеет значение от 0 до 255. Когда вы накладываете её на модель, эти значения используются для определения высоты каждой точки на поверхности объекта. Высота может быть нулевой (когда точка остаётся на своём месте), положительной (когда точка выдавливается из объекта) и отрицательной (когда точка вдавливается в объект).

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

Главное преимущество такой системы — она даёт возможность усложнять геометрию во время рендеринга и при этом не повышать полигонаж в сцене во время работы с мэшем.

<p>Карта displacement</p>

Карта displacement

<p>Лоуполи</p>

Лоуполи

<p>Результат наложения карты displacement на лоуполи</p>

Результат наложения карты displacement на лоуполи

Другое преимущество — это возможность работать с SSS-эффектом (подповерхностное рассеивание света как у кожи, молока, гранита, воска и т.д.). Эффект SSS опирается на расстояния между полигонами, поэтому displacement дает наиболее реалистичный результат, полученный без «фейков».

Карты displacement используются преимущественно в VFX-индустрии. В VFX главная цель — это наивысшее качество и достоверность картинки. Displacement-текстуры позволяют легко этого добиться, поскольку они честно детализируют модели и меняют их силуэт. В игровой индустрии displacement встречается редко, так как тесселяция и расчёт смещения — это довольно ресурсоёмкий процесс, и оптимизировать его для игровых движков пока очень проблематично. Но это вопрос времени.

Важно понимать, что в карте displacement смещение происходит только по одной оси — вдоль нормали каждого полигона (другими словами, перпендикулярно каждому полигону). Это может стать проблемой, если вы захотите запечь какую-то деталь, которая смещается не только вверх, но и в сторону. Для таких случаев понадобится карта vector displacement.

Карта vector displacement

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

<p>Результат наложения карты vector displacement на объект</p>

Результат наложения карты vector displacement на объект

<p>Для сравнения — попытка добиться той же детализации с помощью карты displacement</p>

Для сравнения — попытка добиться той же детализации с помощью карты displacement

<p>Так выглядит карта vector displacement для уха. <a href="https://api.dtf.ru/v2.8/redirect?to=https%3A%2F%2Fdocs.arnoldrenderer.com%2Fdisplay%2FA5AFMUG%2FVector%2BDisplacement&postId=946257" rel="nofollow noreferrer noopener" target="_blank">Источник</a></p>

Так выглядит карта vector displacement для уха. Источник

Vector displacement — это довольно специфическая текстура. Её редко используют в продакшене даже несмотря на то, что она невероятно мощная и открывает поле для экспериментов. Дело в том, что она требует огромных вычислительных мощностей. Чаще всего это нецелесообразно — такого же результата, который даёт vector displacement, можно добиться менее энергозатратными способами.

Карта bump

Bump — это чёрно-белая карта со значениями пикселей от 0 до 255. Эти значения, как и в случае с displacement, задают смещение высоты на объекте. Разница в том, что bump не меняет геометрию, а просто имитирует изменение направления нормалей. Луч света, сталкиваясь с поверхностью объекта, берёт информацию о направлении нормали из текстуры и меняет свое направление. Это изменение фиксируется относительно камеры, и таким образом создаётся иллюзия рельефа.

<p>Карта bump</p>

Карта bump

<p>Результат её наложения на объект</p>

Результат её наложения на объект

В целом эта система работает неплохо, но есть две проблемы. Во-первых, эта текстура работает только по одной оси и не может корректно отображать более сложные рельефы.

И, во-вторых, она никак не влияет на геометрию, а значит, на силуэт. Если мы посмотрим на поверхность модели под углом, то станет очевидно, что это лишь имитация детализации.

Главное преимущество карты bump — это низкий вес текстуры и возможность комбинировать её с другими чёрно-белыми картами (metalness, roughness, ambient occlusion и т.д.). Bump можно с успехом использовать для создания микрорельефов или для ассетов заднего плана, но с более сложными задачами она уже не справится.

<p>Карта bump</p>

Карта bump

<p>Результат её наложения на объект</p>

Результат её наложения на объект

Карта нормалей (normal map)

Normal map — это карта, у которой во всех трёх RGB-каналах хранится информация о направлении нормали каждого пикселя. В процессе рендеринга эта информация используется для коррекции поведения света. То есть карта нормалей никак не влияет на геометрию объекта — вместо этого она имитирует неровности на его поверхности, заставляя свет вести себя так, как будто он взаимодействует с реально существующими деталями.

<p>Карта нормалей</p>

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

<p>Результат её наложения на объект</p>

Результат её наложения на объект

Карта нормалей не увеличивает полигонаж модели, но при этом создаёт вполне реалистичный эффект рельефа. Также она позволяет избежать сильной нагрузки на CPU и GPU при просчёте финальной картинки, что сильно оптимизирует процесс и позволяет смотреть на результат в реальном времени.

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

Форматы текстур

Отдельно стоит поговорить про битность и форматы карт детализации.

Битность в картинках — это количество уникальных оттенков в палитре изображения, которые используются для представления каждого цвета. Основная масса текстур использует значение 8 бит, то есть 256 цветов (8 для R, 8 для G и 4 для B — синий обделили из-за слабой чувствительности человека к синим оттенкам). Карты diffuse, bump, reflection, roughness и другие текстуры могут использовать 8-битную систему безо всякой потери качества.

16 бит используют для карт displacement, vector displacement, normal map и вообще любых текстур, где нужна очень крутая градация цветов. Ведь 16 бит — это аж 65 536 возможных вариаций цветов, так что качество displacement напрямую зависит от битности. Также 16 бит используются для карт diffuse + alpha, когда нужен отдельный канал с прозрачностью.

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

В общем, 32 бита пригождается везде, где нужен огромный диапазон информации. Хороший пример — HDRI-карта с ярким солнцем. Если мы снижаем экспозицию, то всё равно видим яркую точку, а градиенты меняются. Если попробовать провести этот опыт с 8-битной текстурой, то вы получите вот это:

Вывод

Каждая из вышеописанных карт детализации имеет свои преимущества и недостатки, поэтому часто их используют вместе. В real-time движках displacement используют для придания фактуры средним формам, а normal map — для мелкой детализации. В VFX вся детализация чаще всего создается за счёт displacement, хотя для мелкой детализации bump и normal тоже используются.

Поиск правильного решения и подхода — всегда творческий процесс, поэтому удачи!

Материал подготовлен командой XYZ Media.

Наши каналы в Telegram и на YouTube.

1616
4 комментария

А не существующие курсы можно купить? Лохов по прежнему набираете?

6

Зачем лохов набирать? Они и сами набираться рады

Мы вам не рады

2