Клонирование ID3DXMesh с объявлением, которое имеет 12 разрывов поплавка? - PullRequest
1 голос
/ 15 мая 2010

У меня есть следующее склонение вершины:

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 в другой с новым объявлением вершины как таковым:

model->CloneMesh( model->GetOptions(), MESHVERTInstanced::Decl,
            gd3dDevice, &pTempMesh );

Когда я пытаюсь получить размер FVF для pTempMesh (D3DXGetFVFVertexSize (pTempMesh-> GetFVF ())), я получаю «0», хотя размер должен быть 48.

Все в порядке, если у меня нет последнего объявления, '{0, 36, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT, 0},' в нем, и функция CloneMesh не возвращает FAIL. Я также пытался использовать различные объявления, такие как D3DDECLUSAGE_TEXCOORD, и это работало нормально, возвращая размер 48. Есть ли что-то конкретное в D3DDECLUSAGE_TANGENT, которого я не знаю?

Я в полном недоумении, почему это не работает ...

Ответы [ 2 ]

2 голосов
/ 16 мая 2010

TBH AS DeadMG указывает, что вершина 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()
};

В противном случае просто используйте D3DXGetDeclLength .

1 голос
/ 15 мая 2010

Не каждый D3DVERTEXDECL может быть преобразован в FVF. Прежде чем пытаться получить размер FVF, вы должны проверить, что у вас есть FVF-совместимое объявление. Хотя я не понимаю, почему вы используете FVF, это довольно бесполезно, и вы не будете приобретать навыки в будущем, поскольку D3D10 даже не допускает FVF.

...