C++ DirectX:动态顶点声明

C++ DirectX:动态顶点声明,c++,directx,C++,Directx,我正在编写一个应用程序,需要适应各种可能的顶点格式。我正在加载的网格可能有也可能没有任何数量的潜在顶点属性(颜色、法线、纹理词、权重等) 声明的一个简单示例如下所示: D3DVERTEXELEMENT9 simple_decl[] = { {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0}, {0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DE

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

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

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个dword的结构,然后生成一个包含偏移量和D3DDECLUSAGE的声明

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

您将无法“动态生成结构”,但您可以先填充自己的
D3DVERTEXELEMENT9
数组。一种简单的方法是解析用户模型中所使用的组件和类型,并将
push_back()
转换为
std::vector

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

获得偏移和跨步后,可以将用户模型中的顶点数据写入顶点缓冲区中的正确字节

在按下
D3DDECL\u END()
之后,您甚至可以将
向量的内容传递给D3D