4.4. Тонкая настройка Карт Нормалей в Фотошопе

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

4.4.1. Некоторая Общая информация о TS (пространство касательных) Карт Нормалей

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

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

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

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

Основная проблема в способе, которым каждое приложение вычисляет/отображает карты нормали пространства касательных.

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

Обычно пространство касательных в треугольнике будет вычислено следующим образом:

- вектор нормали всегда будет перпендикулярен поверхности (треугольнику); это будет синим и будет сохранено в синем канале карты нормали.

- Тангенс (красный, сохраненный в красном канале) и бинормаль (зеленый,сохраненный в зеленом канале), векторы будут ориентированы в соответствии с UVs - тангенс будет слева направо (или справа налево) в UV пространстве, таким образом это будет координата U в пространстве текстуры; а бинормаль будет снизу вверх (или сверху вниз), таким образом это будет V координата в пространстве текстуры. Вероятно Вы видели во многих диалогах для карт нормали опции для отражения красного или зеленого канала. Эти опции переворачивают ориентацию тангенса (слева-направо/справо-налево) и бинормали (снизу-вверх/сверху-вниз), некоторые приложения используют ориентацию отличающуюся от других; Вы можете перевернуть каналы в Фотошопе, например чтобы первернуть красный канал нажимают Ctrl+1 (чтобы перейти в красный канал), и Ctrl+I (чтобы инвертировать ее), затем Ctrl + ~ (тилда, которая слева от клавиши «1»), чтобы возвратиться к полному изображению RGB (то же самое для зеленого Ctrl+2, Ctrl+I, Ctrl + ~).

Предположим, что я разрезал UVs вдоль ребра и повернул одну часть на 90 градусов по часовой стрелке как в изображении ниже. Из-за вращения в UV пространстве пространство касательных для первого треугольника будет другим чем в первой ситуации (триада RGB для первого треугольника также повернулась на 90 градусов вокруг синей оси).

В результате этого ориентация UV оболочек затронет цвета, которые Вы видите в карте нормалей; если Вы повернете UVs своей модели скажем на 90 градусов по часовой стрелке и повторно вычислять карту нормалей, то цвета в новой карте будут совсем другими (не потому что все изображение повернется на 90 градусов, Вы можете повернуть на эти 90 градусов каналы в Фотошопе и сравнить с новой версией карты нормалей, чтобы проверить - они будут различными).

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

Теперь для того, чтобы вычислить карту нормалей, raytracing алгоритм проводит луч от текущей точки low-poly к hi-poly и в пункте пересечения с ней вычисляет нормаль для hi-poly в мировом пространстве (WS). Затем эта нормаль преобразуется в пространство касательных (TS) low-poly версии и сохраняется в карте нормалей. Таким образом Вы видите, что вычисленная нормаль зависит от пространства касательных, используемого для low-poly версии, и карта нормали пространства касательных должна быть создана, используя ту же самую нормаль/тангенс/бинормаль? Которая будет использоваться игрой (или приложением, которое Вы используете, чтобы отобразить карту нормали), иначе нормали будут извращены, и Вы будете видеть неодонородности на границе

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

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

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

Я запеку нормали от плоскости и цилиндра ниже на единственный полигон, подсвеченный зеленым. Как я объяснил ранее, пространство касательных будет: нормаль  (синий), тангенс слева направо (красный) и бинормаль снизу-вверх (зеленый). У цилиндра все полигоны несглажены, таким образом нормали изменятся пошагово, это будет проще проанализировать. Я нумеровал грани на цилиндре от 1 до 7.

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

Наверху изображения у Вас есть цветовая схема: hi-poly - белый, нормали для него являются голубыми, low-poly является сиреневым, нормали для него являются желтыми (так как у нас один полигон, у нормалей будет та же самая ориентация всюду на поверхности),

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

Теперь, для каждой грани в hi-poly, я могу проанализировать векторы нормалей (голубые на цветной маркировке), их тангенсы (красные на цветной маркировке) и нормали (синие на цветной маркировке), компонент бинормали будет нулем для всех их, так как грани параллельны с вектором бинормали = зеленая стрелка, следовательно одного цвета в зеленом канале карты нормали.

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

Серые стрелки, указывающие от low-poly к hi-poly, являются лучами, используемыми во время вычисления карты нормали. Теперь давайте рассмотрим некоторые точки low-poly (A, B, C, D, E, F, G) и увидим то, что фактически происходит.

Примечание: обычно векторы нормализованы (по модулю длины) и если Вы будете анализировать вектор в компонентах TS (или другой системы координат), то у каждого компонента будет реальное значение между -1 и 1. Однако, это будет преобразовано к позитивному целому числу и сохранено в каналы RGB нормальной карты следующим образом:

- Для тангенса (в красном канале) отрицательные значения (-1,0) будут отображены линейно к 0-127, 0 будет 128 (нейтральный) а положительные значения (0,1), будет отображены линейно к 129-255.

- То же самое будет с бинормалью в зеленом канале.

