world space normal map что такое

Это норма: что такое карты нормалей и как они работают

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

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

Первые созданные человеком 3D-модели выглядели примерно так:

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

Это замечательно, но у такой модели есть очевидное ограничение: она выглядит слишком полигональной.

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

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

Требовалось другое решение, и так были изобретены нормали. (Всё происходило не совсем так, но так проще объяснять и понимать.)

Давайте проследим за линией из центра полигона, перпендикулярной его поверхности. Мы дадим этой линии очень непривычное название: нормаль. Цель нормали — контролировать, куда указывает поверхность, чтобы когда свет отразиться от этой поверхности, она могла использовать нормаль для вычисления получившегося отражения. Когда свет падает на полигон, мы сравниваем угол луча света с нормалью полигона. Луч отражается под тем же углом относительно направления нормали:

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

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

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

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

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

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

Именно этим мы управляем, задавая smoothing groups (3ds Max, Blender) или указывая рёбра как hard или smooth (Modo, Maya): мы сообщаем программе, какие переходы между гранями должны быть плавными, а какие — жёсткими.

Вот сравнение одной сферы из 288 полигонов с жёсткими и плавными переходами:

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

Потенциально мы можем задать нечто вроде параллелепипеда, чтобы все его вершины имели усреднённые нормали. 3D-редактор будет стремиться сгладить его поверхность, чтобы она выглядела как единая плавная поверхность. Для 3D-редактора это вполне логично, но выглядит очень странно, потому что у нас есть объект, который очевидно должен иметь несколько отдельных поверхностей (каждая грань параллелепипеда), однако программа пытается показать их как одну плавную поверхность.

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

Именно поэтому в 3D-редакторах обычно есть параметр углов сглаживания: если у нас есть два связанных полигона под углом, превышающем угол сглаживания, то их переход будет плавным, а соединение полигонов под углом меньше угла сглаживания будет жёстким. Благодаря этому крутые углы между поверхностями будут отображаться как разные поверхности, как это и бывает в реальном мире.

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

Так как мы меняем способ отражения света от объекта, можно также сделать так, чтобы очень простой объект отражал свет, как сложный. Это называется картой нормалей. Мы используем текстуру для изменения направления света, отражающегося от 3D-объекта, заставляя его выглядеть сложнее, чем он есть на самом деле.

Примером из реального мира могут служить голограммы, которые раньше вручали в подарок при покупке картофельных чипсов (по крайней мере, у нас, в Испании). Они совершенно плоские, но отражают свет так, как бы это делал 3D-объект, благодаря чему становятся сложнее, чем на самом деле. В мире 3D-графики это работает даже лучше, но всё равно имеет свои ограничения (поскольку поверхность остаётся плоской).

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

С каждой вершиной может быть связано одна или несколько нормалей. Если она имеет одну нормаль, то можно назвать её усреднённой нормалью вершины, а если несколько — то разделённой нормалью вершины.

Давайте возьмём два полигона, соединённых ребром. Если переход между двумя гранями плавный (если мы указали его как плавный в Maya/Modo, или обе имеют одинаковую smoothing group в Max/Blender), то каждая вершина имеет одну нормаль, которая является средней нормалей полигонов (поэтому она и называется усреднённой нормалью вершины). Важное примечание: до недавнего времени каждый 3D-редактор использовал собственный способ вычисления усреднённых нормалей вершин, то есть карты нормалей, вычисленные в одной программе, в другой могли выглядеть совершенно иначе. Подробнее об этом я расскажу во второй части туториала.

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

Если переход жёсткий (hard edge или разные smoothing groups), то каждая вершина имеет несколько нормалей: по одной для каждой соединённой вершины, выровненной по их нормалям. При этом между нормалями образуется пробел, который выглядит как две разные поверхности. Именно это называется разделённой нормалью вершины.

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

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

