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_MANAGED
或 D3DXMESH_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 内存副本,而渲染使用视频内存副本。在实时应用程序中,您通常不会使用完整复杂的碰撞渲染模型,而是使用一个简化的碰撞模型,您永远不需要渲染它,只需要保留在内存中。
通过使用 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_MANAGED
或 D3DXMESH_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 内存副本,而渲染使用视频内存副本。在实时应用程序中,您通常不会使用完整复杂的碰撞渲染模型,而是使用一个简化的碰撞模型,您永远不需要渲染它,只需要保留在内存中。