DirectX 10のメッシュバッファは問題は揃っていませんか?波面OBJ指数を計算するには?
質問
私は、DirectX 10での波面OBJモデルをレンダリングするプログラムを書いた。
私は
DESC次のように頂点データをロード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();
あなたが見ることができるように、私はmpMesh用インデックスバッファを設定しませんでした。私は頂点指数を計算する方法がわかりません。あなたが見ることができるように、私の頂点フォーマットは同じ頂点位置かもしれないが、通常異なる持っていることを意味する、通常含まれています。例えば、立方体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
私はそれがメッシュインデックスまたはその他の問題を設定していないことで原因をのかどうかわかりません。任意のコメントは大歓迎です。
おかげで、すべて。
解決
あなたは、そのネイティブ形式でOBJデータを使用することはできません。 D3Dは頂点ごとに一つの指標ではなく、頂点ごとの属性ごとにインデックスすることができます。あなたはそれを使用するすべてのデータをコピーする必要があり、各出力頂点のために、データをロードしている間ので、(そこに他のオプションですが、これは最も簡単です)。一度これを行うあなたが任意の頂点を再利用していないため、インデックスバッファの必要は、ありません - 。ちょうど(ドローを使用)
特定のエラーはあなたが表示されませんでしたID3D10Device :: SetVertexBuffers()の呼び出しで指定された何かが原因です。それはあなたが15バイトに頂点間のストライドを設定することを主張しています。それは(あなたが使用している要素の形式で必要とされる)4の倍数ではありませんし、またあなたの頂点データのサイズではありません。宣言から、あなたの頂点サイズは48バイトです。