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

<?the_title()?>

VFX Mike расскажет про сумасшедшие возможности геометрического шейдера: превратить треугольники в частицы заданной формы, добавить им сложное движение — и это не предел!

Геометрические шейдеры — это крутая штука, потому что они позволяют превращать треугольник практически во что угодно. При условии, что выходная информация не превышает 1 килобайт (не спрашивайте меня почему). Перед вами простой геометрический шейдер, который превращает в четырехугольники все треугольники, обращенные к экрану, и придает им движение наподобие перемещения частиц, которое может управляться некоторыми параметрами. Если хотите запустить приведенный выше пример в Unity, качайте пакет ресурсов ниже. Экспортируется с 2017.4.3f1, но должно работать и для других версий, так как это просто неосвещенный шейдер.

MeshToParticle.unitypackage

Это просто параметры, которые будут управлять частицами.

_MainTex текстура частиц.
_Color цвет частицы, получается умножением на цвет вершины.
_Factor насколько яркими должны быть частицы (для повышения значений более1).
_Ramp управляет временем жизни частиц и сдвигает их вперед и назад.
_Size размер частиц в мировом пространстве.
_Spread насколько далеко будут сдвигаться частицы в случайном направлении.
_Frequency частота волнообразного шума, который будет добавляться к частицам в течение их времени жизни.
_Motion как далеко частицы будут перемещаться.
_InvFade для смешивания глубины с непрозрачными объектами.

О шейдерах. Геометрический шейдер располагается между вершинным и пиксельным шейдерами: Vertex Shader -> Geometry Shader -> Pixel Shader

Просто определяем используемые переменные.

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

Вершинный шейдер просто отображает положение на мировое пространство.

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

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

Это реальный геометрический шейдер, настоящее мясо всего эффекта. Этот геометрический шейдер получает треугольник (массив из 3 структур appdata), поэтому для начала мы получаем значения для центра треугольника, усредняя 3 его точки.

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

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

Мы также генерируем шум с синусоидальными функциями на основе uvs. Это придает частицам красивое спиралевидное движение.

Теперь добавляем случайное и зашумленное движение в мировое пространство частиц.

Направления вверх и влево для камеры спрятаны в видовую матрицу и мы можем использовать их для генерации положений 4 вершин.

Теперь мы можем отправить обновленные данные appdata в функцию geomVert и добавить результат. Цвет будет одинаковым для всех вершин в кваде, но координаты положения и текстуры перед отправкой данных appdata в функцию geomVert должны быть обновлены.

stream.Append() добавляет вершину к треугольному стрипу. Первые 3 добавления создают первый треугольник, а четвертое добавление производит второй треугольник из 1 новой вершины и 2 старых. Эта штупа известна как треугольный стрип — triangle strip (супер олдскульный термин). Вы можете продолжить добавление вершин, каждая новая вершина будет производить новый треугольник с парой старых вершин. Таким способом можно сделать траву.

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

Источник: http://vfxmike.blogspot.com/2018/07/geometry-shader-adventures-mesh.html

Понравилась статья? Поделиться с друзьями:
Пишет статьи о разработке игр. Не инди, — работает рендеринг-программистом в крупной ААА студии в Санкт-Петербурге. Большой поклонник игр Naughty Dog.

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

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