【发布时间】:2023-03-05 02:59:01
【问题描述】:
我正在尝试在 OpenCL 中实现 PBD 算法。在original paper 中,算法声明为
(1) forall vertices i
(2) initialize x[i]=x0[i], v[i]=v0[i], w[i]=1/m[i]
(3)endfor
(4)loop
(5) forall vertices i do v[i]←v[i]+∆t*w*i*f_ext(x[i])
(6) dampVelocities(v1,...,vN)
(7) forall vertices i do p[i]←x[i]+∆t*v[i]
(8) forall vertices i do generateCollisionConstraints(xi→pi)
(9) loop solverIterations times
(10) projectConstraints(C1,...,CM+Mcoll,p1,...,pN)
(11) endloop
(12) forall vertices i
(13) v[i]←(p[i]−x[i])/∆t(14)x[i]←p[i]
(15) endfor
(16) velocityUpdate(v1,...,vN)
(17)endloop
第 8 步是最难有效并行化的。我目前正在做的是使用常规的 3D 网格(表示为单个缓冲区),我首先在其中插入所有粒子。接下来我迭代相邻的单元格并检查冲突。但是当实际检测到碰撞时我该怎么办?我不能保存可变大小的向量,也不能将约束“附加”到缓冲区,因为这需要原子操作,这些操作不是并行的。在 GPU 上实现 PBD 的有效方法有哪些?
【问题讨论】:
-
Mcoll对于所有可以碰撞的实体(在对象中)是连续的。对于集合中的每个实体,不能碰撞的实体子集很小并且是唯一的。识别每个可协作集所需的工作是一次性操作(在生产中,运行成本为 0),但是由于该集对于每个实体都是唯一的,因此数据分发成本(每步)将超过除一小部分之外的所有实体的性能增益的情况。软体自拦截动力学有更新的解决方案,但最好的解决方案将取决于实现(模型、硬件)约束
标签: gpu opencl game-physics gpgpu physics-engine