2009-06-09 3 views
0

は私がmpMesh用インデックスバッファを設定していない、あなたが見ることができるように、私はDESC次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(); 

として頂点データをロード

のDirectX 10に波面OBJモデルをレンダリングするためのプログラムを書きました。私は頂点インデックスを計算する方法を知らない。ご覧のとおり、私の頂点フォーマットにはノーマルが含まれています。つまり、同じ頂点の位置が異なる場合があります。例えば、キュ​​ーブは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 

私はそれは、メッシュインデックスまたはその他の問題を設定していないことで原因のかどうかわかりません。コメントは大歓迎です。

ありがとうございます。

答えて

2

OBJデータをネイティブ形式で使用することはできません。これは、前述のように一部のデータが頂点間で共有されるためです。 D3Dでは、頂点ごとに1つのインデックスにつき1つのインデックスだけでなく、頂点ごとに1つのインデックスしか使用できません。したがって、データをロードしている間は、各出力頂点に対して、使用するすべてのデータをコピーする必要があります(他のオプションもありますが、これが最も簡単です)。いったんこれを行うと、頂点を再利用していないので、インデックスバッファは必要ありません。Draw()だけを使用します。

特定のエラーは、表示していないID3D10Device :: SetVertexBuffers()呼び出しで指定したものが原因です。頂点間のストライドを15バイトに設定すると主張しています。これは4の倍数ではありません(使用している要素フォーマットで必要です)、頂点データのサイズでもありません。宣言から、頂点サイズは48バイトです。

+0

ありがとうございます。 Btw、それらの頂点のメッシュを作成するメリットがあるかどうかを知りたいですか?同じ頂点データで複数のオブジェクトを描画したい場合、メッシュの使用が高速であると聞きました。 – LNK2019

+0

ID3DX10Mesh :: Optimize()コールを使用すると、大規模または複雑なモデルでパフォーマンスが大幅に向上します。メッシュを前処理として最適化しない限り(OBJを直接読んでいるのではないかもしれないが)、この呼び出しだけでID3DX10Meshを使うのが良い考えです。 –

関連する問題