Microsoft DirectX 8.0 (C++)

Direct3D に対する行列インデックスの受け渡し

ワールド行列インデックスは、従来の頂点シェーダ (FVF) か宣言のどちらかを使って、Microsoft® Direct3D® に渡すことができる。

次のコードは、従来の頂点シェーダを使用する方法を示している。

struct VERTEX
{
    float x,y,z;
    float weight;
    DWORD matrixIndices;
    float normal[3];
};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZB2 | D3DFVF_LASTBETA_UBYTE4 |
                             D3DFVF_NORMAL);

従来の頂点シェーダを使用する場合、行列インデックスは D3DFVF_XYZBn フラグを使用して頂点位置座標と共に渡される。行列インデックスは DWORD 内のバイトとして渡され、最後の頂点加重の直後に存在しなければならない。頂点加重も D3DFVF_XYZBn を使用して渡される。パック DWORD は、index3、index2、index1、および index0 を保持し、index0 は DWORD の最下位バイトにある。使用されるワールド行列インデックスの数は、D3DRS_VERTEXBLEND によって定義されるブレンディングに使用される行列の数に渡される数値に等しい。

宣言を使用する場合は、D3DVSDE_BLENDINDICES が行列インデックスを取得する入力頂点レジスタを定義する。行列インデックスは、D3DVSDT_PACKEDBYTE として渡す必要がある。

次のコードは、宣言の使用方法を示している。固定機能による頂点シェーダを使用しない限り、コンポーネントの順序はまったく重要ではない点に注意すること。

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()
};