DirectX 10 búfer de malla no alineado problema? Cómo calcular el índice de frente de onda obj?

StackOverflow https://stackoverflow.com/questions/968276

  •  13-09-2019
  •  | 
  •  

Pregunta

he escrito un programa para hacer un modelo de frente de onda obj en DirectX 10

I cargado los datos de vértices de la siguiente descripción

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();

Como se puede ver, no se estableció búfer de índice para mpMesh. No sé cómo calcular el índice vértices. Como se puede ver, mi formato de vértice incluyen normal, lo que significa que el mismo podría posición de vértice tiene diferentes normal. Por ejemplo, un cubo contiene 36 vértices, pero sólo 8 posición diferente. el archivo obj frente de onda sólo utilizan 8 índice de posición.

El programa genera el siguiente error en tiempo de ejecución

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 

No estoy seguro de si se trata de la causa al no establecer el índice de malla u otros problemas. Cualquier comentario es bienvenido.

Gracias a todos.

¿Fue útil?

Solución

No se pueden utilizar los datos OBJ en su forma nativa, debido a que algunos datos son compartidos entre los vértices como usted ha mencionado. D3D sólo permite un índice por vértice, no un índice por atributo por vértice. Así, mientras que está cargando los datos, para cada vértice de salida tiene que copiar todos los datos que utiliza (hay otras opciones, pero este es el más simple). Una vez hecho esto, no hay necesidad de una memoria intermedia de índice, ya que no se está reutilizando los vértices -. Sólo tiene que utilizar Draw ()

El error específico se debe a algo que ha especificado en las ID3D10Device :: SetVertexBuffers () de llamadas, que no se presentó. Afirma que se establece el paso entre los vértices a ser de 15 bytes. Eso no es un múltiplo de 4 (requerido por los formatos de los elementos que está utilizando), y además no es el tamaño de los datos de vértices. A partir de la declaración, el tamaño de su vértice es de 48 bytes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top