2012-05-12 112 views
2

我想通過繪製由線組成的模型來製作3D WP7遊戲,使用DrawUserIndexedPrimitives 這一切都工作正常,但現在我想給每個模型自己的旋轉。 目前我正在使用BasicEffect繪製所有模型。我可以設置它的旋轉,但是所有的對象都會有相同的旋轉。有沒有辦法爲每個對象設置不同的旋轉角度? 我目前已經拿出了一對夫婦,我可以使用的解決方案,但我不開心與其中一方:XNA for WP7遊戲:DrawUserIndexedPrimitives

  • 爲每個對象創建一個新的BasicEffect,有自己的世界,然後遍歷所有這些對象都可以獲得它們的基本效果並繪製它 - 我想所有這些BasicEffects都會產生很多開銷,並且我想將效果與模型分開。
  • 自己計算點數(即計算旋轉並將這些值傳遞給DrawUserIndexedPrimitives方法) - 這是相當昂貴的計算,會大大降低性能。

有沒有建議的路線在這裏?

我不知道如果DrawUserIndexedPrimitives是最好的方法使用,我只是想能夠畫線和給他們一個旋轉。如果有更好的方法來做到這一點,請告訴我:)

我目前的解決方案:

protected override void Draw(GameTime gameTime) 
{ 
    GraphicsDevice.Clear(Color.Black); 

    foreach (var model in _models) 
    { 

     foreach (var pass in model.Effect.CurrentTechnique.Passes) 
     { 
      pass.Apply(); 
      model.Effect.World = _model.GetWorld(); 

      var points = model.GetPoints(); 
      GraphicsDevice.DrawUserIndexedPrimitives(PrimitiveType.LineList, points, 0, points.Length, model.Lines, 0, model.Lines.Length/2); 

      _models[0].Draw(GraphicsDevice); 
     } 
    } 

    base.Draw(gameTime); 
} 

model.GetWorld()返回與對象的旋轉,平移和縮放,模型矩陣。 GetPoints()包含點和model.Lines的列表是一個包含連接點索引的列表

回答

2

您通常只需要任何一種效果類型(如BasicEffect)。原因是因爲效果包含兩個主要的東西:爲GPU編寫的代碼(照明等)以及它暴露的參數(如Effect.World,世界矩陣)。因爲每次都是相同的,所以編譯GPU代碼不會有太多的意義,所以我們唯一需要考慮的就是參數。

注意調用pass.Apply()。實際做的是每次在繪製之前將所有在效果上設置的參數上傳到GPU。希望應該告訴你的是,你應該能夠在每次繪製之前在單個效果上設置旋轉並調用Apply,而不是通過單獨設置旋轉來創建一組效果。而且,設置Effect.World實際上應該在pass.Apply()之前。

要回答第二個項目符號點,您完全正確。 GPU被做成具有大量並行性的點,所以最好不要自己嘗試,因爲它會很慢。

至於DrawUserIndexedPrimitives,我不是圖形愛好者,但通常這個調用是保留在你的頂點不斷變化的情況下(如柔體或blob),基本上沒有辦法描述網格通過翻譯,旋轉和尺度。 GPU公開了稱爲VertexBuffer的特殊原語,其全部目標是在GPU內存中存儲一​​堆點(這使得它們非常快速地訪問)。從那裏開始,如果你想要移動它,GPU將會轉換每一點(但是要注意,你需要通過的就是翻譯,旋轉和縮放以及它的好處)。使用DrawUserIndexedPrimitives實際上必須將所有點發送到GPU每幀,這是較慢(多少,誰知道沒有測試這些天)。

幸運的是,顯卡實際上實現了一種稱爲「線框」的特殊繪圖模式,它不是繪製三角形,而是將三角形的邊緣繪製爲線條。要設置線框模式,這樣做,你打電話之前繪製:

this.GraphicsDevice.RasterizerState.FillMode = FillMode.WireFrame; 

現在申請自己的循環方面,所有你真正需要做的是通過一個旋轉矩陣乘以世界矩陣(使用類似Matrix.CreateRotationX (yourAngle))。

0

您當前的解決方案是好的,但我會做THW世界pass.Apply()之前分配

如果您有少數機型可以傳遞給着色器和陣列的變換,並添加到您的頂點爲此數組構造一個索引。

這樣你就可以一次畫出你所有的模型。