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

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

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

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


Спасибо, было бы здорово)

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

СообщениеДобавлено: 22 окт 2016, 16:57
sledo
Я как то задался похожей идеей, но только по имитации деформации веществ. Так вот мощности современных домашних ПК оказались маловаты для нормальной реализации подобного, даже в очень общих чертах. Но тут надо разработать сам метод.
Вы я видел описывали процесс как прохождение по всему массиву частиц, для расчета нового положения каждой частицы? Это очень долго. В данном случае нужно идти от прилагаемой силы. У вас некое тело которое находится в состоянии покоя, т.е. в теле все частицы уравновешивают силы друг друга. Нет нужды эмитировать эти силы. Что бы нарушить баланс сил, надо приложить дополнительную силу в какой то точке тела, причем поскольку вы создали это тело, то вы в курсе какое количество приложенных сил нарушит баланс сил в теле, что бы это стало видно. Это и есть отправная точка. Т.е. есть некий порог прилагаемых сил, после прохождения которого нужно будет просчитывать новые положения частиц. Соответственно нет нужны каждый раз проходить по всему массиву, а нужно лишь проходиться только по тем частицам, на которые была приложена сила. Предположим сила была приложена только к одной частице, которая на поверхности. Ее может окружать только какое то ограниченное количество частиц, которые будут с ней взаимодействовать. Тут поможет трехмерная матрица для оптимизации, типа массива массивов, что бы не нужно было просчитывать окружающие частицы, а сразу брать готовые результаты. Дальше окружающие частицы будут взаимодействовать с окружающими их частицами и т.д. Т.е. количество расчетов будет идти в квадратической зависимости от места приложения сил, т.е. нагрузка на процессор будет возрастать тем больше, чем больше было приложено сил к телу (причем вы полностью можете ее прогнозировать). Однако в отличии от первого подхода, где всегда проверяется вся масса частиц, тут надо будет проверять лишь какую то малую часть от них, а порог сил будет отсеивать те частицы у которых сила уже стала слишком малой, т.е. можно говорить что приложенная сила рассеялась в теле и полностью перешла, допустим в тепловую энергию, которая в свою очередь перешла в инфракрасное излучение и рассеялась в пространстве. Поскольку силы никуда не пропадают, а вселенную с имитировать нет возможности, то рассеянной энергией можно пренебречь. Точно так же, если в вашем случае это Земля, то вам никогда не придется просчитывать всю массу частиц Земли, если только вы не решите устроить Армагедец, или сделать океян (а там еще есть и осмотическое давление, что конечно красиво, но нафиг надо).
Тем не менее, мои тесты показали что более 3 000 000 операций (хотя это не точная цифра, но что то около того, уже подзабыл. В общем у меня примерно около 200 000 - 300 000 частиц находилось в теле) за кадр сделать не получится на средних машинах, что крайне мало для имитации реальной деформации тел, но вот у вас, может что то и получится. Возможно, если засовывать матрицу частиц в какую то более быструю среду, нежели оперативная память, то можно увеличить скорость, но я этим не занимался, поскольку в таком случае надо выходить за рамки Unity.

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

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

СообщениеДобавлено: 22 окт 2016, 17:17
Zolden
кул стори, бро!

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

СообщениеДобавлено: 22 окт 2016, 18:54
Cr0c
sledo писал(а):Соответственно нет нужны каждый раз проходить по всему массиву, а нужно лишь проходиться только по тем частицам, на которые была приложена сила

Гравитация, бессердечная ты...

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

СообщениеДобавлено: 22 окт 2016, 19:05
waruiyume
В игре будут режимы хотсит и сетевая игра, или только сингл?

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

СообщениеДобавлено: 22 окт 2016, 19:59
Cr0c
waruiyume писал(а):В игре будут режимы хотсит и сетевая игра, или только сингл?

Syberex писал(а):Охренеть, желейный танк в пшенной каше :-o

Сетевое противостояние ожившей каши и желейных танков. Это потрясающе!!!

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

СообщениеДобавлено: 22 окт 2016, 20:39
Zolden
waruiyume писал(а):В игре будут режимы хотсит и сетевая игра, или только сингл?

Хотсит до восьми игроков - непременно, ради него всё и затевалось. Хотя по мере работы над игрой, ловлю себя на желании сделать аркадный синглплеер.

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

СообщениеДобавлено: 25 окт 2016, 21:12
sledo
Cr0c писал(а):
sledo писал(а):Соответственно нет нужны каждый раз проходить по всему массиву, а нужно лишь проходиться только по тем частицам, на которые была приложена сила

Гравитация, бессердечная ты...

Вы в отношении меня заняли системную опозицию?)) Это довольно глупо)
Гравитацию тоже надо просчитывать не для всей массы земли которая находится в состоянии покоя, а только для той части, к которой была приложена сила. Т.е. мы всегда должны вертеться вокруг какого то небольшого количества частиц, от общей массы частиц. Если у автора вышло оперировать 30 000 частицами, то именно это максимальное количество частиц должно быть в движении в каждый момент времени, а самых частиц может быть столько, на сколько хватит оперативной памяти. Т.е. остальное использовать просто для динамического антуража, что уже будет выглядеть весьма достойно. Причем в случае с землей, молекулярные связи относительно сильные до тех пор, пока эта земля не разрыхлится. В общем, тут чистой воды молекулярная физика и немного химии. Надо их понимать.

Zolden писал(а):кул стори, бро!

Всегда пожалуйста. Я тот еще историк)

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

СообщениеДобавлено: 25 окт 2016, 23:17
Cr0c
sledo писал(а):только для той части, к которой была приложена сила

А ещё к той части, которая находится над областью приложения силы. Это не оппозиция - это указание неточности.

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

СообщениеДобавлено: 30 ноя 2016, 01:16
Zolden
Небольшой апдейт. Сделал генерацию уровней по картинке. Улучшил физику, чтоб материя была потвёрже.

Вот видосик:


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

СообщениеДобавлено: 30 ноя 2016, 01:22
Paul Siberdt
Под телефоны это дело реализуемо? Если да - вам пора уже релизить какую-нить простенькую пукалку и освобождать кладовку под мешки с деньгами. :)

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

СообщениеДобавлено: 30 ноя 2016, 02:24
Zolden
Paul Siberdt писал(а):Под телефоны это дело реализуемо?

Я посмотрел параметры видеокарты Adreno 530, которую ставят в новейшие смартфоны, и на ней уже работают 256 параллельных процессоров. Это дофига для телефона, и даже неплохо для ноутбуков, такая сможет потянуть примерно вдвое меньше частиц, чем на видео. То есть, самые крутые телефоны это потянут, а остальные нет. Даже на писюках не на всех стоят карточки, поддерживающие Shader model 5.0. А если всё это считать только на CPU, то надо снижать число частиц раз в 20, это будет совсем не то. Так что я хоть и не прочь выпустить для мобил что-то похожее, но они пока не тянут. Так что ориентируюсь на PC, жду прогресса в железе смартфонов.

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

СообщениеДобавлено: 30 ноя 2016, 04:13
DbIMok
С мешками лучше поторопиться )

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

СообщениеДобавлено: 30 ноя 2016, 10:42
Diab10
Офигенно, особенно когда какаха прилетела на танк :D

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

СообщениеДобавлено: 01 дек 2016, 14:40
Zolden
DbIMok писал(а):С мешками лучше поторопиться )

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