2017-06-08 9 views
0

D3DXLoadMeshFromXを使用すると、メッシュのサブセット、マテリアル、テクスチャなどを読み込むことができました。D3D、Vertex from Mesh

私が知りたいのは、メッシュの頂点情報(ピッキング用)です。

私のコードです。..

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

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

は、その後、私は頂点のようなVTXの情報を知りたい、しかしVTXがvoidポインタです... 私はそのメッシュの構造体を知っていれば、私は情報頂点を知っているかもしれませんが、Iしないでください

私はあまりにも曖昧に答えると申し訳ありません。

答えて

0

これは、従来のDirectX SDKのサンプルSamples\C++\Direct3D\Pickで説明されています。

CloneMeshFVFを使用して頂点データレイアウトを再フォーマットする必要があります。実際に結果のVBをロックできるように、D3DXMESH_VB_MANAGEDまたはD3DXMESH_VB_SYSTEMMEMを指定する必要があります。

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メモリコピーを使用します。リアルタイムアプリケーションでは、通常、衝突のためにレンダリングモデルの完全な複雑さを使用するのではなく、レンダリングする必要がなく、メモリ内にのみ保持する単純化された衝突モデルを使用します。

+0

ありがとうございます!私は 'g_Mesh.GetMesh() - > GetFVF()'をDWORDに変更しましたVTXFVF_TEX = D3DFVF_XYZ | D3DFVF_TEX0;次に、pVerticesには私が望む頂点情報しかありません。 –

+0

もう一度、本当に感謝します。とにかく、私はあなたがピッキングについてコメントしていることについて少し興味があります。ピッキングすると、すべての頂点データをレンダリングすると同時に、頂点の三角形を見つけることができます。どんな問題にもなりますか? –

+0

位置、頂点の法線、テクスチャ、頂点の色などレンダリングを実行するには、頂点バッファのGPUコピーが必要です。ピッキングするには、位置とインデックス(インデックス付きの三角形)のCPUコピーが必要です。 –

関連する問題