Войти
ПрограммированиеФорумГрафика

Пример системы столковения частиц на GPU

#0
(Правка: 17:39) 10:29, 12 авг. 2019

Оставлю здесь на случай если кому-то интересно/полезно будет: я добавил новый пример в Diligent Engine который демонстрирует как реализовать систему сталкивающихся частиц на GPU с помощью компьют шейдеров. Пример разбивает экран на тайлы и для каждого тайла строит список частиц который в этот тайл попадают. Количество тайлов такое же как количество частиц, так что каждую частицу в среднем надо проверить с 8 соседями, что дает сложность O(1) для отдельной частицы и O(n) в целом.

Подробное описание здесь.

tutorial14 | Пример системы столковения частиц на GPU

#1
13:12, 12 авг. 2019

Я такое на слабеньком CPU делал еще лет 20 назад.

#2
13:15, 12 авг. 2019

assiduous
прикольно, а сделай частиц раз в 10 больше 

gamedevfor
сколько ж тебе лет тогда?

#3
13:18, 12 авг. 2019

Polyflow3d
> сделай частиц раз в 10 больше
Пусть лучше по степеням двойки сделает. От 2 до 2^32. тут и график можно построить.

#4
(Правка: 18:11) 17:51, 12 авг. 2019

gamedevfor
> Я такое на слабеньком CPU делал еще лет 20 назад.

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

Polyflow3d
> assiduous
> прикольно, а сделай частиц раз в 10 больше 

10^6 частиц у меня на 970GTX работают со скоростью ~23 мс. Алгоритм действительно скалируется линейно от количества частиц.

#5
18:31, 12 авг. 2019

assiduous
> 10^6 частиц у меня на 970GTX работают со скоростью ~23 мс
гравитация есть? если 1e6 частиц могут стабильно под гравитацией лежать друг на друге, то это достаточно круто. покажи видос.

#6
18:47, 12 авг. 2019

Suslik
Как они лежать то смогут? Постоянный обмен импульсами будет. Ка бы так просто все было

#7
(Правка: 19:01) 18:55, 12 авг. 2019

slepov
> Как они лежать то смогут? Постоянный обмен импульсами будет. Ка бы так просто все было
position-based может разрулить 1e5 частиц без особых модификаций на CPU при аккуратной реализации. потом уже нужны хитрости по типу более сильных солверов или shock propagation.

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

#8
19:06, 12 авг. 2019

Suslik
> гравитация есть? если 1e6 частиц могут стабильно под гравитацией лежать друг на
> друге, то это достаточно круто.

Гравитации нет. Напоминаю, что это не продвинутый солвер, а просто базовый пример.

> покажи видос

геймдев не дает загрузить изображения больше 512 кб. Вот есть гифка.

#9
(Правка: 19:11) 19:11, 12 авг. 2019

assiduous
> геймдев не дает загрузить изображения
их и не надо загружать. надо вставлять ссылку:

[img=https://github.com/DiligentGraphics/DiligentSamples/blob/master/Tutorials/Tutorial14_ComputeShader/Animation_Large.gif?raw=true]
Изображение

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

#10
19:20, 12 авг. 2019

Suslik
> особенность моделирования гравитации в том, что частицы плотно упаковываются и
> этот случай требует аккуратного разрешения многих протяжённых во времени
> контактов. в остальном — всё то же самое.

Мне так кажется, что если все частицы под действием гравитации упадут вниз и упакуются, то их кинетическая энергия перейдет в тепло - нет?

#11
20:03, 12 авг. 2019

assiduous
конечно, в идеале. в реальности сложно рассчитать обменные импульсы таким образом, чтобы вели себя стабильно и не "вскипали".

#12
21:15, 12 авг. 2019

assiduous
Обычно считается импульс покоя и тела засыпают. Но у тебя же просто резолвится вектор скорости и смещение по нормали, а не импульс.

#13
21:19, 12 авг. 2019

lookid
> Но у тебя же просто резолвится вектор скорости и смещение по нормали, а не импульс.

Скорости после столкновения резолвятся из условий сохранения импульса и энергии

#14
23:20, 12 авг. 2019

Suslik
> конечно, в идеале. в реальности сложно рассчитать обменные импульсы таким
> образом, чтобы вели себя стабильно и не "вскипали".
Даже реальный мир не может в такое.

ПрограммированиеФорумГрафика