
Эффект объёмного искажения или как я изобретал велосипед.

Началось все с того, что одним из обычных вечеров после продуктивной работы над проектом, чувствуя изрядную усталость от написания кода, я решил сделать небольшой перерыв и расслабиться жмякая по кнопкам геймпада. «Broforce». Среди множества сладостей, которыми игра может порадовать – возможность поиграть одним из множества персонажей культовых боевиков. Одним из таких персонажей, которым мне довелось поиграть был агент J из фильма «Люди в черном». Как и в фильме, персонаж игры бегает с футуристическим пистолетом «Сверчек», при выстреле из которого и возникал тот самый эффект взрывной волны искажающий пространство и именно этот эффект мне жутко захотелось повторить.
Садясь за работу, я поставил перед собой задачу написать класс, с помощью которого можно было бы без особых усилий создавать подобные эффекты. На разработку класса начиная от черкания каких то формул и алгоритмов на листочке, исправления недочетов алгоритма и до работоспособной версии было потрачено примерно 2 дня. Проделанной работой я был доволен, но единственное что меня сильно смущало – производительность, а она сильно страдала при большом кол-ве эффектов на сцене, а также от размеров самих эффектов, поэтому я решил обратиться за помощью по поднятию перфоманса к комраду Кролику (он же TheRabbit, он же Антон Азаров). Просмотрев мое «творчество» Кролик указал на допущенные мной ошибки, которые я незамедлительно принялся исправлять, но на этом участие TheRabbit в этой эпопее не закончилось. Углубившись в изучение кода, он меня «обрадовал», сказав что я пытаюсь изобрести велосипед, к тому же с жутко квадратными колесами, в то время как он уже давным-давно изобретен, попутно дав кучу ссылок на этот самый велосипед, а назывался он как оказалось — DisplacementMapFilter.
Я, конечно же, жутко расстроился, но все же стал потихоньку вникать и писать систему классов для упрощения создания эффектов с использованием DisplacementMapFilter. Хочу сказать что он мне сильно не понравился из за сложности подготовки шейдера, хотя возможно сложным он кажется только мне.
Как итог реализовал два способа реализации задуманных эффектов, у каждого из которых по моему скромному мнению есть свои плюсы и минусы:
- Мой самописный метод. Простой в подготовке шейдеров различной формы и сложности, но, к сожалению, очень ресурсоемкий.
- Метод с использованием DisplacementMapFilter. Очень быстрый в плане перфоманса, но как мне показалось, сложен в подготовке шейдеров.
Для игр, конечно же, лучше использовать второй вариант, но честно говоря, мне жалко выкидывать свой вариант а посему оставлю его тут, мало ли может кому то пригодится)
Примеры использования эффекта:
Самописный метод:
- +11
- EvilMax
Комментарии (9)
Просто хотелось добавить атмосферности. Если сильно раздражает — могу убрать.
Ethan Mars' Main Theme
P.S. игра не взлетела:)