Квазижидкость из 100 тысяч частиц на gpu

Проекты в стадии разработки.

Квазижидкость из 100 тысяч частиц на gpu

Сообщение Zolden 10 сен 2016, 17:25

Используя ComputeShader для вычислений на видеокарточке, я сделал симуляцию жидкости из 100.000 взаимодействующих частиц. Работает шустро, в реальном времени 30fps на карточке nvidia geforce 750m.



Физическая модель, то есть математика взаимодействия между частицами, пока что не доведена до задуманной сложности. Хочу, чтоб моделируемое вещество вело себя как твёрдое тело.
Аватара пользователя
Zolden
UNITрон
 
Сообщения: 156
Зарегистрирован: 29 мар 2014, 19:05
Откуда: Москва

Re: Квазижидкость из 100 тысяч частиц на gpu

Сообщение Cr0c 10 сен 2016, 17:42

Тогда надо частиц как минимум в 10^6 раз больше. И симулировать либо очень упрощенно, либо более глубоко, чем просто квазичастицы, но это ещё раз 10-100 больше элементов понадобится.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Квазижидкость из 100 тысяч частиц на gpu

Сообщение Zolden 10 сен 2016, 20:33

Cr0c

Я попробую "более глубоко". А именно, добавлю химические связи между частицами, которые сделают контакт более жёстким. Сейчас реализованы столкновение, вязкость (как бы трение, обмен скоростью в небольшом радиусе), и магнитное отталкивание. Вряд ли понадобится больше частиц, мне ведь не нужно абсолютное правдоподобие, просто чтоб они друг за друга держались в составе кристалла, не способного быть разрушенным гравитацией, но разрушимого более сильным воздействием. Если это сработает на небольшом количестве частиц, то же самое будет и для большего их числа.

Конечно, интересней было бы поэкспериментировать с большим количеством, но даже при всех мерах оптимизации, 100К - предел на моей видюшке. А если взять самую современную, у которой 2560 ядер и шина 512 бит, то можно до миллиона в реальном времени обсчитывать.
Аватара пользователя
Zolden
UNITрон
 
Сообщения: 156
Зарегистрирован: 29 мар 2014, 19:05
Откуда: Москва

Re: Квазижидкость из 100 тысяч частиц на gpu

Сообщение waruiyume 10 сен 2016, 20:39

У Вас интерес исключительно академический, или есть практическая цель для применения?
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Квазижидкость из 100 тысяч частиц на gpu

Сообщение Zolden 10 сен 2016, 21:13

waruiyume
Играл когда-нибудь в старую игрушку "Scorched earth"? Хочу её ремейкнуть с "настоящей" землёй.
Аватара пользователя
Zolden
UNITрон
 
Сообщения: 156
Зарегистрирован: 29 мар 2014, 19:05
Откуда: Москва

Re: Квазижидкость из 100 тысяч частиц на gpu

Сообщение Zolden 02 окт 2016, 23:25

Продолжение.

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

В итоге, удаётся с приемлемой для рилтайма скоростью моделировать только 30 тысяч частиц (по сравнению с сотней тысяч из предыдущего видео). Но я доволен, получилось что-то похожее на твёрдую землю, годную для езды по ней танчиков и взаимной перестрелки.

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

Аватара пользователя
Zolden
UNITрон
 
Сообщения: 156
Зарегистрирован: 29 мар 2014, 19:05
Откуда: Москва

Re: Квазижидкость из 100 тысяч частиц на gpu

Сообщение Cr0c 03 окт 2016, 14:47

Красивенько. Для оптимизации могу посоветовать использовать частицы при взрыве, а не постоянно - уровень из статичных частиц, а обрабатываются только те, которые в радиусе взрыва.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Квазижидкость из 100 тысяч частиц на gpu

Сообщение Zolden 03 окт 2016, 20:45

Cr0c писал(а):уровень из статичных частиц, а обрабатываются только те, которые в радиусе взрыва.

Да, это одна из идей, которые были у меня с самого начала, потому что ясно было: так много частиц невозможно быстро считать. Но это было прежде, чем я открыл для себя могущество вычислений на gpu. Так что я на некоторое время оставил эту идею в стороне.

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

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

