使用所有语义类型创建Direct3D顶点是否存在性能损失?

时间:2010-10-07 09:45:07

标签: c++ windows performance vertices direct3d10

在Direct3D中,您可以创建任何类型的Vertex。您可以使用仅具有位置信息的简单顶点,或者您可以添加颜色信息,纹理信息等。 在创建输入布局时,您可以定义已实现的顶点的哪些部分:

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个顶点结构的缺点是什么?

3 个答案:

答案 0 :(得分:1)

您将未使用的顶点数据上传到3d加速器,它会占用一些带宽。除非你正在做一些顶级的视频游戏(你几乎肯定会在其他地方遇到瓶颈),这应该没什么关系。

答案 1 :(得分:1)

不要这样做,使用专门的结构。将顶点数据上传到GPU会占用大量带宽并迅速成为瓶颈(假设问题很难解决 - 将Vertexbuffer包装在自定义类中以自动处理转换为最有效的输入布局)。 p>

这也是不切实际的 - 例如,Skinning需要大量的每顶点额外数据。您是否真的希望应用程序中的每个顶点都能够携带它,即使根本不需要它?

但是,我建议为顶点组件在数据结构中出现的顺序建立某种约定。这将帮助您编写着色器,因为它们最终与顶点输入布局耦合。

答案 2 :(得分:0)

我通过在堆上生成一块内存并仅使用所需元素填充它来解决它。代码可在此处获取:

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