0

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 のインデックス バッファを設定していません。Vertexes インデックスの計算方法がわかりません。ご覧のとおり、私の頂点フォーマットには法線が含まれています。これは、同じ頂点位置が異なる法線を持つ可能性があることを意味します。たとえば、立方体には 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 

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

皆さんありがとう。

4

1 に答える 1

2

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

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

于 2009-07-14T20:16:54.943 に答える