次の方法で共有


ジオメトリ ブレンドの使用 (Direct3D 9)

次のユーザー定義構造は、2 つのマトリックス間でブレンドされる頂点に使用できます。

// The flexible vertex format (FVF) descriptor for this vertex would be:
//   FVF = D3DFVF_XYZB1 | D3DFVF_NORMAL | D3DFVF_TEX1; 

struct D3DBLENDVERTEX {
    D3DVECTOR v;
    FLOAT     blend; 
    D3DVECTOR n;
    FLOAT     tu, tv;
};

ブレンド ウェイトは、FVF 内の位置と RHW データの後、頂点法線の前に表示する必要があります。

上記の頂点形式には、ブレンドウェイト値が 1 つだけ含まれていることに注意してください。 これは、D3DTS_WORLDMATRIX(0) とD3DTS_WORLDMATRIX(1) 変換状態で定義される 2 つのワールド 行列があるためです。 システムは、単一の重み値を使用して、これら 2 つのマトリックス間の各頂点をブレンドします。 3 つのマトリックスの場合は、2 つの重みだけが必要です。などです。

Note

スキンウェイトの定義は簡単です。 関節間の距離の線形関数を使用することは良いスタートですが、より滑らかなシグモイド関数の方が良く見えます。 スキンウェイト分布機能を選択すると、短い距離で皮膚の体重が大きく変化することで、必要に応じて関節に鋭い折り目が生じる可能性があります。

 

ブレンド マトリックスの設定

システムがブレンドする変換マトリックスを設定するには、 IDirect3DDevice9::SetTransform メソッドを呼び出します。 最初のパラメーターを D3DTS_WORLDMATRIX マクロで定義された値に設定し、2 番目のパラメーターを設定するマトリックスのアドレスに設定します。

次の C++ コード例では、2 つのワールド マトリックスを設定します。この間にジオメトリをブレンドして、関節アームの錯覚を作成します。

// For this example, the d3dDevice variable is assumed to be a valid pointer
//   to an IDirect3DDevice9 interface for an initialized 3D scene.

float     BendAngle = 3.1415926f / 4.0f; // 45 degrees
D3DMATRIX matUpperArm, matLowerArm;

// The upper arm is immobile. Use the identity matrix.
D3DXMatrixIdentity( matUpperArm );
d3dDevice->SetTransform( D3DTS_WORLDMATRIX(0), &matUpperArm );

// The lower arm rotates about the x-axis, attached to the upper arm.
D3DXMatrixRotationX( matLowerArm, -BendAngle ); 
d3dDevice->SetTransform( D3DTS_WORLDMATRIX(1), &matLowerArm );

ブレンド マトリックスを設定すると、後で使用するためにシステムによってマトリックスがキャッシュされるだけです。頂点のブレンドを開始するようにシステムに指示しません。

ジオメトリ ブレンドの有効化

ジオメトリ ブレンドは既定では無効になっています。 ジオメトリ ブレンドを有効にするには、 IDirect3DDevice9::SetRenderState メソッドを呼び出して、D3DRS_VERTEXBLENDレンダリング状態を D3DVERTEXBLENDFLAGS 列挙型の値に設定します。 次のコード例は、2 つのワールド マトリックス間のブレンドのレンダリング状態を設定するときのこの呼び出しの外観を示しています。

d3dDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_1WEIGHTS );

D3DRS_VERTEXBLENDがD3DVBF_DISABLE以外の値に設定されている場合、適切な数のブレンド ウェイトが頂点形式に含まれるものと想定されます。 準拠している頂点形式を指定し、その形式の適切な説明を Direct3D レンダリング メソッドに提供するのは、お客様の責任です。

有効にすると、DrawPrimitive レンダリング メソッドによってレンダリングされるすべてのオブジェクトに対してジオメトリ ブレンドが実行されます。

参照

固定機能 FVF コード (Direct3D 9)

ジオメトリ ブレンド