41

Эффект силового поля (шейдер)

Небольшая практика в эффектиках и шейдерах под Unity. Хотелось мне сделать эффект силового поля, в которое попадают что-либо и провоцирует световое пятно, растекающееся по поверхности. Сказано - сделано :)

Эффект силового поля (шейдер) Шейдеры, Unity3D, VFX, Gamedev, Гифка, Длиннопост, Силовое поле

Немношко матана для любителей: сфера - это обычный меш, эффектом френеля симулируем "энергетическое" поле, с прозрачностью в зависимости от взаимного направления нормали вертекса и направления зрения камеры.

Эффект силового поля (шейдер) Шейдеры, Unity3D, VFX, Gamedev, Гифка, Длиннопост, Силовое поле

отдаем всё это добро в пиксельный шейдер, где считаем возвращаемый цвет пикселя (на всякий случай добавил ещё и текстуру для поля, какие-нить флуктуации там добавить о.О

Эффект силового поля (шейдер) Шейдеры, Unity3D, VFX, Gamedev, Гифка, Длиннопост, Силовое поле

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

Ну и сам эффект растекающейся энергетической вспышки

Эффект силового поля (шейдер) Шейдеры, Unity3D, VFX, Gamedev, Гифка, Длиннопост, Силовое поле

_InpactPoint - это вектор направления попадания (для отрисовки пятна в нужной стороне, передавать его придётся с помощью скрипта(конечное, минус начальное, ну и привести к единичке). Подсказочка:

Эффект силового поля (шейдер) Шейдеры, Unity3D, VFX, Gamedev, Гифка, Длиннопост, Силовое поле

Нормаль берём из вертекса.

_HitOverlayArea - регулирует величину пятна (плавность пятна зависит от полигонажа сферы, потому что работаем с нормалями вертексов. Тут немношко экономии - нормали берём в вертексном шейдере. Но если экономить не надо - можно нормаль посчитать и во фрагменте, тогда никаких проблем с размерами пятна не будет).

_HitOverlayValue - сила пятна.

_HitColor - собственно цвет для пятна.

Цвет самого поля задается через _TintColor и сохраняется в переменную col (код был выше).

Собственно сам инспектор всего этого добра, для тех, кто не хочет математики, а подёргать ползунки:

Эффект силового поля (шейдер) Шейдеры, Unity3D, VFX, Gamedev, Гифка, Длиннопост, Силовое поле

Надеюсь, что подписульки понятны лучше, чем названия переменных :)


Гитхаб: https://github.com/MrMouseSE/EnergyShieldShader

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"