2011-09-23 78 views
0

我在WebGL中有一個動態表面,它在頂點着色器中進行動畫處理。我想讓其他物體與這個表面相互作用(例如,在動態地形上的物體)。什麼是最好的方法來做到這一點?是否所有這些計算都是在CPU上完成的?有沒有辦法在GPU上計算這些東西?WebGL幾何體交互

基本上,我想要的是頂點着色器可以訪問其他(已經轉換的)頂點 - 這將是完美的。

回答

1

不幸的是,我不確定你可以在着色器上做這件事。我能想到的最接近的是第二組屬性但是頂點數必須是相同的,並且您只能驗證一個模型的頂點與另一個模型的相同索引的頂點(因爲你沒有辦法遍歷它們)。不知何故,我不認爲這是你要找的。

最好的辦法是在CPU上實現這些事情(例如碰撞檢測)。它在JavaScript中速度很慢,您需要長時間思考最適合您場景的算法,但這是我能想到的唯一實際可行的方法。

一個好的開始將是使用空間分區(例如:octree,BSP -- binary space partitioning -- tree)。我還沒有做過任何基準測試,但是我有一種預感,在大多數JavaScript場景中,BSP樹會比八進制更有效。總體而言,檢查通常較少,並且可能少得多。此外,BSP樹爲您提供幾乎獨一無二的處理相對於空間任意點從後到前或從前到後的幾何體的能力,而無需對幾何體進行不斷排序和重新排序。 BSP樹的缺點(以及八分之一到更小但仍然不平凡的程度)是它們的幾何結構必須保持靜態。也就是說,在飛行中移動單個三角形不能很好地與這些樹一起工作,因爲然後必須重新排序幾何圖形確實。我不認爲空間分區的靜態特性是一個特別棘手的問題,如果你的網格的動畫相對簡單,輕微和可預測(例如在風中飄動的旗幟),但如果它們更復雜(例如搖搖欲墜建築物或墜落的岩石),那麼這些類型的空間分區可能根本無法滿足您的需求。

更新:如果您的模型由部分靜態和部分動態三角形組成,例如風車(其塔架是靜態的並且翅片是動態的),那麼您可以對靜態部件使用空間分區,以便只有您對動態三角形採取不必要的性能命中,並且對那些不會移動太多的三角形獲得空間分區的好處。

更新:實際上,您可能有一種方法可以「至少」在着色器上做到這一點。具體來說,參考您在動態地形上的對象示例,您可以將該動態地形渲染到離屏幀緩衝區,然後將該對象的位置繪製到同一幀緩衝區上,並使用readpixels()讀取地形高度那個位置。這隻適用於高度貼圖,並且每次地形變化時(如果曾經),顯然需要更新幀緩衝區。然而,這將是一個相對簡單的方法,可以看到物體應該放置在動態地形上多高,而不必在CPU上進行地形生成。雖然這不是真正的碰撞檢測,並且對象仍然會受到其他問題的影響(比如在地形上或地形下有一個車輪,在半空中有一個車輪)。您可以解決這些問題,但解決方案不平凡,可能涉及對幀緩衝區數據的多重檢查。