2009-06-09 5 views
0

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.

Répondre

2

Vous ne pouvez pas utiliser les données OBJ dans leur forme native, car certaines données sont partagées entre les sommets comme vous l'avez mentionné. D3D n'autorise qu'un index par sommet, pas un index par attribut par sommet. Donc, pendant que vous chargez les données, pour chaque sommet de sortie, vous devez copier toutes les données qu'il utilise (il y a d'autres options mais c'est la plus simple). Une fois que vous faites cela, il n'y a pas besoin d'un tampon d'index, puisque vous ne réutilisez pas de vertex - utilisez simplement Draw().

L'erreur spécifique est due à un élément spécifié dans l'appel ID3D10Device :: SetVertexBuffers() que vous n'avez pas affiché. Il prétend que vous définissez la foulée entre les sommets à 15 octets. Ce n'est pas un multiple de 4 (requis par les formats d'éléments que vous utilisez), et ce n'est pas non plus la taille de vos données de vertex. À partir de la déclaration, la taille de votre vertex est de 48 octets.

+0

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

+0

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. –

Questions connexes