Graphics 克隆具有12个浮动中断的declration的ID3DXMesh?

Graphics 克隆具有12个浮动中断的declration的ID3DXMesh?,graphics,3d,directx,id3dxmesh,Graphics,3d,Directx,Id3dxmesh,我有以下顶点偏移: struct MESHVERTInstanced { float x, y, z; // Position float nx, ny, nz; // Normal float tu, tv; // Texcoord float idx; // index of the vertex! float tanx, tany, tanz; // The tangent const sta

我有以下顶点偏移:

struct MESHVERTInstanced
{
    float x, y, z;      // Position
    float nx, ny, nz;   // Normal
    float tu, tv;       // Texcoord
    float idx;          // index of the vertex!
    float tanx, tany, tanz;   // The tangent

    const static D3DVERTEXELEMENT9 Decl[6];
    static IDirect3DVertexDeclaration9* meshvertinstdecl;
};
我宣布:

const D3DVERTEXELEMENT9 MESHVERTInstanced::Decl[] =
{
    { 0, 0,  D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
    { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL,   0 },
    { 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
    { 0, 32, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1 },
    { 0, 36, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT, 0 },
    D3DDECL_END()
};
我接下来要做的是使用新的顶点声明将ID3DXMesh复制到另一个ID3DXMesh中:

model->CloneMesh( model->GetOptions(), MESHVERTInstanced::Decl,
            gd3dDevice, &pTempMesh );
当我尝试获取pTempMesh的FVF大小(d3dxgetfvvertexsize(pTempMesh->GetFVF())时,我得到了“0”,尽管大小应该是48

如果我没有最后一个声明,{0,36,D3DDECLTYPE_FLOAT3,d3ddecltmethod_DEFAULT,D3DDECLUSAGE_TANGENT,0}',并且CloneMesh函数不会返回失败,那么整个过程就可以了。我也尝试过使用不同的声明,比如D3DDECLUSAGE_TEXCOORD,效果很好,返回的大小为48。我不知道D3D的切线有什么特别的地方吗


我完全不知道为什么这不起作用…

不是每个D3DVERTEXDECL都可以转换为FVF。在尝试获取FVF大小之前,应该三次检查是否有FVF兼容声明。尽管我无法理解您为什么要使用FVF,但它毫无用处,而且您也无法获得未来的技能,因为D3D10甚至不允许使用FVF。

TBH正如DeadMG指出的那样,vertex decl与FVF不兼容。您询问是否有其他方法来获取顶点缓冲区的大小。显然,您知道缓冲区中有多少个顶点,并且在顶点声明中定义顶点结构时,您也知道顶点结构有多大(48字节)

const D3DVERTEXELEMENT9 MESHVERTInstanced::Decl[] =
{
    { 0, 0,  D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, //Starts at offset 0 and is 3 floats, or 12 bytes in size.  Total = 12 bytes.
    { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL,   0 }, //Starts at offset 12 and is 3 floats, or 12 bytes in size.  Total = 24 bytes.
    { 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, //Starts at offset 24 and is 2 floats, or 8 bytes in size.  Total = 32 bytes.
    { 0, 32, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1 }, //Starts at offset 32 and is 1 float, or 4 bytes in size.  Total = 36 bytes.
    { 0, 36, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT,  0 }, //Starts at offset 36 and is 3 floats, or 12 bytes in size.  Total = 48 bytes.
    D3DDECL_END()
};

如果没有,请直接使用。

还有其他方法可以获得顶点缓冲区的大小,以便我可以解析它吗?还有什么可以替代FVF?着色器和可编程管道。我建议您使用DirectX 9.0c,这是Frank Luna的一种着色器方法,它非常优秀并且是最新的。也有D3D10口味的,不过我相信D3D11还没有推出。编辑:不确定解析顶点缓冲区要做什么。。顶点缓冲区的大小是sizeof(您在OP中发布的结构)*您为创建它而输入的长度。您根本不应该手动处理顶点缓冲区-这就是ID3DXMesh存在的目的。啊,是的,这很有帮助,ID3DXMesh::GetNumbyteServerTex()似乎也可以工作。我并不知道顶点声明有多大,但我想知道,在我不知道顶点声明的大小的情况下,如何自动获得大小。