DirectX:动态顶点声明

DirectX: Dynamic Vertex Declartion

本文关键字:声明 顶点 动态 DirectX      更新时间:2023-10-16

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

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

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<D3DVERTEXELEMENT9>中。

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

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

您甚至可以在推送D3DDECL_END()后将vector的内容传递给 D3D。