DirectX 10 Mesh буфер не выровнен проблема? Как рассчитать волновой индекс obj? - PullRequest
0 голосов
/ 09 июня 2009

Я написал программу для визуализации obj-модели волнового фронта в DirectX 10

Я загрузил данные вершин следующим образом: 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();

Как видите, я не настроил индексный буфер для mpMesh. Я не знаю, как рассчитать индекс вершин. Как вы можете видеть, мой формат вершины включает нормаль, что означает, что одна и та же позиция вершины может иметь другую нормаль. Например, куб содержит 36 вершин, но только 8 различных позиций. obj-файл wavefront использует только 8-позиционный индекс.

Программа генерирует следующую ошибку во время выполнения

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 

Я не уверен, является ли это причиной, не настроив индекс сетки или другие проблемы. Любые комментарии приветствуются.

Спасибо всем.

1 Ответ

2 голосов
/ 15 июля 2009

Вы не можете использовать данные OBJ в их исходной форме, потому что некоторые данные совместно используются вершинами, как вы упоминали. D3D допускает только один индекс на вершину, а не один индекс на атрибут на вершину. Поэтому, пока вы загружаете данные, для каждой выходной вершины вам необходимо скопировать все данные, которые она использует (есть другие варианты, но это самый простой вариант). Как только вы это сделаете, вам не понадобится индексный буфер, так как вы не используете какие-либо вершины - просто используйте Draw ().

Конкретная ошибка связана с тем, что вы указали в вызове ID3D10Device :: SetVertexBuffers (), который вы не показывали. Он утверждает, что вы установили шаг между вершинами равным 15 байтам. Это не кратно 4 (требуется форматов элементов, которые вы используете), а также не размер ваших данных вершин. Из декларации, ваш размер вершины составляет 48 байт.

...