`
ruilin215
  • 浏览: 1105608 次
  • 性别: Icon_minigender_2
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

2.2顶点声明

阅读更多

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);

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

分享到:
评论

相关推荐

    HLSL初级教程.pdf

    目录 ...2.2顶点声明 2.3用顶点着色器实现渐变动画 3.像素着色器 3.1多纹理化 3.2多纹理效果的像素着色器 3.3应用程序 4.HLSL Effect(效果框架) 4.1Effect代码结构 4.2用Effect实现多纹理化效果 结语

    Introduction to 3D Game Programming with DirectX 9.0

    17.1.3 顶点声明的启用 291 17.2 顶点数据的使用 291 17.3 使用顶点着色器的步骤 293 17.3.1 顶点着色器的编写与编译 294 17.3.2 顶点着色器的创建 294 17.3.3 顶点着色器的设置 294 17.3.4 顶点着色器的销毁...

    精通DirectX.3D图形与动画程序设计.pdf

    22.2 顶点声明对象 22.3 asm顶点渲染简介 22.3.1 顶点渲染版本声明 22.3.2 顶点渲染寄存器 22.3.3 顶点渲染指令 22.4 asm顶点渲染示例 22.4.1 光照计算 22.4.2 渐变动画 22.4.3 蒙皮骨骼动画 22.5 小结 第23章 asm...

    校园导航系统-数据结构.doc

    概要设计(结构体类型及函数声明,功能模块图,流程图) 1 2.1结构体类型及函数声明 1 2.2功能模块图 2 2.3流程图 2 3.1节点数据结构类型: 4 3.2创建导航图函数: 4 3.3最短路径导航函数: 4 3.4导航菜单函数声明 5...

    Android 3D游戏开发技术宝典-OpenGL ES 2.0 (吴亚峰) 源代码

    2.2 简单数据的存储——preferences 33 2.2.1 preferences简介 33 2.2.2 preferences实现访问时间的记录 33 2.3 手机自带数据库——sqlite 34 2.3.1 初识sqlite 35 2.3.2 sqlite数据库的基本操作 ...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    8.4.3 被调用函数的声明和函数原型 107 8.5 函数的嵌套调用 108 8.6 函数的递归调用 109 8.7 数组作为函数参数 110 8.8 局部变量和全局变量 112 8.8.1 局部变量 113 8.8.2 全局变量 119 8.9 变量的存储类别 120 78.9...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    8.4.3 被调用函数的声明和函数原型 107 8.5 函数的嵌套调用 108 8.6 函数的递归调用 109 8.7 数组作为函数参数 110 8.8 局部变量和全局变量 112 8.8.1 局部变量 113 8.8.2 全局变量 119 8.9 变量的存储类别 120 78.9...

    OPhone应用开发权威指南(黄晓庆)

    2.2 第一个OPhone应用程序 16 2.2.1 新建OPhone项目 16 2.2.2 运行OPhone项目 18 2.2.3 更新资源文件 21 2.3 调试OPhone应用程序 24 2.3.1 设置断点 25 2.3.2 启动调试 25 2.3.3 单步跟踪 26 2.4 在命令行下开发...

    OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码

    C协议实现适配器模式8.5 用Objective-C的块在iOS 4中实现适配器模式8.5.1 块引用的声明8.5.2 块的创建8.5.3 把块用作适配器8.6 总结第9章 桥接9.1 何为桥接模式9.2 何时使用桥接模式9.3 创建iOS版虚拟仿真器9.4 总结...

    数据结构(C++)有关练习题

    实验一 复习C++有关知识 实验目的: 通过实验掌握下列知识: 1、复习C++有关基本知识; 2、熟悉VC编程、编译和调试环境; 内容及步骤: 编写一个类Complex,定义复数的加法、减法、乘法和除法运算,...

Global site tag (gtag.js) - Google Analytics