- Для вектора нормали значения могут быть только положительны (0,1), таким образом они будут отображены к 128-255; большую часть времени нормаль hi-poly не будет отклоняться намного по сравнению с вектором нормали в TS для low-poly следовательно синяя компонента карт нормали в TS будет преобладать (синий канал будет главным образом белым); из-за этого карты нормалей TS могли бы быть сжаты, так как используют меньше цветов чем карты нормалей OS(объектного пространства)/WS (мирового пространства), также так как векторы TS не могут указать назад, компонент нормалей будет всегда позитивен, и когда нормализована она может быть закодирована, используя только тангенс, и бинормаль (нормаль будет вычислена основываясь на двух других).

Для точки D, мы испускаем в луч и пересекая hi-poly версию, нормаль будет нормалью грани, номер 4, который будет параллельна с вектором нормали TS. Вы можете видеть, что красный канал будет 128, так как компонент тангенса будет нулем, и нормальный компонент будет 1 закодирован значением 255 (полный белый) в синем канале.

Для точки F, ищущий луч пересечет грань номер 6, и мы можем видеть, что вектор нормали этой грани (голубой по цветной маркировке) будет отображаться в два компонента: компонент тангенса (красный) с положительным значением приблизительно 0.78 кодируется числом 228 в красном канале и компонент бинормали (синем) с положительным значением 0.625 закодированный значением 208 в синем канале.

Для точки B, ищущий луч пересечет грань номер 2, и мы можем видеть, что вектор нормали этой грани будет отображаться в компонент тангенса (красный) с отрицательным значением приблизительно-0.78 закодированный значением приблизительно 22 в красном канале и компонент бинормали (синем) с положительным значением 0.625 закодированный значением 208 в синем канале.

Между прочим, Вы можете видеть индивидуальные каналы в Фотошопе с ctrl+1, ctrl+2, ctrl+3 для красного зеленого цвета и синего цвета и ctrl + ~  для полного RGB. Вы можете скопировать их следующим образом: для красного-> ctrl+1 (переходим в красный канал), ctrl+a (выделяем все), ctrl+shift+c (копируем видимый канал), ctrl + ~ (переходим в полный RGB), и ctrl+v (вставляем скопированное), после этой комбинации быстрых клавиш, у Вас будет красный канал выбранного слоя вставлен как новый слой поверх остальных.

Если я поверну цилиндр на 90 градусов как показано ниже:

карта нормалей и ее отдельные каналы будут выглядеть так:

На сей раз красный канал является однотонным со значением 128 (как был раньше зеленый канал), так как все грани в hi-poly теперь параллельны красной стрелке (и когда нормали будут анализироваться, компоненты тангенса будут нулем, отображенным к 128); зеленый канал (бинормаль) будет выглядеть подобным красному каналу прежде (но повернутым на 90 градусов), а синий канал выглядит также как прежде, но повернутым на 90 градусов.

После того как мы узнали, как рассчитывается каждый канал, мы можем сделать следующую аналогию:

- Я назначил материал Ламберта на hi-poly (цилиндр и плоскость), выбрал цвет - нейтральный полутон (128 128 128), установил накал в нейтральный полутон также (128 128 128) а также установил диффуз в 1

- Мы будем смотреть на цилиндр в окне просмотра сверху (орографическое представление):

- Создайте нормальный направленный светильник с цветом полностью белым, и интенсивностью 1 расположенным справа (свет будет параллелен с экраном).

- Создайте " sucker " направленный светильник, я не знаю, знакомы ли Вы с термином "светильник sucker "... Я видел что их так называют на некоторых форумах, и я назову их так же. Это - светильник с отрицательной интенсивностью. Такой светильник фактически вычтет / "отсосет (sucker)" свет, таким образом затемняя сцену. Довольно удобно, когда у Вас есть сверхзасветка в сцене, если Вы корректируете атрибуты для светильников уже находящихся в сцене. Этим путем Вы можете добавить светильник sucker устраняя проблему. Теперь добавьте светильник sucker с полностью белым цветом и интенсивностью -1 слева так чтобы он также светил параллельно экрану (таким образом оба светильника будут в плоскости бинормаль-тангенс).

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

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

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

Если я захочу увидеть все каналы вместе, мне нужно изменить цвет светильников, чтобы он воздействовал только на один канал.

На рисунке ниже Вы видите все пять светильников.

С помощью таких светильников Вы можете увидеть карту нормалей в реальном времени на виде сверху для любой геометрии.

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

4.4.2. Карты нормалей в Фотошопе

Теперь я попытаюсь смоделировать в Фотошопе тот же самый эффект что показан выше со светильниками в майя, но на сей раз используя стили слоя.

Я установил цвет фона в 128 128 255

Мне будут нужны 5 слоев, по одному для каждого светильника (сделайте 5 слоев и измените их непрозрачность на 0). Затем я сделаю выделение и заполню их в каждом слое, но только эффекты будут видимы.

Для Красного обычного светильника, примените эффект как показано ниже (bevel и emboss), выключите использование глобального освещения, установите угол в 0 (светильник будет светить справа), установите высоту в 0 (свет  параллелен экрану), highlight mode установите в цвет 255 128 128 (RGB), чтобы осветить только красный канал, и непрозрачность в 100 %, непрозрачность для теней в 0 (нам не нужны они).

