1

次の頂点のデクリレーションがあります。

struct MESHVERTInstanced
{
    float x, y, z;      // Position
    float nx, ny, nz;   // Normal
    float tu, tv;       // Texcoord
    float idx;          // index of the vertex!
    float tanx, tany, tanz;   // The tangent

    const static D3DVERTEXELEMENT9 Decl[6];
    static IDirect3DVertexDeclaration9* meshvertinstdecl;
};

そして私はそれをそのように宣言します:

const D3DVERTEXELEMENT9 MESHVERTInstanced::Decl[] =
{
    { 0, 0,  D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
    { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL,   0 },
    { 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
    { 0, 32, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1 },
    { 0, 36, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT, 0 },
    D3DDECL_END()
};

次にやろうとしているのは、ID3DXMeshを、新しい頂点宣言を含む別のID3DXMeshにコピーすることです。

model->CloneMesh( model->GetOptions(), MESHVERTInstanced::Decl,
            gd3dDevice, &pTempMesh );

pTempMeshのFVFサイズを取得しようとすると(D3DXGetFVFVertexSize(pTempMesh-> GetFVF()))、サイズは48であるはずですが、「0」が表示されます。

最後の宣言'{0、36、D3DDECLTYPE_FLOAT3、D3DDECLMETHOD_DEFAULT、D3DDECLUSAGE_TANGENT、0}'がなく、CloneMesh関数がFAILを返さない場合は、すべて問題ありません。また、D3DDECLUSAGE_TEXCOORDなどのさまざまな宣言を使用してみましたが、これは正常に機能し、48のサイズを返しました。D3DDECLUSAGE_TANGENTに固有の何かがわかりませんか?

なぜこれが機能しないのか、私は完全に途方に暮れています...

4

2 に答える 2

2

TBH AS DeadMGは、頂点declがFVF互換ではないことを指摘しています。頂点バッファのサイズを取得する別の方法があるかどうかを尋ねます。明らかに、バッファ内の頂点の数を知っています。また、頂点宣言で頂点構造を定義するときに、頂点構造の大きさ(48バイト)を明らかに知っています。

const D3DVERTEXELEMENT9 MESHVERTInstanced::Decl[] =
{
    { 0, 0,  D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, //Starts at offset 0 and is 3 floats, or 12 bytes in size.  Total = 12 bytes.
    { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL,   0 }, //Starts at offset 12 and is 3 floats, or 12 bytes in size.  Total = 24 bytes.
    { 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, //Starts at offset 24 and is 2 floats, or 8 bytes in size.  Total = 32 bytes.
    { 0, 32, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1 }, //Starts at offset 32 and is 1 float, or 4 bytes in size.  Total = 36 bytes.
    { 0, 36, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT,  0 }, //Starts at offset 36 and is 3 floats, or 12 bytes in size.  Total = 48 bytes.
    D3DDECL_END()
};

それが失敗した場合は、 D3DXGetDeclLengthを使用してください。

于 2010-05-15T21:28:01.943 に答える
1

すべてのD3DVERTEXDECLをFVFに変換できるわけではありません。FVFサイズを取得する前に、FVF互換の宣言があることをトリプルチェックする必要があります。FVFを使用している理由は私にはわかりませんが、D3D10ではFVFも許可されていないため、かなり役に立たず、将来のスキルを習得することはできません。

于 2010-05-15T12:49:12.173 に答える