D3D,网格顶点

D3D, Vertex From Mesh

通过使用 D3DXLoadMeshFromX,我可以加载网格的子集、材质、纹理...因此我成功绘制了网格。

我想知道的是Mesh的Vertex Infomation(for picking).

我的代码是..

    m_pMesh->PDIRECT3DVERTEXBUFFER9     pVB;
    m_pMesh->GetVertexBuffer(&pVB);

    void* Vtx = nullptr;
    pVB->Lock(0, 0, (void**)&Vtx, 0);

那我想知道Vtx的Vertex之类的信息,但是Vtx是void pointer... 如果我知道那个网格的结构我可能知道顶点信息,但我不知道

对不起,如果我回答得太含糊了。

Samples\C++\Direct3D\Pick 中的旧版 DirectX SDK 示例对此进行了介绍。

您必须使用 CloneMeshFVF 重新格式化顶点数据布局,并且您需要确保指定 D3DXMESH_VB_MANAGEDD3DXMESH_VB_SYSTEMMEM 以便实际锁定结果 VB.

   LPD3DXMESH pMesh;

    g_Mesh.GetMesh()->CloneMeshFVF( D3DXMESH_MANAGED,
                                    g_Mesh.GetMesh()->GetFVF(), pD3Device, &pMesh );

    LPDIRECT3DVERTEXBUFFER9 pVB;
    LPDIRECT3DINDEXBUFFER9 pIB;

    pMesh->GetVertexBuffer( &pVB );
    pMesh->GetIndexBuffer( &pIB );

    WORD* pIndices;
    D3DVERTEX* pVertices;

    pIB->Lock( 0, 0, ( void** )&pIndices, 0 );
    pVB->Lock( 0, 0, ( void** )&pVertices, 0 );

请记住,拾取使用顶点数据的 CPU 内存副本,而渲染使用视频内存副本。在实时应用程序中,您通常不会使用完整复杂的碰撞渲染模型,而是使用一个简化的碰撞模型,您永远不需要渲染它,只需要保留在内存中。