Microsoft DirectX 8.0 (Visual Basic)

Passing Matrix Indices to Direct3D

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.

Private Type VERTEX
    x As Single
    y As Single
    z As Single
    weight As Single
    matrixIndices As Long
    normal(2) As Single
End Type

Const D3DFVF_CUSTOMVERTEX = (D3DFVF_XYZB2 Or D3DFVF_NORMAL Or _
                             D3DFVF_LASTBETA_UBYTE4)

When a legacy vertex shader is used, matrix indices are passed together with vertex positions using D3DFVF_XYZBn flags. Matrix indices are passed as a packed byte and must be present immediately after the last vertex weight. Vertex weights are also passed using D3DFVF_XYZBn. A packed byte contains index3, index2, index1, and index0, where index0 is located in the lowest byte of the byte. 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.

Private Type VERTEX
    x As Single
    y As Single
    z As Single
    matrixIndices As Long
    weight As Single
    normal(2) As Single
End Type

Dim decl(5) As Long

decl(0) = D3DVSD_STREAM(0)
decl(1) = D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3)
decl(2) = D3DVSD_REG(D3DVSDE_BLENDINDICES, D3DVSDT_PACKEDBYTE)
decl(3) = D3DVSD_REG(D3DVSDE_BLENDWEIGHT, D3DVSDT_FLOAT1)
decl(4) = D3DVSD_REG(D3DVSDE_NORMAL, D3DVSDT_FLOAT3)
decl(5) = D3DVSD_END()