我正在编写一个需要适应各种潜在顶点格式的应用程序。我正在加载的网格可能有也可能没有任何潜在的顶点属性(颜色,法线,纹理线,权重等)。
声明的一个简单示例如下所示:
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的声明。
我不知道如何做到这一点。有没有人有任何建议?
答案 0 :(得分:1)
您将无法“动态生成结构”,但您可以先填写自己的D3DVERTEXELEMENT9
数组。一种简单的方法是将用户模型解析为正在使用的组件和类型,并将push_back()
解析为std::vector<D3DVERTEXELEMENT9>
。
在解析模型中的所有组件后,您可以计算每个组件的偏移量(示例中的第二列数字)。您需要计算从最终组件到下一个组件开头的另一个“偏移量”,这将成为您的顶点步幅。在你的例子中,对于顶点跨度为36,它是24,加上D3DDECLTYPE_FLOAT3
或12的大小。
一旦有了偏移量和步幅,就可以将用户模型中的顶点数据写入顶点缓冲区中的正确字节。
推进vector
后,您甚至可以将D3DDECL_END()
的内容传递给D3D。