C# 灵活的顶点格式定义如何定义结构中项目的顺序?

C# 灵活的顶点格式定义如何定义结构中项目的顺序?,c#,directx,C#,Directx,所以我有点困惑,当我输入时,到底定义了什么: VertexFormat FVF_FORMAT = VertexFormat.Position | VertexFormat.Diffuse; 阅读此处的文档: FVF格式似乎只定义此结构中存储的信息,而不是结构中项目的顺序。那么directx引擎如何知道在哪里找到位置和颜色组件呢 或者vertexformat只是一种向其他类发出该顶点所需信息的方式 struct MY_VERTEX { VertexFormat FVF_FOR

所以我有点困惑,当我输入时,到底定义了什么:

 VertexFormat FVF_FORMAT = VertexFormat.Position | VertexFormat.Diffuse;
阅读此处的文档:

FVF格式似乎只定义此结构中存储的信息,而不是结构中项目的顺序。那么directx引擎如何知道在哪里找到位置和颜色组件呢

或者vertexformat只是一种向其他类发出该顶点所需信息的方式

  struct MY_VERTEX
  {
    VertexFormat FVF_FORMAT = VertexFormat.Position | VertexFormat.Diffuse;


    public float X, Y, Z;
    public int Color;

    public MY_VERTEX(float x, float y, float z, int color)
    {
      this.X = -x;
      this.Y = -y;
      this.Z = z;
      this.Color = color;
    }

好问题,经过几分钟的测试,我发现DirectX不关心FVF_格式定义顺序,它只关心顶点结构的顺序,因此下面两行得到相同的结果

VertexFormat FVF_FORMAT = VertexFormat.Position | VertexFormat.Diffuse;
VertexFormat FVF_FORMAT = VertexFormat.Diffuse | VertexFormat.Position;
在内部,D3DFVF_XYZ是在D3DFVF_Diffuse之前定义的,如下所示(d3d9types.h),因此上面两行的值都是0x42。DirectX处理顶点时,可能会使用位操作,如&。例如,0x42(十六进制)=01000010(bin),使用D3D_FVF_XYZ进行第一次测试

(0x42和0x002)!=0,此位已设置,因此存在D3DFVF_XYZ!从顶点缓冲区获取一些数据作为顶点位置。同样的逻辑也适用于其他宏

#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
这意味着您必须按照以下顺序定义顶点:首先是位置,然后是漫反射(顺序取决于上面的宏定义)。填写顶点缓冲区的数据时也是如此

注意:上述结论是基于我的测试得出的,我没有发现任何文档会这样说,您也可以测试自己的代码,看看这是否正确