При запекании карты нормалей мы по сути говорим программе изменить направление, которому следуют нормали lowpoly-модели, так, чтобы они соответствовали направлению в highpoly-модели; поэтому lowpoly-модель будет отражать свет так же, как highpoly. Вся эта информация хранится в текстуре под названием «карта нормалей». Давайте рассмотрим пример.

Допустим, у нас есть вот такая низкополигональная модель (lowpoly). Плоская поверхность с четырьмя вершинами и настроенными UV, которые программа запекания будет использовать для создания карты нормалей.

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

И она должна получить информацию о нормалях от этой высокополигональной (highpoly) модели, нормали которой сложнее.

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

Помните, что мы переносим только информацию о нормалях, то есть UV, материал, топология, преобразования и т.п. к делу не относятся. Проверенное правило: если highpoly-модель выглядит хорошо, то её нормали тоже хороши и вполне должны подходить для запекания.

Программа запекания берёт lowpoly-модель и испускает лучи, следуя по направлениям нормалей lowpoly (именно поэтому нам нужно контролировать нормали lowpoly). Эти лучи имеют ограниченную длину чтобы не получать информацию нормалей от далёких граней (обычно это расстояние называется bake distance или cage distance). Когда эти лучи сталкиваются с highpoly, программа запекания вычисляет, как отразить эти лучи, чтобы они следовали по направлению нормалей highpoly, и сохраняет эту информацию в карту нормалей.

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

Вот результат запекания для нашего примера:

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

У нас есть текстура, которую движок использует для изменения нормалей lowpoly, чтобы свет отражался от этой lowpoly-модели так же, как он отражался бы от highpoly-версии. Не забывайте, что это только текстура, которая не влияет на силуэт lowpoly-модели (невозможно изменить способ отражения света от модели, если свет не падает на эту модель).

Хотя понятно, что можно «считать» внешний вид highpoly по внешнему виду карты нормалей, очевидно, что карты нормалей — это не обычные текстуры, потому что они хранят информацию не о цвете, а о нормалях. Также это значит, что карты нормалей нельзя рассматривать как обычные текстуры; к тому же, как мы увидим, они обладают особыми параметрами сжатия и гамма-коррекции.

Можно воспринимать карту нормалей как набор из трёх текстур в оттенках серого, хранящийся в одном изображении:

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

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

Второе изображение сообщает движку, как модель должна отражать свет, падающий снизу*; оно хранится в зелёном канале текстуры карты нормалей.

*В некоторых программах свет падает не снизу, а сверху, то есть могут быть «левосторонние» и «правосторонние» карты нормалей. Как мы увидим позже, это может вызывать некоторые проблемы.

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

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

Нормали — это векторы, которые используются для определения того, как свет отражается от поверхности. Их можно использовать для контроля над переходом между гранями (усреднением нормалей соединённых вершин для создания плавного перехода или разделением их для создания жёсткого перехода), но также их направление можно изменять, чтобы lowpoly-модель отражала свет так же, как более сложная модель.

Эта информация хранится в трёх отдельных каналах изображения, и 3D-редактор считывает её, чтобы понять, в каком направлении должна смотреть поверхность модели.

В следующей статье цикла мы поговорим о том, как можно запекать эти детали из highpoly-модели в lowpoly.

Источник

Гайд по бейкингу. Важная теория: часть 2

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

Если просто, то это перпендикуляр к поверхности. По нему движок определяет, как от поверхности будет отражаться свет.

Луч света отражается от поверхности симметрично. Если луч падает под углом 45 градусов слева, он отразится под таким же углом и продолжит свое движение вправо.

Еще одна деталь: если две сшитых плоскости находятся под углом относительно друг друга, и их нормали смотрят строго перпендикулярно по отношению к плоскости — их стык будет жестким. Условно говоря, они будут выглядеть как две отдельные поверхности.

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

Так, с помощью редактирования нормалей, можно симулировать трехмерные эффекты на плоскости. На этом принципе редактирования информации о нормалях объекта устроена работа normal map. Только в этом случае данные записываются в RGB текстуру и наносится на объект через материал.

