Я написал программу для отображения модели 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
Я не уверен, является ли это причина, не создания индекса сетки или других проблем. Любые комментарии приветствуются.
Спасибо всем.
спасибо. Кстати, я хочу знать, есть ли какая-нибудь польза для создания сетки для этих вершин? Я слышал, что использование сетки выполняется быстро, когда я хочу рисовать несколько объектов с одинаковыми данными вершин. – LNK2019
Использование вызова ID3DX10Mesh :: Optimize() может значительно повысить производительность на больших или сложных моделях. Если вы не оптимизируете сетки как препроцесс (возможно, нет, если вы читаете OBJ напрямую), то этот вызов сам по себе делает использование ID3DX10Mesh хорошей идеей. –