2017-01-25 77 views
1

我在學習DirectX11時正在研究一個小型遊戲框架。 有什麼可能是最好的方法有一個BufferManager類(可能是靜態的)來處理實時或以前創建的模型的所有頂點和索引數據。該類應負責根據模型信息創建動態或靜態緩衝區,然後繪製它們。Directx11如何管理多個頂點/索引緩衝區?

  • 我應該有一個頂點和索引向量列表和所有的新車型追加到它...然後重新創建緩衝區,當新數據添加和繪圖之前設置新的緩衝區。
  • 我應該爲模型提供單獨的頂點和索引緩衝區,訪問相應模型的緩衝區並在每次繪製調用之前設置爲IASetVertexBuffer(model[i].getVertBuff());
  • 另外一些模型可能是動態的,其他模型是靜態的,我怎麼在這裏進行配料?

回答

1

不顯示這裏的任何代碼,但是您所請求將如下的結構:

  • 創建,紋理,模型網格,頂點數據,正常,音頻等
  • 文件加載器
  • 有一個可重複使用的結構,可存儲模型特定網格的所有數據。
  • 創建此類時,您還需要單獨的紋理類來保存關於不同紋理的信息。通過這種方式,可以爲不同的模型或網格引用相同的紋理,並且您不必每次都將它們加載到內存中。
  • 對不同的網格可以做同樣的事情;您可以引用可能是不同模型對象的一部分的網格。
  • 要做到這一點,您需要一個資產存儲類來管理您的所有資產。這樣,如果資產已經在內存中,它不會再加載它;如字體,紋理,模型,音頻文件等
  • 那麼接下來的部分是你需要一個批處理類和批次管理類
    • 批次類將定義的容器是什麼批處理基於幾個參數:原始類型(如果它們具有透明度或不是)(優先隊列)等。
    • 批處理管理器類將執行組織並將批處理髮送到呈現階段。這個類還將用於說明一個批次可以容納多少個頂點以及多少個批次(桶)。該比例將取決於遊戲內容。一個基本的2D精靈類型應用程序的良好比例將大約爲10個批次,其中每個批次包含不少於10000個頂點。接下來的步驟是根據原始類型和其優先級(alpha通道 - 對於Z深度)填充一個類似類型的桶,並且如果一個桶不能保存數據,它將查找另一個桶來填充。如果沒有桶可用來保存數據,那麼批處理器將查找最充滿最高優先級隊列的桶,它會將該批次發送到視頻卡進行渲染,然後它將重新使用該桶。
    • 最後一部分是ShaderManager類,用於管理程序將使用的不同類型的着色器。因此,所有這些類或結構都將被捆綁在一起。

如果適當地設計這個你可以抽象所有引擎的行爲和責任,從實際的遊戲內容,特性和邏輯離開或設置規則的。這樣你的遊戲引擎可以重複使用多個遊戲。這樣你的引擎就沒有任何特定遊戲的依賴關係,當你準備重新使用時,你所要做的就是創建一個從靜態或動態庫繼承而來的主項目,並且所有的引擎組件都將被合併進入下一場比賽。代碼的分離對於通用可重用代碼來說是一個很好的方法。

對於這種方法的出色表現,我建議查看本網站www.MarekKnows.com並遵循Shader Engine系列視頻教程。儘管這個特定的網站關注的是C++中的Win32,但使用OpenGL代替DirectX。但是整體設計模式具有相同的概念。唯一的區別是去除OpenGL部件並用DirectX API替換它們。

編輯 - 其他參考:

我也發現這個寫了上批渲染過程,是由馬立剋剋熱明斯基是從他的視頻教程,但這裏找到Batch Rendering by Marek at Gamedev

+1

哇!你確定知道如何製作引擎,我對此有所瞭解(對不起,我是新手)。感謝鏈接並花時間回覆這些細節。爲了理解它,我會多次查看你的答案。的xD。 – Tesla

+0

@Tesla我已經研究了很長一段時間了,這只是冰山一角。 –

+0

@特斯拉我也用一些編輯部分更新了我的答案,還有一些參考資料。 –