0

我正在编写一个需要适应各种潜在顶点格式的应用程序。我正在加载的网格可能有也可能没有任何数量的潜在顶点属性(颜色、法线、纹理坐标、权重等)。

一个简单的声明示例如下所示:

D3DVERTEXELEMENT9 simple_decl[] =
{
    {0,  0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
    {0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD,   0},
    {0, 20, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR,   0},
    {0, 24, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD,   1},
    D3DDECL_END()
};


struct MYVERTS
{   
    float x,y,z,u,v;
    DWORD colr;
    float nx,ny,nz;
};

基本上 D3DVERTEXELEMENT9 是一个偏移数组。每个偏移量是“MYVERTS”的数据成员的大小。

如果用户导出一个只有 XYZ 坐标和颜色的模型,那么我想动态生成一个具有 3 个浮点数和 1 个双字的结构,然后生成一个带有偏移量和 D3DDECLUSAGE 的声明。

我不知道该怎么做。有人有建议吗?

4

1 回答 1

1

您将无法“动态生成结构”,但您可以从填写自己的D3DVERTEXELEMENT9数组开始。一个简单的方法是将用户模型解析为它正在使用的组件和类型,并将其解析push_back()std::vector<D3DVERTEXELEMENT9>.

解析模型中的所有组件后,您可以计算每个组件的偏移量(示例中的第二列数字)。您需要计算从最终组件到下一个组件的另一个“偏移量”,这将成为您的顶点步幅。在您的示例中,它是 24,加上D3DDECLTYPE_FLOAT3或 12 的大小,顶点步长为 36。

一旦有了偏移量和步幅,就可以将用户模型中的顶点数据写入顶点缓冲区中的正确字节。

您甚至可以vector在推入D3DDECL_END().

于 2012-07-11T23:37:45.117 回答