2011-09-23 116 views
0

我在WebGL中有一个动态表面,它在顶点着色器中进行动画处理。我想让其他物体与这个表面相互作用(例如,在动态地形上的物体)。什么是最好的方法来做到这一点?是否所有这些计算都是在CPU上完成的?有没有办法在GPU上计算这些东西?WebGL几何体交互

基本上,我想要的是顶点着色器可以访问其他(已经转换的)顶点 - 这将是完美的。

回答

1

不幸的是,我不确定你可以在着色器上做这件事。我能想到的最接近的是第二组属性但是顶点数必须是相同的,并且您只能验证一个模型的顶点与另一个模型的相同索引的顶点(因为你没有办法遍历它们)。不知何故,我不认为这是你要找的。

最好的办法是在CPU上实现这些事情(例如碰撞检测)。它在JavaScript中速度很慢,您需要长时间思考最适合您场景的算法,但这是我能想到的唯一实际可行的方法。

一个好的开始将是使用空间分区(例如:octree,BSP -- binary space partitioning -- tree)。我还没有做过任何基准测试,但是我有一种预感,在大多数JavaScript场景中,BSP树会比八进制更有效。总体而言,检查通常较少,并且可能少得多。此外,BSP树为您提供几乎独一无二的处理相对于空间任意点从后到前或从前到后的几何体的能力,而无需对几何体进行不断排序和重新排序。 BSP树的缺点(以及八分之一到更小但仍然不平凡的程度)是它们的几何结构必须保持静态。也就是说,在飞行中移动单个三角形不能很好地与这些树一起工作,因为然后必须重新排序几何图形确实。我不认为空间分区的静态特性是一个特别棘手的问题,如果你的网格的动画相对简单,轻微和可预测(例如在风中飘动的旗帜),但如果它们更复杂(例如摇摇欲坠建筑物或坠落的岩石),那么这些类型的空间分区可能根本无法满足您的需求。

更新:如果您的模型由部分静态和部分动态三角形组成,例如风车(其塔架是静态的并且翅片是动态的),那么您可以对静态部件使用空间分区,以便只有您对动态三角形采取不必要的性能命中,并且对那些不会移动太多的三角形获得空间分区的好处。

更新:实际上,您可能有一种方法可以“至少”在着色器上做到这一点。具体来说,参考您在动态地形上的对象示例,您可以将该动态地形渲染到离屏帧缓冲区,然后将该对象的位置绘制到同一帧缓冲区上,并使用readpixels()读取地形高度那个位置。这只适用于高度贴图,并且每次地形变化时(如果曾经),显然需要更新帧缓冲区。然而,这将是一个相对简单的方法,可以看到物体应该放置在动态地形上多高,而不必在CPU上进行地形生成。虽然这不是真正的碰撞检测,并且对象仍然会受到其他问题的影响(比如在地形上或地形下有一个车轮,在半空中有一个车轮)。您可以解决这些问题,但解决方案不平凡,可能涉及对帧缓冲区数据的多重检查。