0

さまざまな潜在的な頂点形式に適応する必要があるアプリケーションを作成しています。ロードしているメッシュには、潜在的な頂点属性 (色、法線、テクスチャ座標、重みなど) がいくつあってもなくてもかまいません。

宣言の簡単な例は次のようになります。

D3DVERTEXELEMENT9 simple_decl[] =
{
    {0,  0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
    {0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD,   0},
    {0, 20, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR,   0},
    {0, 24, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD,   1},
    D3DDECL_END()
};


struct MYVERTS
{   
    float x,y,z,u,v;
    DWORD colr;
    float nx,ny,nz;
};

基本的に、D3DVERTEXELEMENT9 はオフセットの配列です。各オフセットは、「MYVERTS」のデータ メンバのサイズです。

ユーザーが XYZ 座標と色だけでモデルをエクスポートする場合、3 つの float と 1 つの dword を含む構造体を動的に生成し、オフセットと D3DDECLUSAGE を含む宣言を生成します。

これを行う方法がわかりません。誰かアドバイスはありますか?

4

1 に答える 1

1

「構造体を動的に生成する」ことはできませんが、独自のD3DVERTEXELEMENT9配列を入力することから始めることができます。簡単な方法は、ユーザー モデルを解析して、それが使用しているコンポーネントと型を にpush_back()変換することstd::vector<D3DVERTEXELEMENT9>です。

モデルからすべてのコンポーネントを解析した後、各コンポーネントのオフセットを計算できます (例の数値の 2 列目)。最終コンポーネントから次のコンポーネントの開始までの別の「オフセット」を計算する必要があり、これが頂点ストライドになります。あなたの例ではD3DDECLTYPE_FLOAT3、36の頂点ストライドの場合、24にサイズまたは12を加えたものです。

オフセットとストライドを取得したら、ユーザー モデルから頂点データを頂点バッファーの正しいバイトに書き込むことができます。

vectorをプッシュした後、 の内容を D3D に渡すこともできますD3DDECL_END()

于 2012-07-11T23:37:45.117 に答える