Microsoft DirectX 8.0 (C++) |
World matrix indices can be passed to Microsoft® Direct3D® by using legacy vertex shaders (FVF) or declarations.
The code example below shows how to use legacy vertex shaders.
struct VERTEX { float x,y,z; float weight; DWORD matrixIndices; float normal[3]; }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZB2 | D3DFVF_LASTBETA_UBYTE4 | D3DFVF_NORMAL);
When a legacy vertex shader is used, matrix indices are passed together with vertex positions using D3DFVF_XYZBn flags. Matrix indices are passed as bytes inside a DWORD and must be present immediately after the last vertex weight. Vertex weights are also passed using D3DFVF_XYZBn. A packed DWORD contains index3, index2, index1, and index0, where index0 is located in the lowest byte of the DWORD. The number of used world-matrix indices is equal to the number passed to the number of matrices used for blending as defined by D3DRS_VERTEXBLEND.
When a declaration is used, D3DVSDE_BLENDINDICES defines the input vertex register to get matrix indices from. Matrix indices must be passed as D3DVSDT_PACKEDBYTE.
The code example below shows how to use declarations. Note that the order of the components is no longer important unless using a fixed-function vertex shader.
struct VERTEX { float x,y,z; float weight; DWORD matrixIndices; float normal[3]; } DWORD decl[] = { D3DVSD_STREAM(0), D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3), D3DVSD_REG(D3DVSDE_BLENDWEIGHT, D3DVSDT_FLOAT1), D3DVSD_REG(D3DVSDE_BLENDINDICES, D3DVSDT_UBYTE), D3DVSD_REG(D3DVSDE_NORMAL, D3DVSDT_FLOAT3), D3DVSD_END() };