[Перевод] Реализация эффектов при помощи рисования вершин

Какое-то время назад я наткнулся на интересный пост X: Rebirth — Geometric Lensflares на сайте simonschreibt.de

В этом посте автор рассказал о том, как игра X: Rebirth использует техники рисования вершин для создания эффектов lens flare. Почему это интересно? Потому что современные компьютеры отлично справляются с отрисовкой треугольников и геометтрии, но испытывают небольшие сложности с отрисовкой текстур. Именно поэтому вы скорее всего видели примеры плохого текстурирования в играх или низкое качество текстур даже на максимальных настройках — все эти артефакты вызваны сжатием изображений. Текстуры полезны при создании персонажей, предметов и ресурсов, но иногда их недостаточно для создания эффектов. Большинство эффектов в играх представлено в виде простых фигур, например, сияния или мерцания. Если вы попробуете использовать для эффектов текстуры, то столкнётесь с проблемами сжатия. Да, их форма проста, но нам нужно получить максимальное качество этой формы.

Команда разработчиков X: Rebirth столкнулась с этой проблемой, и решила для реализации некоторых эффектов использовать раскрашивание вершин. Единственное их ограничение заключалось в количестве треугольников. Если вы хотите добиться максимально качественного эффекта, то придётся бороться с ограничениями. В случае текстур такими ограничениями являются сжатие, размер файла, а в случае рисования вершин — количество полигонов модели.

3b4f08a2f7290c869238502e9ffa3d9b.jpg


Каждая вершина имеет собственный цвет. Рисование вершин в Blender.
Для раскрашивания вершин критически важно количество треугольников. Цвет модели будет математически вычисляться интерполяцией между вершинами. Это создаст градиентный переход от одной вершины к другой, но мы ограничены одним цветом на вершину.

Так как же создавать эффекты при помощи техник рисования вершин? Это достаточно просто, даже если вы не художник. Да, если вы профессионал в рисовании вершин, то сможете создавать эффекты гораздо оптимальнее (как это сделано в X: Rebirth), но это требует очень много времени, и я расскажу, как сделать всё в полуавтоматическом режиме.

Если вы изучили сайт simonschreibt.de, то могли найти ещё один интересный метод раскрашивания вершин, используемый в играх серии Homeworld. Идея создания сложных фонов исключительно при помощи раскрашивания вершин натолкнула меня на мысль о переносе некоторых эффектов при помощи Blender.

Сегодня у Blender есть потрясающие функции, но нам нужна старая версия. Наилучшим выбором будет Blender 2.74, потому что более новые версии не поддерживают старые типы запекания. Также нам понадобится бесплатный плагин Weight-and-Color, созданный chebhou (есть и другая возможность, если вы не хотите использовать плагины или старые версии Blender).

Загрузите изображение в Blender 2.74 и дублируйте модель со своим изображением. Эту модель нам нужно будет разделить при помощи subdivide до довольно плотного меша.

1c586615da1f4185f84b77bafe61385b.jpg


Изображение, загруженное как плоскость при помощи аддона «Images as planes»

48b7def20e9f0c5f59d525bbd35cbefd.jpg


Для простого разбиения меша использован модификатор Subdivision surface

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

66a07d5048dce50f818e525011776f7c.jpg


Добавленные данные цветов вершин

afdafde68be98049c42ca9ea33e310c2.jpg


Параметры запекания

Запустим процесс запекания, сначала выбрав изображение, а затем модель высокого разрешения. Перейдём во вкладку запекания и нажмём Bake to Vertex color, а затем Selected to Active.

4dea159de4138046f60f6e01e11dbf4c.jpg


После запекания на модели должны быть запечены красивые цвета вершин. Для улучшения визуализации можно создать материал.

После завершения запекания нажмём Space на клавиатуре и введём «weight & color», используем параметры «Vertex color to weight» и «gray scale».

af3dd5ad33a35e727f789c60d470f875.jpg


Чтобы открыть это меню, нажмите «пробел» в object mode

025b640053f549dd52bba05142bd3985.jpg


Теперь нам нужно добавить модификатор Displacement и использовать только что созданные данные весов в качестве определителя модификатора. Мы создали карту высот на основании нашей текстуры. Нам нужно было это сделать, потому что Blender использует некие алгоритмы для прореживания геометрии (модификатор Decimate). Таким образом мы сообщили Blender, что в нашей геометрии есть фигуры, и в дальнейшем в процессе прореживания Blender не будет обращаться с мешем как с обычной плоскостью.

ef28b119fbf159162cd1d618dc749ecc.jpg


Модификатор Displacement

9e76464c5d7f8c24b41284ce3257dd1c.jpg


Для понятности можно снова отмасштабировать модель до размеров плоскости

Настало время добавления модификатора Decimate. Этот модификатор уменьшает количество полигонов модели, сохраняя её общую форму. Этот этап требует ручной настройки.

420c2d07eb86a7f66e652b6fc4ab6bda.jpg


Обычный Decimate

4fbf663812b77d35a861708d49a93831.jpg


Decimate с определителем

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

dba3712b8931e4cd3d4a24a51cc50e21.jpg


Вот так я получил получил эффекты при помощи раскрашивания вершин. Для этого можно и не использовать старый Blender и плагин. Всё это можно сделать в современном Blender, но могут возникнуть проблемы с модификатором Displacement, если попробовать использовать в качестве входных данных изображение, и вам не удастся использовать собственный определитель в процессе прореживания геометрии (модификатор Decimate).

© Habrahabr.ru