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 }