通过使用D3DXLoadMeshFromX,我可以加载网格的子集,材质,纹理......所以我成功了Draw Mesh。
我想知道的是Mesh的顶点信息(用于拾取)。
我的代码是..
s2_list
[1] "S2A_20150706T105351Z_31UFS_NDVI_10M_V008.tif" "S2A_20150716T105024Z_31UFS_NDVI_10M_V008.tif"
[3] "S2A_20150726T105024Z_31UFS_NDVI_10M_V008.tif" "S2A_20150805T105026Z_31UFS_NDVI_10M_V008.tif"
[5] "S2A_20150812T104021Z_31UFS_NDVI_10M_V008.tif" "S2A_20150815T105627Z_31UFS_NDVI_10M_V008.tif"
[7] "S2A_20150822T104035Z_31UFS_NDVI_10M_V008.tif" "S2A_20150825T105041Z_31UFS_NDVI_10M_V008.tif"
[9] "S2A_20150904T105042Z_31UFS_NDVI_10M_V008.tif" "S2A_20150911T104038Z_31UFS_NDVI_10M_V008.tif"
然后我想知道像Vertex这样的Vtx信息,但是Vtx是无效的指针...... 如果我知道该网格的结构我可能知道顶点信息,但我不知道
如果我的回答过于模糊,我很抱歉。
答案 0 :(得分:1)
传统的DirectX SDK在Samples\C++\Direct3D\Pick
中的示例中介绍了这一点。
您必须使用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内存副本,而渲染使用视频内存副本。在实时应用程序中,您通常不会使用渲染模型的完全复杂性来进行冲突,而是使用简化的碰撞模型,您永远不需要渲染并只保留在内存中。