2009-06-09 4 views
0

Я написал программу для отображения модели OBJ волнового фронта в DirectX 10DirectX 10 Mesh buffer не согласована проблема? Как вычислить индекс obj волнового фронта?

Я загрузил данные Вершины в следующем по алфавиту

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 

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

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

ответ

2

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

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

+0

спасибо. Кстати, я хочу знать, есть ли какая-нибудь польза для создания сетки для этих вершин? Я слышал, что использование сетки выполняется быстро, когда я хочу рисовать несколько объектов с одинаковыми данными вершин. – LNK2019

+0

Использование вызова ID3DX10Mesh :: Optimize() может значительно повысить производительность на больших или сложных моделях. Если вы не оптимизируете сетки как препроцесс (возможно, нет, если вы читаете OBJ напрямую), то этот вызов сам по себе делает использование ID3DX10Mesh хорошей идеей. –

Смежные вопросы