テクスチャ座標トランスフォーム
テクスチャ座標トランスフォーム
Microsoft® Direct3D® デバイスは、4 × 4 行列を適用して、頂点のテクスチャ座標をトランスフォームできる。システムは、ジオメトリと同じようにテクスチャ座標にトランスフォームを適用する。すべてのトランスフォーム (スケーリング、回転、平行移動、射影、せん断、またはこれらの組み合わせ) は、4 × 4 行列を使って実行される。
注 Direct3D では、トランスフォーム済みライティング済みの頂点は修正されない。したがって、トランスフォーム済みライティング済みの頂点を使用するアプリケーションでは、Direct3D によって頂点のテクスチャ座標をトランスフォームすることはできない。
ハードウェア アクセラレーションによるトランスフォーム & ライティング処理をサポートするデバイス (TnLHAL デバイス) では、テクスチャ座標トランスフォームも高速処理される。ハードウェア アクセラレーションによるトランスフォームが利用できない場合は、Direct3D ジオメトリ パイプラインのプラットフォーム固有の最適化によってテクスチャ座標トランスフォームが実行される。
テクスチャ座標トランスフォームは、ジオメトリのテクスチャ座標を直接変更しないで特殊効果を出そうとする場合に便利である。単純な平行移動行列や回転行列を使用して、オブジェクト上のテクスチャをアニメーションしたり、Direct3D によって自動生成されるテクスチャ座標をトランスフォームすることで、射影テクスチャや動的ライト マッピングなど高度なエフェクトを単純化し、高速処理することも可能である。また、テクスチャ座標トランスフォームを使用して、テクスチャ座標の単一セットを複数のテクスチャ ステージでのさまざまな目的のために再利用できる。
テクスチャ座標トランスフォームの設定と取得
アプリケーションでジオメトリに使用する行列と同様、IDirect3DDevice8::SetTransform および IDirect3DDevice8::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 テクスチャ座標を生成する。