我编写了一个在DirectX 10中渲染wavefront obj模型的程序
我加载了顶点数据,如下面的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设置索引缓冲区。我不知道如何计算Vertexes索引。如您所见,我的顶点格式包括法线,这意味着相同的顶点位置可能具有不同的法线。例如,一个立方体包含36个顶点但只有8个不同的位置。 wavefront obj文件只使用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
我不确定是不是因为没有设置网格索引或其他问题。欢迎任何评论。
谢谢大家。
答案 0 :(得分:2)
您不能以原生形式使用OBJ数据,因为如您所述,某些数据在顶点之间共享。 D3D每个顶点只允许一个索引,而不是每个顶点每个属性一个索引。因此,当您加载数据时,对于每个输出顶点,您需要复制它使用的所有数据(还有其他选项,但这是最简单的)。一旦你这样做,就不需要索引缓冲区,因为你没有重用任何顶点 - 只需使用Draw()。
特定错误是由您在ID3D10Device :: SetVertexBuffers()调用中指定的内容引起的,您未显示该内容。它声称您将顶点之间的步幅设置为15个字节。这不是4的倍数(您正在使用的元素格式所需),也不是顶点数据的大小。从声明中,您的顶点大小为48个字节。