2009-10-03 6 views
4

Je suis en train de lire des modèles 3D qui ont été créés pour une application DirectX, qui sont définis de la manière suivante:Position des champs (position, normale, etc.) dans un sommet D3D9

  • Dans le En-tête de fichier, le format de Vertex Flexible (FVF) du maillage est donné (en fait, j'ai des combinaisons de D3DFVF_ {XYZ, DIFFUSE, NORMAL, TEX1, TEX2} dans les mailles que j'ai testées)
  • Ensuite, n sommets sont donnés dans un modèle linéaire, avec les champs présents selon le FVF.

Cependant, je ne connais pas l'ordre de ces champs. La logique serait qu'elle soit définie quelque part dans la documentation DirectX, mais je n'ai pas pu la trouver. Par exemple, laquelle de ces deux structures est correcte avec FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_NORMAL (syntaxe C, mais ce problème s'applique à toutes les langues)?

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

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

Je voudrais une réponse générale à cette question avec tous les champs possibles (par exemple, XYZ before DIFFUSE before NORMAL before TEX1 before TEX2). Un pointeur vers la bonne page de la documentation serait bien aussi car je n'ai pas pu le trouver :).

Répondre

1

ici vous êtes

FVF (OP dit les informations sur cette page sont erronées. Je ne sais pas, na pas vérifier si FVF positionnement est correct)

Generator

+1

Le premier lien ne définit pas vraiment l'ordre des champs dans la structure (déjà lu avant de poser la question). Cependant, le deuxième lien semble assez complet, merci beaucoup! –

1

Eh bien, vous devriez le définir comme suit.

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

ou

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

(D3DVERTEX fait référence à un struct entier sommet et non pas seulement un vecteur 3 élément)

de vos 2 options beaucoup dépend de la façon dont vous accédez à ces éléments de vert. Si vous utilisez le FVF déprécié, alors le second de votre choix est le plus correct.

Si toutefois vous utilisez des déclarations Vertex, alors vous définissez où se trouvent les données pertinentes dans la structure et que l'ordre n'a pas d'importance.

+0

Le problème est l'ordre général, DIFFUSE devrait-il toujours être avant NORMAL? Qu'en est-il de TEX1, TEX2, etc.? Je n'utilise pas les déclarations de vertex car le format de fichier d'origine ne les utilise pas. En fait j'utilise les données dans le fichier pour dessiner le maillage avec OpenGL :). –

+2

Le problème de l'OP est qu'en C/C++, l'ordre d'une structure est important lors de l'utilisation de FVF. Le FVF doit être correctement configuré pour fonctionner. –

0

je suis tombé sur la même chose moi même.

Je pense que l'ordre des bits est l'ordre requis. De 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 

Je suis sûr que l'ordre que vous recherchez est:

POSITION, NORMAL, PSIZE, DIFFUSE, SPECULAIRE, tex0 [, TEXn ...]

Je n'ai pas non plus trouvé de réponse définitive dans la documentation.