Для красного "sucker" светильника скопируйте и вставьте те же установки, затем измените угол на 180 (свет приходит слева) и измените цвет на 0 128 128, чтобы он вычитал свет/тень только из красного канала.

Для обычного зеленого светильника все тоже самое, но угол 90 (свет идет сверху) и цвет 128 255 128 для освещения только зеленого канала.

Для зеленого "sucker" все тоже самое, угол -90, цвет 128 0 128.

И наконец для синего канала, примените эффект inner shadow, выключите глобальное освещение, расстояние в 0, choke в 0, установите размер в тот, что Вы вводили для размеров bevel and emboss и цвет в 255 255 128, чтобы затемнить только синий канал, непрозрачность в 100.

Забавная часть - то, что теперь, когда у Вас есть стили слоя на месте, Вы можете только пойти и корректировать размер в пикселях для эффектов и поиграть со всеми другими атрибутами в bevel and emboss. Если Вы хотите "вырезать" детали, Вы только должны изменить напрвление в bevel and emboss от вверх на вниз для красных и зеленых стилей слоя, Вы можете размыть выделение с Гауссовой размытием, чтобы достигнуть более гладких результатов. Вы можете дублировать этот набор и изменить атрибуты снова и сделать все что Вы захотите. Вам решать как экспериментировать. Вы можете даже поместить набор слоев поверх других карт нормалей и это будет выглядеть хорошо (только примените фильтр NVIDIA для производства карт нормалей для нормализации конечной текстуры).

Ниже я дурачился в течение нескольких минут, дублируя набор слоев, который я построил ранее, заполняя слои в наборе некоторыми выделениями и изменяя атрибуты для эффектов, нормали не на 100 % точны, как были бы сделаны с реальной геометрией (из-за рендеринга, сделанного bevel and emboss ). Но если Вы устанавливаете атрибуты соответственно, Вы можете едва лишь заметить это.

Попробуйте сделать карту нормалей подобную этой геометрией за 15 минут. Я уверен – у Вас не выйдет

Эта техника была использована для Peril (лука).

С картой нормалей.

Полностью текстурированный.

Другая вещь, которую Вы можете сделать, наложить две карты нормалей в Фотошопе, я видел много людей, фактически устанавливающих режим смешивания слоев в overlay и называющих это окончательным. Это - не совсем хороший метод, и я покажу Вам почему в следующем изображении. Скажем, мы хотим наложить карту нормалей показанные внизу; Вы можете видеть, как синий канал выглядит для каждой карты и как должно выглядеть объединенное изображение. Но устанавливая режим для наложения, из за того что синий канал - почти белый, он полностью затрет любые детали в синем канале, и составная карта нормалей будет выглядеть неправильной.

Ниже конечная комбинированная карта когда установлен режим наложения overlay; мы полностью вытираем информацию о нормальном компоненте, таким образом оверлейный режим для смешения является БОЛЬШИМ НЕТ НЕТ НЕТ

Лучший способ объединить их состоит в том, чтобы заставить красные и зеленые каналы накладываться overlay, а синий канал умножаться... теперь, как я сделаю это? Хорошо, продублируйте второй слой (слой, который, как предполагалось будет установлен в режим overlay ), один слой будет установлен в режим overlay, другой в умножение. Теперь, для набора слоев в оверлее я должен нейтрализовать информацию в синем канале, выбирая нейтральный полутон (128 128 128) и заполняя синий канал этим цветом - который будет ctrl+3 (чтобы перейти в синий канал) и alt+backspace (чтобы заполнить его нейтральным серым, предполагая, что цвет FG будет 128 128 128), этот слой должен теперь быть похожим на этот когда рассматривается один.

Для второго набора слоев, которые будут умножаться, я должен нейтрализовать красные и зеленые каналы (для этого заполнить их белым), так установите белый как цвет FG и ctrl+1 (чтобы перейти в красный канал) и alt+backspace, чтобы заполнить белым, то же самое для зеленого ctrl+2 и alt+backspace; второй слой должен быть похожим на изображение ниже когда рассматривается один.

Ниже сравнение между этими двумя методами, очевидно комбинация overlay/умножение более верный способ.

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

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

Теперь, когда Вы знаете, как объединить карты нормалей, Вы вероятно спрашиваете, зачем Вам нужно делать это? Хорошо, я дам Вам некоторые примеры.

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

Это может помочь Вам в других ситуациях также:

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

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

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

Финальное изображение Тени.

А ниже модель с «супер-настроенной» картой нормалей.

Это практически все, что я хотел сказать в этом уроке и если Вы все еще его читаете, вероятно было кое-что, что захватило Ваше внимание. Спасибо за чтение.

5. Финальная модель

В заключении этого урока я хотел бы показать Вам несколько финальных визуализаций Varga (полностью оттекстурированных).

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

Удачи с картами нормалей!

Перевод Беляев Валерий ака seaman.

Вернуться к урокам


EOMY.NET: бесплатный хостинг без рекламы
EOMY TOP 100 Рейтинг SIMPLETOP.NET