Pull to refresh

Comments 22

Первые 5 секунд с эффектом, дальше без. Чтобы как раз показать разницу. Из-за качества видео и ракурса может быть визуально не так заметно, но общее впечатление от картинки создают такие мелочи. Хотя пример с машиной далёк от идеала, так как нужно ещё сделать всплески, нормально настроить партиклы самого дождя, разбить на лужи и сделать эффект преломления. Но это не цель данной статьи. Вообще с таким ракурсом я бы чаще применял что-то попроще, но в случае когда пользователь может на всплески смотреть чуть ли не в упор (пролёт камеры в кат сценах, VR, шутеры) — незаменимая штука
Ну то есть цель статьи и примера скорее показать математику и применение. Если углубляться, то вообще лужи должны быть, или отдельными мешами и в шейдере должна присутствовать рефракция, или должны в фрагментном шейдере основного меша делать лужу и так же с рефракцией, сейчас деформируется сама дорога. На дальних планах выглядит адекватно, работает шустро. На ближних уже не так. Собственно благодаря тому, что деформируется сам меш и получается эффект похожий на рефракцию (пример с плиткой), но по хорошему для этого должна быть в фрагментном шейдере часть которая «выдавливает» лужи, чтобы они обладали реальной глубиной. С нынешним эффектом, если бы дорога была бы по ровнее, это выглядело бы так, как будто вся дорога под водой. Нынешний шейдер с небольшой доработкой по рефракции уже будет выглядеть лучше.

судя по всему, когда на видео странно шевелится асфальт — это оно.

Видео бы 1080р, капли еле видны. А так спасибо за математику :)
А зачем так делать? Обычно это делают частицами с пост дисторшином либо просто частицами брызг от поверхности, а так это выглядит не красиво, да и сам эффект еле заметен. Волны есть смысл пускать только для воды (лужи, речки и тд)
Если речь про пример с дорогой и дождём — это то, что было под рукой по сути. С такого ракурса и на таком расстоянии особого смысла действительно не имеет. Но если взять ведро с водой, случай VR и другие случаи когда пользователь может подойти в упор, то тогда математика выглядит в разы лучше. Плюс сам по себе шейдер вертексный и дешёвый, только требовательный к геометрии. Брызги партиклами доработать — это не супер сложно. Вообще суть была в волновой математике больше, чем в видео в конце. С той же волной можно сделать красивый эффект от падения метеорита и т.п.
Понятное дело, что изначальная идея, что этот эффект накладывается на лужи, где такой эффект и будет. И то с такого ракурса это не имеет смысла. Если сделать по подобному уроку на таком расстоянии тоже будет красиво, пользователь разницы не увидит точно. Статья именно про математику волны, так как изучая вопрос я столкнулся с забавной вещью. Я находил разные видео, где выражение подбиралось видимо «на глаз». Так как кроме базы скажем почему выражение в тут именно такое — непонятно. Собственно цель статьи больше показать применение математики и небольшой кейс, а не сказать «решайте эту задачу так»

В шейдере с несколькими полюсами сделано вообще неоптимально, лучше параметры полюса передавать в этом случае через vertexColor, а не через текстуру. В данном случае текстура не имеет особого смысла

А если ввести ещё одну текстуру и накладывать её на блеск, где есть эффект ряби, то пропадёт эффект "вся дорога под водой"?

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

Разберём немного способы:

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

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

О чём я думал, не назову это способом, просто что мне приходило в голову. Тут суть не в блеске. Если думать над тем, чтобы делать «быстро» без сложной фрагментной части в целом. У нас есть 8 параметров доступных для записи (4 координаты тангентов и вертекс колоров) Если делать процедурненький алгоритм, то мы просто записываем что-то вроде нормал мапа в тангенты, а данные о полюсах в вертекс колоры меша. Для того чтобы разбросать лужи — генерируем шум (поэтому в проекте можно найти простой генератор текстуры шума перлина, так как сама генерация интегрирована в юнити) Дальше, делаем лужи хайполи, а остальную геометрию лоуполи (процедурно — это не так сложно на самом деле, просто по шуму генерируем сетку меша специальным образом) По идее в данном случае нормали в вертексе в соответствии с «кривизной лужи» дадут правильный эффект. Шум станет картой отражений (так как лужа должна отражать сильнее, чем меш под ней) и должно получиться красиво и +- универсальненько. Но условно этот проект я собирал дня 4 где-то (так как надо ещё же найти всю информацию, которую я постарался структурировано описать), а вот всё что я описал писать ещё недельку, и мне пока не до того.
Хотя туплю, нормали можно в нормали и записать, тангенты использовать для чего-то ещё или не использовать вообще. Меш мы не генерируем с нуля. Просто есть базовый, и мы делаем его автоматическую ретопологию с учётом полюсов и геометрии луж. С помощью triangle.Net не так сложно такое сделать. По сути самый сложный алгоритм связанный с ретопологией — это получить контуры для мешей из текстуры шума. Но можно с каким-то шагом разбить текстуру на точки, отсечь по какому-то значению, а дальше алгоритмом распаковки подарка с ограничениями собрать контуры из получившегося облака точек. Если делать это не в реальном времени, а заранее, подобный алгоритм займёт адекватное время. Для произвольной модели единственное с чем по идее могут возникнуть проблемы — это uv маппинг, если он сложный.
C отдельным мешем можно уже с рилтайме делать, что с ретопологией не получится.
Отдельные меши тоже надо заранее генерировать. Обычно на уровне нет задачи ретоп делать прям по ходу дела. Либо на загрузке, либо просто вообще заранее
Можно же в префабах держать готовые меши с материалом как надо настроенным (ночь, день, прочее)
Мне кажется смотрелось бы лучше, если уменьшит амплитуду и сделать резкое затухание волны после первого колебания

Затухание можно сделать добавив множитель 1-(Time/maxTime)

Да, а то выглядит как неньютоновская жидкость

А это как определить? Вроде вполне ньютоновская.

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

Просто в чём проблема того, что я находил по ripple шейдеру. Математика не объяснена и поэтому нереально контроллировать нормально параметры. Увеличив длинну волны и подобрав другую функцию затухания на примере гифки над «Сетка меша это важно» — можно сделать расход волн более похожий на падение капли воды + добавить партиклами всплеск и т.п.

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

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

Шейдер эффекта дождя от 1 капли?! Ожидал чего-то большего. Какой-то трюк, хитрость с частицами, искажение нормалей для "бликов" без затрагивания геометрии. Но тут всего этого нет. Есть лишь уравнение окружности, тригонометрическая функция и много тэгов.

Sign up to leave a comment.

Articles