字段(位置,法线等)在D3D9顶点中的位置

时间:2009-10-03 20:43:47

标签: directx direct3d

我正在尝试阅读为DirectX应用程序创建的3D模型,这些模型按以下方式定义:

  • 在文件头中,给出了网格的灵活顶点格式(FVF)(实际上,我在测试的网格中有D3DFVF_ {XYZ,DIFFUSE,NORMAL,TEX1,TEX2}的任意组合)
  • 然后,n顶点以线性模式给出,字段根据FVF显示。

但是,我不知道这些字段的顺序。逻辑是它在DirectX文档中的某处定义,但我无法找到它。例如,这两个结构中哪一个与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)对此问题进行一般性回答。指向文档右页的指针也没问题,因为我无法找到它。:)

3 个答案:

答案 0 :(得分:1)

你应该如下定义它。

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

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

(D3DVERTEX指整个顶点结构而不仅仅是一个3元素向量)

在你的两个选项中,很大程度上取决于你如何访问这些vert元素。如果你使用的是被贬低的FVF,那么你选择的第二个就更正确了。

如果您使用的是顶点声明,那么您可以定义结构中相关数据的位置,排序无关紧要。

答案 1 :(得分:1)

你在这里

FVF(OP表示此页面上的信息不正确。我不知道,不检查FVF定位是否正确)

Generator

答案 2 :(得分:1)

我自己遇到了同样的事情。

我认为位的顺序是所需的顺序。来自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

我很确定你要找的订单是:

位置,法线,PSIZE,漫反射镜面的,TEX0 [,TEXn ...]

我无法在文档中找到明确的答案。