Информация в карты нормалей перепекается с детализированного high poly объекта. Для этого нужны low poly версия модели и её high poly аналог. High poly зачастую отличается сглаженными углами и большей проработкой деталей. Всё зависит от ситуации, но для начала понимания этих различий будет достаточно.

Какую задачу выполняет Low poly модель при запекании? Помимо UV развертки, которая нужна для объяснения программе куда и какой элемент high poly модели запекать на карте нормалей, low poly используется для создания Cage.

Cage — это в какой-то степени копия Low poly модели, которая расширяется по нормалям объекта. Затем, из cage внутрь проецируются лучи, которые захватывают все high poly элементы, попавшие в зону cage, и перепекают их на карту нормалей.

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

От битности зависит количество оттенков, которое может быть записано в изображении. 24-битное изображение может записать 8 бит, или 256 значений в каждый канал. 256 значений обычно достаточно для текстур типа diffuse, specular или gloss map, потому что они используют более широкий спектр цветов, и на них не нужно четко изображать слабые градиенты.

Если утрировать, битность определяет количество доступных промежуточных оттенков на изображении. Чем выше битность — тем больше доступно оттенков.

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

Самый распространенный тип карты нормалей. Она адаптирует направление нормалей вершин объекта, в зависимости от положения объекта в пространстве. Таким образом, нормали объекта отображаются корректно при любом его положении в пространстве. Из-за различий в алгоритмах отображения карт нормалей, Tangent Space Normal разделяется на два типа: DirectX и OpenGL.

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

Если tangent space normal адаптирует направление нормалей вершин объекта в зависимости от положения объекта в пространстве, то world space normal записывает статичную информацию. Грубо говоря, если объект при запекании был повернут лицевой стороной на север, а позже ты повернешь его на восток, нормали начнут отображаться некорректно.

И хоть невозможно двигать объект в пространстве, у таких карт есть одно преимущество — при работе с ними не нужно думать о направленности нормалей объекта.

Их часто используют в текстурировании, так как они могут дать вводную информацию о том, как свет падает на объект. В Substance painter практически каждый генератор работает в том числе и на основе информации из карты World Space Normal.

Object Space Normal — это модифицированная версия World Space Normal. Она отличается тем, что адаптирует карту нормалей и меняет ее ориентацию при перемещении объекта в пространстве.

Из недостатков: карта не подходит для использования на деформирующихся объектах. Например, её невозможно будет корректно применять на стену с симуляцией разрушения, или на развевающуюся на ветру ткань.

Изогнутые карты нормалей сочетают в себе информацию из AO и normal map. Они помогают усилить работу карты ambient occlusion и нужны для большего контроля над отражаемым от объекта светом. Удобно использовать, если нет возможности подключить Screen Space Reflection.

Большинство из перечисленных карт встречается в работе очень редко, но знать о них нужно, если планируешь расти в 3D. Чаще всего все используют Tangent Space Normal в качестве карты нормалей и World Space Normal для текстурирования.

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

Источник

Это норма — 3: типы карт нормалей

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

Карта нормалей касательного пространства (Tangent space normal map): самый распространённый сегодня тип карт нормалей; именно о нём мы говорили в предыдущих статьях. Он модифицирует направление нормалей модели на основании направления нормалей её вершин (то есть нам нужно контролировать нормали вершин lowpoly-модели).

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

Карта нормалей касательного пространства Mikk (Mikk tangent space normal map). Не все 3D-редакторы вычисляют среднее нормалей вершин одинаково. Это приводит к тому, что в разных движках внешний вид карт нормалей отличается, поэтому нам нужно запекать карту нормалей при помощи того же способа, который использует программа рендеринга (это называется «использовать синхронизированный рабочий процесс (synched workflow)»)

