簡體   English   中英

創建具有所有語義類型的Direct3D頂點是否會降低性能?

[英]Is there a performance penalty for creating Direct3D vertices with all semantic types?

在Direct3D中,可以創建所需的任何類型的頂點。 您可以使用僅包含位置信息的簡單頂點,也可以添加顏色信息,紋理信息等。在創建輸入布局時,可以定義已實現的頂點的哪些部分:

D3D10_INPUT_ELEMENT_DESC layout[] =
{
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
    { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D10_APPEND_ALIGNED_ELEMENT, D3D10_INPUT_PER_VERTEX_DATA, 0 },
};

我的問題是,是否應使用所有輸入類型(位置,顏色,紋理等)定義頂點結構。 或者我應該創建幾個頂點結構,每個頂點結構具有不同的輸入類型。

使用多個類的弊端是您必須創建和維護多個類,並且知道使用哪種類型的頂點可能會造成混淆。 具有1個頂點結構的不利之處是什么?

您會將未使用的頂點數據上傳到3d加速器,這會占用一些帶寬。 除非您正在開發一些一流的視頻游戲(您幾乎肯定會在其他地方遇到瓶頸),否則沒關系。

不要那樣做,使用專門的結構。 將頂點數據上傳到GPU會占用大量帶寬,並很快成為瓶頸(考慮到該問題的解決很簡單-將Vertexbuffer包裹在自定義類中以自動處理轉換為最有效的輸入布局)。

這也是不切實際的-例如,換膚需要大量每個頂點的額外數據。 您是否真的希望應用程序中的每個頂點也都包含它,即使根本不需要它呢?

但是,我確實建議為頂點組件在數據結構中出現的順序建立某種約定。 這將幫助您編寫着色器,因為這些着色器最終會耦合到頂點輸入布局。

我通過在堆上生成一塊內存並僅用所需的元素填充來解決它。 該代碼在此處可用:

http://code.google.com/p/woof/source/browse/trunk/Libraries/WOOF3D/Direct3D10Vertices.cpp?r=24

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM