0

我编写了一个程序来在 DirectX 10 中渲染波前 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 文件仅使用 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 

我不确定这是否是由于未设置网格索引或其他问题造成的。欢迎任何评论。

谢谢大家。

4

1 回答 1

2

您不能以其本机形式使用 OBJ 数据,因为正如您所提到的,某些数据在顶点之间共享。D3D 只允许每个顶点一个索引,而不是每个顶点每个属性一个索引。因此,当您加载数据时,对于每个输出顶点,您需要复制它使用的所有数据(还有其他选项,但这是最简单的)。一旦你这样做了,就不需要索引缓冲区了,因为你没有重用任何顶点——只需使用 Draw()。

具体错误是由于您在 ID3D10Device::SetVertexBuffers() 调用中指定的某些内容,您没有显示。它声称您将顶点之间的步幅设置为 15 个字节。这不是 4 的倍数(您使用的元素格式要求),也不是您的顶点数据的大小。根据声明,您的顶点大小为 48 字节。

于 2009-07-14T20:16:54.943 回答