テクスチャー座標トランスフォーム (Direct3D 9)
Direct3D デバイスは、4 × 4 行列を適用することで頂点のテクスチャー座標をトランスフォームすることができます。トランスフォームは、ジオメトリと同様にテクスチャー座標に適用されます。トランスフォーム (スケーリング、回転、平行移動、射影、傾斜、またはこれらの組み合わせ) はすべて、4 × 4 行列を使用して実行することができます。
注 Direct3D では、トランスフォームおよびライティングされた頂点は変更されません。そのため、トランスフォームおよびライティングされた頂点を使用するアプリケーションでは、Direct3D を使用して頂点のテクスチャー座標をトランスフォームすることはできません。
ハードウェア アクセラレーションによるトランスフォームおよびライティング処理をサポートするデバイス (T&L HAL デバイス) では、テクスチャー座標のトランスフォームも高速処理されます。トランスフォームのハードウェア アクセラレーションを使用できない場合は、Direct3D ジオメトリ パイプラインのプラットフォーム固有の最適化がテクスチャー座標トランスフォームに適用されます。
テクスチャー座標トランスフォームは、ジオメトリのテクスチャー座標を直接変更せずに、特殊効果を生成するのに役立ちます。単純な平行移動行列や回転行列を使用して、オブジェクト上のテクスチャーをアニメーション化したり、Direct3D によって自動的に生成されたテクスチャー座標をトランスフォームして、射影テクスチャーや動的ライトマッピングなどの高度な効果を単純化し、場合によっては高速処理することもできます。また、テクスチャー座標トランスフォームを使用して、1 つのテクスチャー座標系を複数のテクスチャー ステージでさまざまな目的に再利用することもできます。
テクスチャー座標トランスフォームの設定と取得
アプリケーションでジオメトリに使用する行列と同様に、テクスチャー座標トランスフォームを設定および取得するには、IDirect3DDevice9::SetTransform メソッドおよび IDirect3DDevice9::GetTransform メソッドを呼び出します。これらのメソッドは、テクスチャー ステージ 0 ~ 7 のトランスフォーム行列をそれぞれ表す、D3DTRANSFORMSTATETYPE 列挙型の D3DTS_TEXTURE0 ~ D3DTS_TEXTURE7 メンバーを取得します。
次のコードは、テクスチャー ステージ 0 のテクスチャー座標に適用する行列を設定しています。
// For this example, assume the d3dDevice variable contains a
// valid pointer to an IDirect3DDevice9 interface.
D3DMATRIX matTrans = D3DXMatrixIdentity( NULL );
// Set up the matrix for the desired transformation.
d3dDevice->SetTransform( D3DTS_TEXTURE0, &matTrans );
テクスチャー座標トランスフォームの有効化
D3DTSS_TEXTURETRANSFORMFLAGS テクスチャー ステージ ステートは、テクスチャー座標トランスフォームの用途を制御します。このテクスチャー ステージ ステートの値は、D3DTEXTURETRANSFORMFLAGS 列挙型によって定義されます。
D3DTSS_TEXTURETRANSFORMFLAGS が D3DTTFF_DISABLE (既定値) に設定されている場合、テクスチャー座標トランスフォームは無効です。テクスチャー座標トランスフォームがステージ 0 について有効な場合、次のコードによってこれが無効になります。
// For this example, assume the d3dDevice variable contains a
// valid pointer to an IDirect3DDevice9 interface.
d3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,
D3DTTFF_DISABLE );
D3DTEXTURETRANSFORMFLAGS で定義されている他の値は、テクスチャー座標トランスフォームを有効にするためや、生成されるテクスチャー座標要素のうちでラスタライザーに渡すものの数を制御するために使用します。たとえば、次のコードについて検討します。
// For this example, assume the d3dDevice variable contains a
// valid pointer to an IDirect3DDevice9 interface.
d3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,
D3DTTFF_COUNT2 );
D3DTTFF_COUNT2 の値は、テクスチャー ステージ 0 に設定されたトランスフォーム行列を適用し、変更されたテクスチャー座標の最初の 2 つの要素をラスタライザーに渡すようにシステムに指示します。
D3DTTFF_PROJECTED テクスチャー トランスフォーム フラグは、射影テクスチャーの座標を示します。このフラグを指定した場合、ラスタライザーによって、渡された要素が最後の要素で除算されます。次のコードについて検討します。
// For this example, assume the d3dDevice variable contains a
// valid pointer to an IDirect3DDevice9 interface.
d3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS,
D3DTTFF_COUNT3 | D3DTTFF_PROJECTED );
この例では、3 つのテクスチャー座標要素をラスタライザーに渡すようにシステムに指定します。ラスタライザーによって、最初の 2 つの要素が 3 番目の要素で除算され、テクスチャーの処理に必要な 2D テクスチャー座標が生成されます。