0

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

4

3 回答 3

1

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

于 2010-10-07T10:12:10.500 回答
1

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

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

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

于 2010-10-08T08:32:47.907 回答
0

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

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

于 2010-10-08T08:27:31.177 回答