我正在尝试阅读为DirectX应用程序创建的3D模型,这些模型按以下方式定义:
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
)对此问题进行一般性回答。指向文档右页的指针也没问题,因为我无法找到它。:)
答案 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)
答案 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 ...]
我无法在文档中找到明确的答案。