【问题标题】:Is there a performance penalty for creating Direct3D vertices with all semantic types?创建具有所有语义类型的 Direct3D 顶点是否会降低性能?
【发布时间】:2010-10-07 09:45:07
【问题描述】:

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

【问题讨论】:

    标签: c++ windows performance vertices direct3d10


    【解决方案1】:

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

    【讨论】:

    • 那么处理顶点的“正常”方式是什么?拥有多种不同类型的顶点,只需要您需要的特定数据?
    • 我不是很喜欢 DirectX,所以我不能说它是如何在那里完成的。通常,您希望抽象出确切的绘图函数调用,因此您将处理一些通用接口,而确切的实现取决于您正在绘制的内容。或者,当您制作一些仅提交所需部分顶点数据的通用绘图例程时使用一些数据驱动的方法(在 OpenGL 中,您可以彼此分开提交顶点数据元素,不确定在 DirectX 中是否可能),具体取决于什么你实际上是在画画。
    【解决方案2】:

    不要那样做,使用专门的结构。将顶点数据上传到 GPU 会消耗大量带宽并很快成为瓶颈(考虑到问题很容易解决——将 Vertexbuffer 包装在自定义类中以自动处理转换为最有效的输入布局)。

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

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

    【讨论】:

    • 嗨,亚历山大,感谢您的回答。这听起来与我最终所做的非常相似(请参阅下面的答案)。
    【解决方案3】:

    我通过在堆上生成一块内存并只用所需的元素填充它来解决它。代码在这里:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多