Восстановление детализированной карты нормалей из фототекстуры.

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

Это все начиналось с техники одного из наших моделлеров, Sean McBride. Я просто изменил этот процесс и сделал его проще для себя.

В основном это выглядит так:

  1. Рисуем диффузную текстуру или делаем ее из фотографии. В моем примере это материал камня:

  2. Открываем эту текстуру в Фотошопе и конвертируем ее в формат 16-битного цветного изображения, а затем обесцвечиваем.

    Опционально. Чтобы Вам не нужно было делать вашу карту нормалей tileable, используйте в качестве исходной текстуры уже tileable. Разместите изображение не менее 9 раз на черном фоне - три раза по высоте и ширине. Если Вы это сделаете перед созданием смазанных слоев, Вы удостоверитесь, что центральная копия изображения уже прекрасно будет tiled после завершения карты нормалей. Финальным шагом нужно будет просто вырезать центральную часть изображения и сохранить ее.

  3. Запускаем фильтр карты нормалей от Nvidia на Вашей настроенной серой текстуре.

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

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

    Вам нужно применить фильтр blur, чтобы удалить этот лишний шум, но не делайте слишком большого размытия, чтобы не начали стираться детали. Вам нужно поэкспериментировать, чтобы найти лучшие настройки для Вашей текстуры. (Вы можете также попробовать использовать тип фильтра 3x3 или 5x5 вместо '4 Sample'. Он производит тоже менее зашумленную карту нормалей.)

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

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

  4. Приступаем к самому интересному.

    Делаем в новом слое копию нашей карты нормалей и устанавливаем тип смешения overlay. В этом режиме не ослабляется добавление цветов нормалей. Накладванием слоя на самого себя Вы просто удваиваете интенсивность картинки.

  5. Делаем еще одну копию слоя.

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

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

    Что мы вообще делаем? Просто создаем свои "шаги" высоты в карте нормалей смешивая размытые копии начальной карты поверх самой себя. Удваиваем слой, размываем его немного более предыдущего, перетаскиваем наверх стека, удваиваем копию, размываем, перетаскиваем наверх, и т.д, и т.д...

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

Окончательный результат выглядит так:

Этот финальный результат все же лучше снова сделать tiled смещением текстуры и использованием штампа, или использованием специальной программы типа Seamless Texture Generator Pro.

Примечание: После окончания процесса Вам нужно восстановить голубой канал. Чтобы сделать это запустите снова фильтр Nvidia, но установите его "Normalize Only". При этом установки высоты не имеют значения.

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

Причина шага нормализации на самом деле сложнее. Кратко - карта нормалей это текстура, которая содержит 'векторы нормалей' к поверхности. Направление каждого вектора определяется красным, зеленым и синим каналом. Длина вектора всегда равна 1. Т.к. мы изменили цвета, значение может больше быть неверным. Шаг нормализации решает эту проблему. После него каждый вектор нормали будет длиной именно 1.

Здесь сравнение простого применения фильтра Nvidia и использования описанной техники:

Вы можете видеть, что, вместо тонкой зернистой текстуры, карта нормалей определяет очень большие изменения в нормали поверхности. Это также видно, когда мы посмотрим на финальный результат визуализации в движке Unreal Engine 3:

И т.к. карты нормалей всегда лучше видны в движении, Вы можете посмотреть видео, демонстрирующее карту: Avi Video (6MB)

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

Диффузная текстура:

Простое применение фильтра Nvidia:

Карта нормалей, созданная с перекрытием слоев:

Результат в движке Unreal Engine 3

Видео: Avi Video (3MB)

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

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


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