6

次のように定義されている DirectX アプリケーション用に作成された 3D モデルを読み取ろうとしています。

  • ファイル ヘッダーには、メッシュの Flexible Vertex Format (FVF) が示されています (実際、テストしたメッシュには D3DFVF_{XYZ,DIFFUSE,NORMAL,TEX1,TEX2} の任意の組み合わせがあります)。
  • 次に、n頂点は線形パターンで与えられ、フィールドは FVF に従って表示されます。

ただし、これらのフィールドの順序はわかりません。ロジックは、DirectX ドキュメントのどこかに定義されているということですが、見つけることができませんでした。たとえば、これら 2 つの構造のうち、FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_NORMAL(C 構文ですが、この問題はすべての言語に適用されます) で正しいのはどれですか?

// This one ?
struct vertex1
{
    D3DVERTEX pos;
    DWORD color;
    D3DVERTEX normal;
};

// Or this one ?
struct vertex2
{
    D3DVERTEX pos;
    D3DVERTEX normal;
    DWORD color;
};

この質問に対する一般的な回答と、考えられるすべてのフィールド (例: XYZ before DIFFUSE before NORMAL before TEX1 before TEX2) を教えてください。私はそれを見つけることができなかったので、ドキュメントの正しいページへのポインターも問題ありません:)。

4

3 に答える 3

2

私も同じことに出くわしました。

ビットの順序は必要な順序だと思います。d3d9types.hから:

#define D3DFVF_RESERVED0        0x001
#define D3DFVF_POSITION_MASK    0x400E
#define D3DFVF_XYZ              0x002
#define D3DFVF_XYZRHW           0x004
#define D3DFVF_XYZB1            0x006
#define D3DFVF_XYZB2            0x008
#define D3DFVF_XYZB3            0x00a
#define D3DFVF_XYZB4            0x00c
#define D3DFVF_XYZB5            0x00e
#define D3DFVF_XYZW             0x4002

#define D3DFVF_NORMAL           0x010
#define D3DFVF_PSIZE            0x020
#define D3DFVF_DIFFUSE          0x040
#define D3DFVF_SPECULAR         0x080

#define D3DFVF_TEXCOUNT_MASK    0xf00
#define D3DFVF_TEXCOUNT_SHIFT   8
#define D3DFVF_TEX0             0x000
#define D3DFVF_TEX1             0x100
#define D3DFVF_TEX2             0x200
#define D3DFVF_TEX3             0x300
#define D3DFVF_TEX4             0x400
#define D3DFVF_TEX5             0x500
#define D3DFVF_TEX6             0x600
#define D3DFVF_TEX7             0x700
#define D3DFVF_TEX8             0x800

私はあなたが探している順序が次のとおりであることをかなり確信しています:

POSITION、NORMAL、PSIZE、DIFFUSE、SPECULAR、TEX0 [、TEXn ...]

ドキュメントでも明確な答えを見つけることができませんでした。

于 2012-05-02T10:46:25.960 に答える
1

はい、どうぞ。

FVF (OP は、このページの情報が正しくないと言っています。FVF の配置が正しいかどうかはわかりません)

発生器

于 2009-10-03T20:55:05.410 に答える
0

次のように定義する必要があります。

struct EitherVertex
{
    float x, y, z;
    DWORD col;
    float nx, ny, nz
};

また

struct EitherVertex
{
    D3DXVECTOR3 pos;
    DWORD col;
    D3DXVECTOR3 nrm;
};

(D3DVERTEX は、3 要素ベクトルだけでなく、頂点構造体全体を参照します)

2 つのオプションのうち、これらの vert 要素にアクセスする方法に大きく依存します。非推奨の FVF を使用している場合は、2 番目の選択がより正確です。

ただし、頂点宣言を使用している場合は、関連するデータが構造体のどこにあるかを定義し、順序は重要ではありません。

于 2009-10-03T20:53:36.160 に答える