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
这意味着您必须按照以下顺序定义顶点:首先是位置,然后是漫反射(顺序取决于上面的宏定义)。填写顶点缓冲区的数据时也是如此
注意:上述结论是基于我的测试得出的,我没有发现任何文档会这样说,您也可以测试自己的代码,看看这是否正确