Автор Тема: Displacement шейдеры. Тесселяция.  (Прочитано 896 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Декабрь 04, 2014, 17:13:07 pm
Прочитано 896 раз

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2453
  • Репутация:
    153
    • Просмотр профиля
Displacement шейдеры. Тесселяция. (перепечатка статьи)



Всем привет! Раз уж пошел разговор о материалах и шейдерах, то давайте поговорим о картах смещения и, соответственно, о тесселяции. Замощение или tessellation – это процесс деления полигонов на большее количество многоугольников. В играх они делятся по мере приближения к ним камеры.

Это фишка появилась в DirectX 11, а значит для ее использования нужно его включить. Идем сюда: Edit -> Project Settings -> Player. Выбираем в инспекторе платформу для настройки (значок со стрелкой вниз – это PC и Mac) -> Other Settings -> Use DirectX 11. Перезапускаем Unity.

Еще не забудьте импортировать пакет с шейдерами DX11.

Окей, делим мы полигоны, но зачем? Первое – увеличение количества полигонов есть сглаженный объект. Второе – есть так называемые карты смещения или Displacement Map. Действие карты основано на черном и белым тонах 2D текстуры или ее альфа канала (в Unity второе). Помните Bump и Parallax? Первого в Unity нет, но они работают над смещением пикселов, однако объемной модель не делают – для этого нужно много полигонов. Догадываетесь, о чем речь? Верно, карты смещения изменяют геометрию, а тесселяция подготавливает объект для этой карты. Минус один – много-много полигонов. Но и тут есть решение – полигоны делятся в зависимости от расстояния от камеры до объекта.
В меню с шейдерами появилась вкладка Tesselation: smooth – просто увеличение количества полигонов, dispacement – изменение геометрии.

Появилась карта Heightmap – для нее нужен альфа канал: если у вас его нет, то откройте текстуру в инспекторе и выберите Alpha from Grayscale – опция создаст альфа канал исходя из черно белой текстуры (не забудьте Apply нажать). Применив текстуру, вы, скорее всего, увидите нечто, посланное дьяволом из самого ада, так что уменьшите параметр Height – высоту, на которую нужно поднять полигоны.

Edge Length – наименьшая (как я понимаю) длина ребер у полигонов, на которые разделится объект. По сути, если нужно больше полигонов для большей детализации и большей вероятности отправить процессор к Нему, то уменьшайте его на здоровье ;) Но я шучу: если реально надо и сцена не будет перегружена, то убавляйте длину.

Советую использовать Parallax для плоских объектов, т.к. эффект при взгляде под углом сохранится, а на свете мало игроков, которые будет проверять, объемная стена или пора креститься.

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

Еще применяйте тесселяцию для персонажей – они становятся гладкими, *разрешите не продолжать*

Читал как-то в одном блоге о том, что nVidia просто срубила на этой технологии денег от продаж мега крутых видеокарт. Разумно. Неразумно – использовать ее везде и всегда, знайте меру. Обычно Parallax более чем хватит.]

Смотрите сами: между вектором нормали и вектором взгляда угол не большой (<60). Скажите после этого, на каком скрине Displacement, а на каком – POM.


Текстуру взял из бесплатного раздела gametextures.com

Вот в общем-то и все.
До встречи!

Источник
Уроки по компьютерной графике и созданию игр
« Последнее редактирование: Декабрь 04, 2014, 17:15:32 pm от Mimi Neko »