6

我正在尝试阅读为 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)来回答这个问题。指向文档正确页面的指针也可以,因为我找不到它:)。

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

我很确定您要查找的订单是:

位置,正常,PSIZE,漫反射,镜面反射,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 回答