将本文中的方法从 CUDA 应用到 WebGL 2 着色器是否可行并且仍然有效?
- (1) 根据质心为每个图元分配一个莫顿码。
- 应该很容易,因为在 WebGL 2 着色器中可以使用按位运算(AND、OR 等)。
- (2) 对 Morton 码进行排序。
- 您认为基于Histopyramids的桶/基数排序会起作用吗,首先是最重要的位?这将取代论文中的并行基数排序。WebGL 2 还有其他适用的排序方法吗?双音合并排序(实现起来似乎更复杂)?
- (3) 构造二叉基数树。
- 步骤 2 中的 Histopyramid 桶/基数排序是否也能够隐式构造树?还是需要另一个步骤?例如对于遍历指针(孩子?父母?命中和未命中指针?)。
- (4) 为每个内部节点分配一个边界框。
- 还没有想太多。
以前做过吗?我找不到。任何相关链接表示赞赏。我发现的最接近的是Space Partitioning - Kd-tree - Using WebGL。它在 JavaScript 中构建树,但它确实展示了如何在 WebGL 着色器中进行无堆栈树遍历。如果事实证明使用着色器构建 BVH 太难,我可能会用 JavaScript 构建它,因为 KD-tree 演示在我的机器上的 4096 个元素上“仅”使用 2 毫秒。不过,扩大规模会很酷。
我的目标是在 GPU 上为 RTS 游戏进行碰撞检测,缩放到尽可能多的单位和射弹。假定所有元素都是球形的。BVH每帧都会实时重建(60FPS留16ms,不考虑其他任务)。目前我能想到的任务有3个:
- 单位重叠分散。
- 目标选择(最近的邻居,因为攻击范围较远的单位可能匹配太多)。
- 弹丸伤害应用。
也许有比使用 BVH 更聪明的技巧或简化。欢迎提出建议。