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