分享
 
 
 

着色器和效果——2.1 顶点声明

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

2.1 顶点声明

阅读此文表明您已同意文末的声明

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

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

2.1.1 描述顶点声明

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

typedef struct _D3DVERTEXELEMENT9 {

BYTE Stream;

BYTE Offset;

BYTE Type;

BYTE Method;

BYTE Usage;

BYTE UsageIndex;

} D3DVERTEXELEMENT9;

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

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

struct Vertex

{

D3DXVECTOR3 pos;

D3DXVECTOR3 normal;

};

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

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

l D3DDECLTYPE_FLOAT1——浮点数值

l D3DDECLTYPE_FLOAT2——2D浮点向量

l D3DDECLTYPE_FLOAT3——3D浮点向量

l D3DDECLTYPE_FLOAT4——4D浮点向量

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

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

n 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成员的顶点声明意味着这个顶点已经被变换,它通知图形卡不要把这个顶点送到顶点处理阶段(变形和光照)。

注意:这些中的少数用途类型(usage type)未在本书中提及,例如BLENDWEIGHTS, BLENDINDICES, TANGENT, BINORMAL, 和TESSFACTOR

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

顶点描述声明的例子:假设我们想要描述的顶点格式由位置向量和三个法线向量组成。顶点声明可以指定如下:

D3DVERTEXELEMENT9 decl[] =

{

{0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_

POSITION, 0},

{0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_

NORMAL, 0},

{0, 24, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_

NORMAL, 1},

{0, 36, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_

NORMAL, 2},

D3DDECL_END()

};

D3DDECL_END宏用于初始化D3DVERTEXELEMENT9数组的最后一个顶点元素。同样的,注意法线向量的用途索引标签。

2.1.2 创建顶点声明

一旦你描述了一个顶点声明为D3DVERTEXELEMENT9数组,我们就可以使用下面的方法获得一个IDirect3DVertexDeclaration9接口指针:

HRESULT IDirect3DDevice9::CreateVertexDeclaration(

CONST D3DVERTEXELEMENT9* pVertexElements,

IDirect3DVertexDeclaration9** ppDecl

);

n pVertexElements——D3DVERTEXELEMENT9结构数组,它描述我们想要创建的顶点声明。

n ppDecl——用于返回创建的IDirect3DVertexDeclaration9接口指针

例子调用,其中decl是一个D3DVERTEXELEMENT9数组:

IDirect3DVertexDeclaration9* _decl = 0;

hr = _device->CreateVertexDeclaration(decl, &_decl);

2.1.3 允许一个顶点声明

回忆一下:自由顶点格式是一个方便的特性并且在内部转换成了顶点声明。因此,当直接使用顶点声明,我们不再需要调用:

Device->SetFVF( fvf );

相反,我们调用:

Device->SetVertexDeclaration( _decl );

其中,_decl是一个IDirect3DVertexDeclaration9接口指针。

[声明]:本文译自Frank Luna的《Introduction to 3D Game Programming with DirectX 9.0》,限于译者水平,文中难免错漏之处,欢迎各位网友批评指正;本文仅用于学习交流与参考用途,不得用于任何形式的商业用途;如需转载需事先征得作者本人和译者的同意,保持文章的完整性,并注明作者、译者和出处,对于违反以上条款造成的后果,译者对此不负任何责任。我的邮箱地址是Raymond_King123@hotmail.com,欢迎热爱3D图形和游戏,并有一定图形编程经验的朋友来信交流。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有