Mikk предложил способ вычисления нормалей вершин, который должен был стать универсальным, чтобы все программы вычисляли их одинаково. С точки зрения рабочего процесса это означает, что можно использовать низкополигональную модель (lowpoly) со всеми её усреднёнными нормалями (с одной группой сглаживания (smoothing group) или со сглаживанием всех граней), запечь карту нормалей в касательном пространстве Mikk, и это будет выглядеть точно так же, как высокополигональная модель (highpoly), без необходимости устранения ошибок сглаживания или отделения жёстких граней в UV. В будущем я напишу туториал о том, как это делается.

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

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

Двухканальная карта нормалей касательного пространства (2-channel tangent space normal map): оказывается, что при помощи информации, хранящейся в двух из трёх каналов карты нормалей, компьютер может вычислить третий, снизив занимаемый объём памяти ценой увеличения количества вычислений. Так как обычно в большем дефиците находится память, такая оптимизация используется часто и некоторые движки выполняют её автоматически (например, Unreal Engine, когда мы устанавливаем для сжатия нормалей текстуры параметр «normal map»). Освободив один канал карты нормалей, мы можем уменьшить размер текстуры или использовать этот канал для metalness/roughness/opacity…

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

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

Карта нормалей мирового пространства (World space normal map): эта карта нормалей вместо того, чтобы модифицировать направление нормалей вершин, полностью их игнорирует и меняет способ отражения света lowpoly-моделью в мировом пространстве (world space) (при запекании она считает, что нормали вершин параллельны осям мира).

Можно сказать, что карта нормалей касательного пространства сообщает модели «ты должна отразить свет вправо», а карта нормалей мирового пространства — «ты должна отразить свет на восток».

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

Такие карты нормалей более разноцветные и в них больше заметных градиентов; их использовали, потому что в таком случае не нужно думать о нормалях вершин lowpoly, но у них есть недостаток — нельзя двигать модель, потому что она будет выглядеть странно (мы устанавливаем грань так, чтобы она всегда отражала свет на восток. Если повернуть её, то грань продолжит отражать свет на восток.).

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

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

Стоит также помнить, что мировые координаты в разных приложениях реализованы по-разному: в Unreal, 3D Studio Max, Blender вверх направлена ось Z, а в Maya, Modo и Cinema4D — ось Y. Это значит, что при переносе между приложениями карты нормалей мирового пространства могут портиться.

Карта нормалей пространства объекта (Object space normal map): это улучшенная версия предыдущего типа карт, и она очень на него похожа. Идея заключается в том, что при перемещении модели в мире её карта нормалей мирового пространства должна переориентироваться относительно объекта.

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

Наклонные карты нормалей (Bent normal maps): по сути, в них сочетается информация AO и карты нормалей, наклоняющая направления нормалей так, чтобы свет стремился отражаться к тем частям модели, на которые попадает свет.

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

16-битные карты нормалей (16 bit normal maps): иногда, когда на карте нормалей присутствует очень плавный градиент, мы можем замечать появление полос. Эти полосы возникают из-за нехватки цветов для представления плавного градиента, обычно вызванной сжатием текстур.

Узнать больше о 16-битных картах нормалей можно у самого бога туториалов — Earthquake.

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

world space normal map что такое. Смотреть фото world space normal map что такое. Смотреть картинку world space normal map что такое. Картинка про world space normal map что такое. Фото world space normal map что такое

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

Так какой же из типов мы должны использовать?

В 90% случаев наилучшим решением являются карты нормалей касательного пространства Mikk. В отличие от вариантов с использованием карт нормалей пространства мира или объекта, модель сможет деформироваться, а направление нормалей останется правильным.

Следует запекать карту нормалей в том же касательном пространстве, что и в программе рендеринга. Наиболее распространённое касательное пространство — это Mikk, так что по возможности используйте его.

Если же на вашей карте нормалей появляется пикселизация, подумайте над использованием 16-карт нормалей или одного из упомянутых выше решений.

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

Благодарю за прочтение, надеюсь, статья была вам полезна. Спасибо Shnya за комментарии и помощь.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *