Войти
UnityФорумArt

Distortion(Displacement?) texture shader

#0
(Правка: 18:02) 17:39, 11 янв. 2021

Привет!
Кто знает, как сделать эффект волны на картинке?
Хочу во время взрыва сделать скриншот экрана, наложить на него круговой distortion с увеличением радиуса, а поверх уже рисовать частички взрыва.

Все что смог найти в сети это distortion через grabpass, что не подходит, так как ресурсоемко для мобилок.
А может это называется Displacement?

Может кто-то идею понимает, как это делается?

Спасибо!


#1
10:32, 12 янв. 2021

А что за проект? Если 2д, то достаточно будет один раз отрендерить тот кусок фона, который непосредственно под эффектом взрыва, а затем передать в шейдер эффекта через SetTexture. Дальше его можно искажать так же, как в варианте с GrabPass.
Все динамические объекты надо будет рендерить поверх этого эффекта, иначе при заходе в его область они будут исчезать, ведь в момент рендера фона их там не было.

#2
12:57, 13 янв. 2021

BooTheJudge
Ага, 2д.
Я понял, сделать скрин, наложить шейдер.

Сейчас я не понимаю по какой формуле в шейдере делать сдвиг текстурных координат относительно нормал карты.

вот такая карта:
NormalRing | Distortion(Displacement?) texture shader

по идее должно получиться красивое искажение по кругу, но не могу сообразить че там прибавлять к uv координатам

#3
(Правка: 13:51) 13:41, 13 янв. 2021

Vogd2
> по какой формуле
время, чем больше время, тем больше волна. Волна идёт от центра. 1 волна находится в UV от (0,0)-(1,1). Две волны (двух, трех, четырех - волновая..) будет соответственно (0,0)-(2..4, 2..4). В положительную или отрицательную особо значения не имеет.
Волна должна исходить из центра, то есть например точка 100,100 это центр
тогда:

length = 1; //длина самой волны (длина квадрата, quad)
x1 = 100-(length/2)*time;
y1 = 100-(length/2)*time;
x2 = 100+(length/2)*time;
y2 = 100+(length/2)*time;

то есть x2-x1 = length.
uv1 и uv2 думаю расчитаете сами, понятно должно быть. Тот же принцип, только от 0 до n (где n - количество волн), если волна всегда только 1, то будет всегда от 0-1.

В шейдере придётся накладывать normal из текстуры и если он больше 0, то именно его и брать. Ну или так

normal = normalize( texture(NormalTexture, NormalUV)+ texture(normalMap, uv));
не особо силён в шейдерах, можете почитать тут как работать с normal картами, это должно помочь. https://habr.com/ru/post/415579/

#4
14:03, 13 янв. 2021

Salamandr
Ага, вроде понял

Сдвинуть по нормали получилось, дальше буду анимировать саму волну, это уже понятней

Displacement | Distortion(Displacement?) texture shader
#5
2:35, 14 янв. 2021

Попробовал сделать GUI - кнопку таким образом. :))
ПылеВлагоЗащищеннаяКнопка

UnityФорумArt