D3D 顶点缓存的设计

D3D 顶点缓存的设计

这一步的关键词是设计,Design。

 如果我们要研发一部手机,首先要进行策划,做好设计图纸。使用顶点缓存也是一样,想要使用顶点缓存绘制图形,第一步的工作就是对顶点的类型进行设计。今天我们要介绍的一套顶点格式,是固定功能流水线中使用频繁的一套顶点定义格式——灵活顶点格式(Flexible Vertex Format,FVF)。需要说明的是,与灵活顶点格式对应的是可编程渲染流水线中的“顶点声明”顶点定义套路,今天我们暂时先介绍灵活顶点格式这套定义套路。

灵活顶点格式(Flexible Vertex Format,FVF)来描述三角形网格的每个顶点。灵活顶点格式可以让我们随心所欲地自定义其中所包含的顶点属性信息。例如,指定顶点的三维坐标、颜色、顶点法线和纹理坐标等等。

 创建自定义灵活顶点格式时,根据实际的需求,需要定义一个包含特定顶点信息的结构体。主动权在我们这里,我们可以随心所欲地定义顶点包含的属性。比如我们可以定义一个只包含顶点三维坐标和颜色的结构体。

  1. struct CUSTOMVERTEX
  2. {
  3. float x, y, z; //顶点的三维坐标值,x,y,z
  4. DWORD color; //顶点的颜色值
  5. }; 
    struct CUSTOMVERTEX{       float x, y, z;             //顶点的三维坐标值,x,y,z       DWORD color;               //顶点的颜色值};

我们当然也可以定义一个复杂一点,包含很多属性的顶点:

  1. struct NormalTexVertex
  2. {
  3. float x, y, z; // 顶点坐标
  4. float nx, ny, nz; // 法线向量
  5. float u, v; // 纹理坐标
  6. };

struct NormalTexVertex{	float x, y, z; // 顶点坐标	float nx, ny, nz; // 法线向量	float u, v; // 纹理坐标 };

 

但单单定义出结构体, Direct3D是不能理解我们在干嘛的,这时候,我们需要一个宏来传达我们定义的顶点有哪些属性。

比如刚刚我定义的CUSTOMVERTEX结构体就可以通过以下方式来描述:

  1. #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

 

我们可以看到,结构体中有的属性,在这个宏定义都有着一一对应,相辅相成。

 

在Direct3D中常用的FVF格式可以取下面这些值:

 

序号

标示

精析

1

D3DFVF_XYZ

包含未经过坐标变换的顶点坐标值,不可以和D3DFVF_XYZRHW一起使用

2

D3DFVF_XYZRHW

包含经过坐标变换的顶点坐标值,不可以和D3DFVF_XYZ以及D3DFVF_NORMAL一起使用

3

D3DFVF_XYZB1~5

 

标示顶点混合的权重值,数值后缀为几就用几,这个属性在后面骨骼动画中有用到

 

 

4

D3DFVF_NORMAL

包含法线向量的数值

5

D3DFVF_DIFFUSE

包含漫反射的颜色值

6

D3DFVF_SPECULAR

包含镜面反射的数值

7

D3DFVF_TEX1~8

表示包含1~8个纹理坐标信息,是几重纹理后缀就用几,最多8层纹理

 

关于围绕着这个表格的讲解:

其中D3DFVF_XYZ和D3DFVF_XYZRHW这两个属性的内容重复了,可谓水火不相容,一山不容二虎,每次我们选择其中的一个写出来就可以了,其中D3DFVF_XYZ表示未经过坐标变换的顶点,而D3DFVF_XYZRHW表示经过坐标变换的顶点。

需要注意的是,我们在书写灵活顶点格式的宏定义的时候需要遵守一个顺序原则,顺序就是优先级需要这样来分:

 

顶点坐标位置>RHW值>顶点混合权重值>顶点法线向量>>漫反射颜色值>镜面反射颜色值>纹理坐标信息。

 

也就是说,在定义FVF宏的时候,顶点坐标位置总是排着最前面的。然后依次是RHW值,然后继续往后排。

浅墨在制作上面这个表格的时候专门为他们专门标好了序号,大家写的时候只要按着标号的顺序取自己想要的属性,按着顺序写就可以了。

 

光说如果大家还是不太理解,我们举两个例子。

顶点结构体定义好后,配套的宏定义需要遵守上面的约定,于是我们按顺序这样写:

 

  1. #define D3DFVF_CUSTOMVERTEX1 (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)

#define D3DFVF_CUSTOMVERTEX1 (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)

再举一个例子,依然是遵循表格中的顺序来写:

  1. #define D3DFVF_CUSTOMVERTEX2 (D3DFVF_XYZRHW | D3DFVF_XYZB1| D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1)

#define D3DFVF_CUSTOMVERTEX2 (D3DFVF_XYZRHW | D3DFVF_XYZB1| D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1)


好了,最终我们把这步整体起来看,定义顶点格式需要的代码就可以这样写:

  1. struct CUSTOMVERTEX
  2. {
  3. FLOAT x, y, z, rhw;
  4. DWORD color;
  5. };
  6. #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE) //FVF灵活顶点格式

 

source:http://blog.csdn.net/zhmxy555/article/details/8276363

猜你喜欢

转载自blog.csdn.net/zhanghefu/article/details/43024721