Клонирование ID3DXMesh с объявлением, которое имеет 12 разрывов поплавка?
У меня есть следующее склонение вершины:
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 ответа
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.
Не каждый D3DVERTEXDECL может быть преобразован в FVF. Прежде чем пытаться получить размер FVF, вы должны проверить, что у вас есть FVF-совместимое объявление. Хотя я не понимаю, почему вы используете FVF, это довольно бесполезно, и вы не будете приобретать будущие навыки, так как D3D10 даже не допускает FVF.