Столкновение частиц с воксельным миром в вычислительном шейдере - PullRequest
0 голосов
/ 06 июня 2019

Я добавил систему частиц в воксельную игру, над которой я работаю. На данный момент вся физика выполняется на процессоре, и он довольно медленный (мой процессор борется с 2000 частицами).

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

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

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

Код обнаружения столкновений, который я написал для CPU, вообще не будет эффективным на GPU; есть только способ много разветвления / зацикливания. Есть ли эффективный способ столкновения частиц с воксельной сеткой в ​​вычислительном шейдере?

1 Ответ

1 голос
/ 07 июня 2019

Для упрощения, рассматривайте ваши частицы как точечные объекты только с позицией P и скоростью V единиц / тик.Вместо того, чтобы точно вычислять, какие воксели будут касаться ваши частицы, первое приближение для движения частиц может состоять в том, чтобы просто проверить, занят ли P + V твердым вокселем (используя 3D-сэмплер), и установить V на ноль (или на долюсамо по себе), если это так, в противном случае P увеличивается на V. Эти условные операции могут быть эффективно выполнены с целочисленной арифметикой, ветвления не требуется.

Если это приближение слишком грубое, поскольку V часто является множественными единицами вокселейдолго, и поскольку ваша геометрия вокселей достаточно точна, чтобы это могло привести к тому, что частицы проникают сквозь сплошные стены, вы можете просто повторить вышеуказанную операцию N раз внутри шейдера, используя V / N вместо V, где N должно быть наименьшее целое число , которое в большинстве случаев останавливает отсечение.Циклы For постоянной длины будут развернуты компилятором шейдера, поэтому вам все равно не потребуется истинное ветвление.

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

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

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

...