インデックス付き頂点ブレンドの使用 (Direct3D 9)
変換状態 256 から 511 は、8 ビット インデックスを使用してインデックスを作成できる最大 256 個のマトリックスを格納するために予約されています。 マクロ D3DTS_WORLDMATRIX を使用して、インデックス 0 から 255 を対応する変換状態にマップします。 次のコード例は、 IDirect3DDevice9::SetTransform メソッドを使用して、変換状態番号 256 の行列を ID 行列に設定する方法を示しています。
D3DMATRIX matBlend1;
D3DXMatrixIdentity( &matBlend1 );
m_pD3DDevice->SetTransform( D3DTS_WORLDMATRIX(0), &matBlend );
インデックス付き頂点ブレンドを有効または無効にするには、D3DRS_INDEXEDVERTEXBLENDENABLEレンダリング状態を TRUE に設定 します。 レンダリング状態が有効になっている場合は、マトリックス インデックスをすべての頂点にパックされた DWORD として渡す必要があります。 このレンダリング状態を無効にし、頂点ブレンドを有効にすると、すべての頂点にマトリックス インデックス 0、1、2、3 が設定されているのと同じです。 次のコード例では、 IDirect3DDevice9::SetRenderState メソッドを使用してインデックス付き頂点ブレンドを有効にします。
m_pD3DDevice->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, TRUE );
頂点ブレンドを有効または無効にするには、 IDirect3DDevice9::SetRenderState レンダリング状態を D3DVERTEXBLENDFLAGS 列挙型のD3DRS_DISABLE以外の値に設定します。 このレンダリング状態がD3DRS_DISABLEに設定されていない場合は、各頂点に必要な数の重みを渡す必要があります。 次のコード例では 、IDirect3DDevice9::SetRenderState を使用して、頂点ごとに 3 つの重みを持つ頂点ブレンドを有効にします。
m_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_3WEIGHTS );
インデックス付き頂点ブレンドのサポートの決定
インデックス付き頂点ブレンド マトリックスの最大サイズを決定するには、D3DCAPS9 構造体の MaxVertexBlendMatrixIndex メンバーをチェックします。 次のコード例では、 IDirect3DDevice9::GetDeviceCaps メソッドを使用してこのサイズを取得します。
D3DCAPS9 d3dCaps;
m_pD3DDevice->GetDeviceCaps( &d3dCaps );
IndexedMatrixMaxSize = d3dCaps.MaxVertexBlendMatrixIndex;
MaxVertexBlendMatrixIndex に設定された値が 0 の場合、デバイスはインデックス付きマトリックスをサポートしません。
Note
ソフトウェア頂点処理を使用する場合、通常のブレンドの有無にかかわらず、インデックス付き頂点ブレンドに 256 個のマトリックスを使用できます。
マトリックス インデックスを Direct3D に渡す
ワールド マトリックス インデックスは、レガシ頂点シェーダー (FVF) または宣言を使用して 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_UBYTE4として渡す必要があります。
次のコード例は、宣言の使用方法を示しています。 固定関数頂点シェーダーを使用しない限り、コンポーネントの順序は重要ではなくなります。
頂点宣言を次に示します。
struct VERTEX
{
float x,y,z;
float weight;
DWORD matrixIndices;
float normal[3];
}
対応するレジスタ宣言を次に示します。
// Create the shader declaration.
D3DVERTEXELEMENT9 decl[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
{ 0, 12, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT, 0 },
{ 0, 16, D3DDECLTYPE_UBYTE4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0 },
{ 0, 20, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },
D3DDECL_END()
};
関連トピック