j'ai écrit un programme pour rendre un modèle obj front d'onde dans DirectX 10Problème de non-alignement du tampon de maillage DirectX 10? Comment calculer l'indice obj wavefront?
J'ai chargé les données vertex comme suit desc
D3D10_INPUT_ELEMENT_DESC defaultLayout[] =
{
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D10_APPEND_ALIGNED_ELEMENT, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D10_APPEND_ALIGNED_ELEMENT, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D10_APPEND_ALIGNED_ELEMENT, D3D10_INPUT_PER_VERTEX_DATA, 0},
};
r = D3DX10CreateMesh(Graphics()->GetDevice(),defaultLayout,4,
"POSITION",NumVerts(),12,D3DX10_MESH_32_BIT,
&mpMesh);
if(FAILED(r))
{
throw cGameError(L"Can not create mesh");
}
r= mpMesh->SetVertexData(0,&m_verts[0]);
if(FAILED(r))
{
throw cGameError(L"Can not Set VertexData");
}
//mpMesh->SetIndexData(&m_tris[0],m_tris.size()*3);
mpMesh->CommitToDevice();
Comme vous pouvez le voir, je ne l'ai pas mis en place un tampon d'index pour mpMesh. Je ne sais pas comment calculer l'index des Vertexes. Comme vous pouvez le voir, mon format de vertex inclut normal, ce qui signifie que la même position de vertex peut avoir des normales différentes. Par exemple, un cube contient 36 vertex mais seulement 8 positions différentes. le fichier obj du front d'onde utilise seulement 8 index de position.
Le programme génère l'erreur suivante dans l'exécution
DrawIndexed: Vertex Buffer Stride (15) at the input vertex slot 0 is not aligned properly. The current Input Layout imposes an alignment of (4) because of the Formats used with this slot.
EXECUTION ERROR #367: DEVICE_DRAW_VERTEX_STRIDE_UNALIGNED
Je ne suis pas sûr que ce soit la cause de ne pas mettre en place l'index de maille ou d'autres problèmes. Tout commentaire est le bienvenu.
Merci à tous.
Merci beaucoup. BTW, je veux savoir s'il y a un avantage à créer un maillage pour ces vertex? J'ai entendu dire que l'utilisation de mesh est rapide quand je veux dessiner plusieurs objets avec les mêmes données de vertex. – LNK2019
L'utilisation de l'appel ID3DX10Mesh :: Optimize() peut considérablement améliorer les performances des modèles volumineux ou complexes. Sauf si vous optimisez les maillages en tant que pré-traitement (probablement pas, si vous lisez OBJ directement), alors cet appel seul rend l'utilisation de ID3DX10Mesh une bonne idée. –