И это один из примеров нетривиальности идеи со спящими частицами. Так что я пока не спешу эту идею реализовывать, но и не отказываюсь от неё совсем. Потому что вроде бы текущей производительности хватает.
Аватара пользователя
Zolden
UNITрон
 
Сообщения: 156
Зарегистрирован: 29 мар 2014, 19:05
Откуда: Москва

Re: Квазижидкость из 100 тысяч частиц на gpu

Сообщение Paul Siberdt 03 окт 2016, 22:07

Зефи-и-и-ирка!

А если создать несколько полей а-ля лоды и частицы будить согласно состоянию ведущей частицы предыдущего поля?
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Квазижидкость из 100 тысяч частиц на gpu

Сообщение Zolden 04 окт 2016, 13:46

Paul Siberdt писал(а):Зефи-и-и-ирка!

А если создать несколько полей а-ля лоды и частицы будить согласно состоянию ведущей частицы предыдущего поля?

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

А насчёт побудки частиц - да, что-то вроде лодов уже используется, например, сетки плотности и гравитации. Возможно, удастся придумать быстрый способ перехода в сон и обратно.
Аватара пользователя
Zolden
UNITрон
 
Сообщения: 156
Зарегистрирован: 29 мар 2014, 19:05
Откуда: Москва

Re: Квазижидкость из 100 тысяч частиц на gpu

Сообщение Zolden 15 окт 2016, 01:48

Сделал прототип игры. Танк сделан тоже из частиц. Может стрелять.

Аватара пользователя
Zolden
UNITрон
 
Сообщения: 156
Зарегистрирован: 29 мар 2014, 19:05
Откуда: Москва

Re: Квазижидкость из 100 тысяч частиц на gpu

Сообщение Diab10 15 окт 2016, 08:48

Офигеть :D
Как такое вообще на ГПУ можно сделать, не представляю :-o
Сорцы не будете открывать? Если нет, то мб дадите какие-нибудь полезные ссылки почитать? :)
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: Квазижидкость из 100 тысяч частиц на gpu

Сообщение samana 15 окт 2016, 11:07

Diab10 писал(а):Как такое вообще на ГПУ можно сделать, не представляю

А я даже не представляю, как такое вообще можно сделать :-s . Выглядит очень классно! :-bd
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Квазижидкость из 100 тысяч частиц на gpu

Сообщение Syberex 15 окт 2016, 11:30

Охренеть, желейный танк в пшенной каше :-o
Сделайте пшенный майнкрафт :D
(3A4OT)
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Квазижидкость из 100 тысяч частиц на gpu

Сообщение Zolden 15 окт 2016, 13:48

Diab10 писал(а):Офигеть :D
Как такое вообще на ГПУ можно сделать, не представляю :-o
Сорцы не будете открывать? Если нет, то мб дадите какие-нибудь полезные ссылки почитать? :)


С туториалами по Compute Shader слабенько, я нашёл только вот этот:

http://kylehalladay.com/blog/tutorial/2 ... Nifty.html

Или вот ещё видосик есть:

https://www.youtube.com/watch?v=qDk-WIOYUSY

И что-то ещё там-сям нагуглил, уже не помню. В основном пришлось методом проб и ошибок разбираться.

А что касается симуляции множества взаимодействующих частиц, то это вещь довольно простая: создаёшь массив, для каждой частицы координаты, скорость и ещё какие угодно параметры, и на каждом шаге делаешь расчёт взаимодействий, на его основе меняешь скорости, и в соответствии с текущей скоростью изменяешь координаты. Только оптимизации нужно много, чтоб сложность O(N * log(N)) была, а не O(N^2).

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

А вот прямо этот проект с частицами я пока не буду выкладывать, но когда доделаю игру - может и выложу.
Аватара пользователя
Zolden
UNITрон
 
Сообщения: 156
Зарегистрирован: 29 мар 2014, 19:05
Откуда: Москва

След.

Вернуться в Кузня

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1