CreateVertexDeclaration,SetStreamSource之间的关系

SetStreamSource将一个vertex buffer与一个stream绑定,

比如

// Bind vertex buffers to device data streams

m_pd3dDevice->SetStreamSource(0, m_pVtxBuf0, 0, sizeof(VTXSTREAM_0));

m_pd3dDevice->SetStreamSource(1, m_pVtxBuf1, 0, sizeof(VTXSTREAM_1));
将m_pVtxBuf0与stream 0绑定,将m_pVtxBuf1与stream 1绑定。


我们知道一个vertex buffer里存储的是各种各样的顶点数据。

d3d绘制物体时,从vertex buffer(或者说stream)里获取这些数据之后,如何知道这些数据的用途?

比如说,我们从stream 0获取了(x,y,z),想让它表示物体的顶点位置,如何实现?

实际上,对顶点的用途描述是通过CreateVertexDeclaration,SetVertexDeclaration来实现的。

用CreateVertexDeclaration创建一个顶点声明,这个声明用来描述某个stream中的数据是用来干嘛用的。因为只是一种描述,与具体的顶点无关,所以可以重复使用。

实际这个用这个声明来描述stream(vertex buffer)中的数据,是通过SetVertexDeclaration来实现的。


CreateVertexDeclaration是如何描述顶点数据用途的?

通过一个D3DVERTEXELEMENT9数组,数组中的每一个元素,描述了某个顶点属性,所在的stream,所在stream中的位置,用途,类型等。


也就是说使用DrawPrimitive等方法从stream中读取数据时,以下面代码为例,

在stream 0的offset为0的位置读取到的数据,视为顶点位置;在在stream 0的offset为12的位置读取到的数据,视为法线。。。。。。

在stream 1的offset为0的位置读取到的数据,视为纹理坐标0;在在stream 0的offset为8的位置读取到的数据,视为纹理坐标2。。。。。。

//

// Initializations:

//

// Here is a set of vertex definitions to support two streams.

// Vertex format:

//     stream 0 -> position + normal + color 0 + color 1

//     stream 1 -> 4 texture coordinate pairs



struct VTXSTREAM_0

{

  float fPosX, fPosY, fPosZ;

  float fNormX, fNormY, fNormZ;

  DWORD dwColor0, dwColor1;

};



struct VTXSTREAM_1

{

  float fTexU0, fTexV0;

  float fTexU1, fTexV1;

  float fTexU2, fTexV2;

  float fTexU3, fTexV3;

};



// Vertex declaration

D3DVERTEXELEMENT9 m_VtxDcl[] =

{

  {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT,

   D3DDECLUSAGE_POSITION, 0}, // stream 0, position

  {0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT,

   D3DDECLUSAGE_NORMAL, 0},   // stream 0, normal



  {0, 24, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT,

   D3DDECLUSAGE_COLOR, 0},    // stream 0, color 0

  {0, 28, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT,

   D3DDECLUSAGE_COLOR, 1},    // stream 0, color 1



  {1, 0, D3DDECLUSAGE_FLOAT2, D3DDECLMETHOD_DEFAULT,

   D3DDECLUSAGE_TEXCOORD, 0}, // stream 1, tex coord set 0

  {1, 8, D3DDECLUSAGE_FLOAT2, D3DDECLMETHOD_DEFAULT,

   D3DDECLUSAGE_TEXCOORD, 1}, // stream 1, tex coord set 1



  {1, 16, D3DDECLUSAGE_FLOAT2, D3DDECLMETHOD_DEFAULT,

   D3DDECLUSAGE_TEXCOORD, 2}, // stream 1, tex coord set 2

  {1, 24, D3DDECLUSAGE_FLOAT2, D3DDECLMETHOD_DEFAULT,

   D3DDECLUSAGE_TEXCOORD, 3}  // stream 1, tex coord set 3



}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值