2012-10-27 45 views
1

我有節點保持變換和邊界在它盒,以及我建立從viewProjection matrix.However每幀視錐體一個場景圖,該盒具有其4個頂點局部空間中的框座標。我必須通過改造他們,讓他們在同一空間的視錐,這樣的話我可以視錐檢查交集?我試圖將它們納入世界空間,但很奇怪,因爲我有50點世界矩陣(我用實例和每個實例都有自己的世界/變換矩陣)如何轉換視錐體剔除的邊界框?

回答

0

通常要碰撞BB和視錐字的空間。原始算法中:

mtxViewProjTranspose = MtxTranspose(mtxView * mtxProj); 
frustumViewWorld = frustumView * mtxViewProjTranspose; 
foreach(i) 
{ 
    bbWorld[i] = bb[i] * mtxWorld; 
    bCull[i] = collide(BBWorld[i], frustumViewWorld); 
} 

你也可以做到這一點,鑑於空間(但它不是那麼好):

mtxProjTranspose = MtxTranspose(mtxProj); 
frustumViewViewSpace = frustumView * mtxProjTranspose; 
    foreach(i) 
    { 
     bbView[i] = bb[i] * mtxWorld[i] * mtxView; // More calculations here 
     bCull[i] = collide(bbView[i], frustumViewViewSpace); 
    } 

如果你認爲翻譯包圍盒(4名綠黨)以世界空間是怪異,想想在網格本身中有幾千個vert是如何奇怪的。 =)據我所知,碰撞檢測比這個簡單的乘法要貴得多。但是:

  • 要縮短碰撞列表,您可以將平截頭體翻譯爲世界空間並粗略地檢查哪些節點值得與平截頭體碰撞,哪些不是。 所以你也不需要翻譯他們的BB。這取決於你的場景實現。
  • 根據您在HLSL中的技能,遊戲風格和目標最終用戶硬件,您可以(或不能)在GPU上移動BB變換(計算着色器,即使在SM 4.0上也有可用性,但有一些限制),因爲GPU通常會這樣做與網格VBs。但我認爲這不會給你帶來收益。然而,後續將碰撞檢測移動到GPU也是一個很好的訓練。

希望它的幫助!

+0

但不剔除,以限制繪製調用量的意義呢?而且,由於繪製調用由CPU做,即使你剔除在GPU上,一定要仔細閱讀被剔除的數據傳回CPU?還是我沒有理解它嗎? – user1779802

+0

我認爲這取決於。最少在場景中的頂點cout。也許cullung在GPU上不太好,但我的意思是整個碰撞檢測。矩陣運算在GPU上要快得多,因爲線程 – Drop

+0

你犧牲一些PCI-E帶寬和GPU的負載和卸載CPU的遊戲邏輯,AI等,所以可以準備繪製調用更快。一如既往的性能必須針對每個引擎進行分析。 – Drop