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

本文关键字:定义 结构 顺序 何定义 顶点 格式 | 更新日期: 2023-09-27 17:57:20

所以我对输入时的确切定义有点困惑:

 VertexFormat FVF_FORMAT = VertexFormat.Position | VertexFormat.Diffuse;

通过阅读此处的文档:http://msdn.microsoft.com/en-us/library/ms889239.aspx

似乎 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_FORMAT定义顺序,它只关心顶点结构的顺序,所以以下两行得到相同的结果。

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

这意味着您必须按以下顺序定义顶点,先是位置,然后是漫反射(顺序取决于上面的宏定义)。当您填写顶点缓冲区的数据时也是如此。

注意:以上结论是基于我的测试,我没有找到任何文档这么说,你也可以测试自己的代码,看看这是否属实。