2.2顶点声明

xiaoxiao2021-03-01  4

2.2顶点声明

该小节对顶点声明的描述绝大多数都取自翁云兵的《着色器和效果》,该文对顶点声明的描述是我所见到最详尽最透彻的,这里向作者表示敬意:)

到现在为止,我们已经使用自由顶点格式(flexible vertex formatFVF)来描述顶点结构中的各分量。但是,在可编程管线中,我们的顶点数据可以包含比用FVF所能表达的多的多的数据。因此,我们通常使用更具表达性的并且更强有力的顶点声明(vertex declaration)。

注意:我们仍然可以在可编程管线中使用FVF——如果我们的顶点格式可以这样描述。不管怎样,这只是为了方便,因为FVF会在内部被转换为一个顶点声明。

2.2.1 描述顶点声明

我们将一个顶点声明描述为一个D3DVERTEXELEMENT9结构的数组。D3DVERTEXELEMENT9数组中的每个元素描述了一个顶点的分量。所以,如果你的顶点结构有三个分量(例如:位置、法线、颜色),那么其相应的顶点声明将会被一个含3个元素的D3DVERTEXELEMENT9结构数组描述。

D3DVERTEXELEMENT9结构定义如下:

typedef struct _D3DVERTEXELEMENT9 {

BYTE Stream;

BYTE Offset;

BYTE Type;

BYTE Method;

BYTE Usage;

BYTE UsageIndex;

} D3DVERTEXELEMENT9;

² Stream——指定关联到顶点分量的流;

² Offset——偏移,按字节,相对于顶点结构成员的顶点分量的开始。例如,如果顶点结构是:

struct Vertex

{

D3DXVECTOR3 pos;

D3DXVECTOR3 normal;

};

……pos分量的偏移是0,因为它是第一个分量;normal分量的偏移是12,因为sizeof(pos) == 12。换句话说,normal分量以Vertex的第12个字节为开始。

² Type——指定数据类型。它可以是D3DDECLTYPE枚举类型的任意成员;完整列表请参见文档。常用类型如下:

D3DDECLTYPE_FLOAT1——浮点数值

D3DDECLTYPE_FLOAT2——2D浮点向量

D3DDECLTYPE_FLOAT3——3D浮点向量

D3DDECLTYPE_FLOAT4——4D浮点向量

D3DDECLTYPE_D3DCOLOR—D3DCOLOR类型,它扩展为RGBA浮点颜色向量(r, g, b, a),其每一分量都是归一化到区间[0, 1]了的。

² Method——指定网格化方法。我们认为这个参数是高级的,因此我们使用默认值,标识为D3DDECLMETHOD_DEFAULT

² Usage——指定已计划的对顶点分量的使用。例如,它是否准备用于一个位置向量、法线向量、纹理坐标等,有效的用途标识符(usage identifier)是D3DDECLUSAGE枚举类型的:

typedef enum _D3DDECLUSAGE {

D3DDECLUSAGE_POSITION = 0, // Position.

D3DDECLUSAGE_BLENDWEIGHTS = 1, // Blending weights.

D3DDECLUSAGE_BLENDINDICES = 2, // Blending indices.

D3DDECLUSAGE_NORMAL = 3, // Normal vector.

D3DDECLUSAGE_PSIZE = 4, // Vertex point size.

D3DDECLUSAGE_TEXCOORD = 5, // Texture coordinates.

D3DDECLUSAGE_TANGENT = 6, // Tangent vector.

D3DDECLUSAGE_BINORMAL = 7, // Binormal vector.

D3DDECLUSAGE_TESSFACTOR = 8, // Tessellation factor.

D3DDECLUSAGE_POSITIONT = 9, // Transformed position.

D3DDECLUSAGE_COLOR = 10, // Color.

D3DDECLUSAGE_FOG = 11, // Fog blend value.

D3DDECLUSAGE_DEPTH = 12, // Depth value.

D3DDECLUSAGE_SAMPLE = 13 // Sampler data.

} D3DDECLUSAGE;

其中,D3DDECLUSAGE_PSIZE类型用于指定一个顶点的点的大小。它用于点精灵,因此我们可以基于每个顶点控制其大小。一个D3DDECLUSAGE_POSITION成员的顶点声明意味着这个顶点已经被变换,它通知图形卡不要把这个顶点送到顶点处理阶段(变形和光照)。

² UsageIndex——用于标识多个相同用途的顶点分量。这个用途索引是位于区间[0, 15]间的一个整数。例如,假设我们有三个用途为D3DDECLUSAGE_NORMAL的顶点分量。我们可以为第一个指定用途索引为0,为第二个指定用途索引为1,并且为第三个指定用途索引为2。按这种方式,我们可以通过其用途索引标识每个特定的法线。

例:假设我们想要描述的顶点格式由两个数据流组成,第一个数据流包含位置、法线、纹理坐标3个分量,第二个数据流包含位置和纹理坐标2个分量,顶点声明可以指定如下:

D3DVERTEXELEMENT9 decl[] =

{

//第一个数据流,包含分量位置、法线、纹理坐标

{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_

POSITION, 0 },

{ 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_

NORMAL, 0 },

{ 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_

TEXCOORD, 0 },

//第一个数据流,包含分量位置、纹理坐标

{ 1, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_

POSITION, 1 },

{ 1, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_

NORMAL, 1 },

D3DDECL_END()

};

D3DDECL_END宏用于初始化D3DVERTEXELEMENT9数组的最后一个顶点元素。

2.2.2创建顶点声明

CreateVertexDeclaration函数用于创建顶点声明,decl为指向上一小节定义的D3DVERTEXELEMENT9数组的指针,函数返回IDirect3DVertexDeclaration9指针g_Decl

IDirect3DVertexDeclaration9 *g_Decl = NULL;

g_pd3dDevice->CreateVertexDeclaration(decl ,&g_Decl);

2.2.3设置顶点声明

g_pd3dDevice->SetVertexDeclaration(g_Decl);

至此,可编程数据流模型、顶点声明介绍完毕,在下面的例子中读者将会有更连贯的理解。

转载请注明原文地址: https://www.6miu.com/read-3850287.html

最新回复(0)