Страница 1 из 5

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

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



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

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

СообщениеДобавлено: 10 сен 2016, 17:42
Cr0c
Тогда надо частиц как минимум в 10^6 раз больше. И симулировать либо очень упрощенно, либо более глубоко, чем просто квазичастицы, но это ещё раз 10-100 больше элементов понадобится.

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

СообщениеДобавлено: 10 сен 2016, 20:33
Zolden
Cr0c

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

Конечно, интересней было бы поэкспериментировать с большим количеством, но даже при всех мерах оптимизации, 100К - предел на моей видюшке. А если взять самую современную, у которой 2560 ядер и шина 512 бит, то можно до миллиона в реальном времени обсчитывать.

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

СообщениеДобавлено: 10 сен 2016, 20:39
waruiyume
У Вас интерес исключительно академический, или есть практическая цель для применения?

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

СообщениеДобавлено: 10 сен 2016, 21:13
Zolden
waruiyume
Играл когда-нибудь в старую игрушку "Scorched earth"? Хочу её ремейкнуть с "настоящей" землёй.

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

СообщениеДобавлено: 02 окт 2016, 23:25
Zolden
Продолжение.

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

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

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


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

СообщениеДобавлено: 03 окт 2016, 14:47
Cr0c
Красивенько. Для оптимизации могу посоветовать использовать частицы при взрыве, а не постоянно - уровень из статичных частиц, а обрабатываются только те, которые в радиусе взрыва.

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

СообщениеДобавлено: 03 окт 2016, 20:45
Zolden
Cr0c писал(а):уровень из статичных частиц, а обрабатываются только те, которые в радиусе взрыва.

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

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

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

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

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

СообщениеДобавлено: 03 окт 2016, 22:07
Paul Siberdt
Зефи-и-и-ирка!

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

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

СообщениеДобавлено: 04 окт 2016, 13:46
Zolden
Paul Siberdt писал(а):Зефи-и-и-ирка!

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

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

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

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

СообщениеДобавлено: 15 окт 2016, 01:48
Zolden
Сделал прототип игры. Танк сделан тоже из частиц. Может стрелять.


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

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

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

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

А я даже не представляю, как такое вообще можно сделать :-s . Выглядит очень классно! :-bd

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

СообщениеДобавлено: 15 окт 2016, 11:30
Syberex
Охренеть, желейный танк в пшенной каше :-o
Сделайте пшенный майнкрафт :D
(3A4OT)

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

СообщениеДобавлено: 15 окт 2016, 13:48
Zolden
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 рисую фрактал мандельброта (очень быстро получается). Код хорошо откомменчен, можно разобраться, как всё работает. Мне бы такой пример пригодился, когда я только начал.

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