Microsoft DirectX 8.0 (C++) |
キューブ環境マップを指し示すテクスチャ座標は、標準テクスチャを適用する際に使用する単純な u、v スタイルの座標とは異なる。実際、キューブ環境マップではテクスチャ座標を使用しない。テクスチャ座標セットの代わりに、キューブ環境マップでは 3D ベクトルが必要である。適切な頂点フォーマットを指定することが大切である。また、システムにアプリケーションで使用するテクスチャ座標のセット数を知らせるほかにも、各セット内の要素数についての情報を知らせる必要がある。Microsoft®Direct3D® は、これを行うためにマクロの D3DFVF_TEXCOORDSIZEn セットを用意している。これらのマクロにはパラメータが 1 つあり、サイズが記述されるテクスチャ座標セットのインデックスを識別する。3D ベクトルの場合は、D3DFVF_TEXCOORDSIZE3 マクロで作成するビット パターンを含める。次のコードは、このマクロの使用方法を示している。
/* * 頂点の柔軟な頂点フォーマット記述子を作成する。 * これには、位置座標、法線、および * 3D テクスチャ座標のセットが 1 つ含まれる。 */ DWORD dwFVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3(0);
ディフューズ ライト マッピングなどの場合には、ベクトルにカメラ空間の頂点法線を使用する。スペキュラ環境マッピングなどの場合には、反射ベクトルを使用するトランスフォーム済み頂点法線については広く理解されているため、ここでは反射ベクトルの計算について詳しく説明する。
独自に反射ベクトルを計算するには、各頂点の位置座標と、ビューポートからその頂点へのベクトルを知っている必要がある。Direct3D ではジオメトリの反射ベクトルを自動的に計算できる。この機能を使用すれば、環境マップのテクスチャ座標を含める必要がないので、メモリを節約できる。さらに、帯域幅が減少し、TnLHAL デバイスの場合は、アプリケーションで独自に計算するよりもはるかに速く計算を実行できる。この機能を利用するには、キューブ環境マップを含むテクスチャ ステージにおいて、D3DTSS_TEXCOORDINDEX テクスチャ ステージ ステートを、D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR フラグの組み合わせとテクスチャ座標セットのインデックスに設定する。ディフューズ ライト マッピングの場合などには、D3DTSS_TCI_CAMERASPACENORMAL フラグを使用して、システムにカメラ空間のトランスフォーム済み頂点法線をテクスチャのアドレッシング ベクトルとして使用することを知らせることができる。インデックスは、システムがテクスチャのラッピング モードを決定するためにのみ使用する。
次のコードは、この値の使用方法を示している。
/* * 変数 m_d3dDevice は、IDirect3DDevice8 インターフェイスへの * 有効なポインタである。 * * ステージ 2 に対してテクスチャ座標を自動生成する。 * ここでは、ステージ 2 にキューブ マップが割り当てられているとする。 * インデックス 1 のテクスチャ座標セットからのラップ モードを使用する。 */ m_d3dDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR | 1);
自動テクスチャ座標生成を有効にすると、2 つの公式のいずれかを使用して各頂点の反射ベクトルが計算される。D3DRS_LOCALVIEWER レンダリング ステートを TRUE に設定すると、次の公式が使用される。
この公式では、R は計算する反射ベクトル、E は位置座標から視点までの正規化されたベクトル、N はカメラ空間の頂点法線である。
D3DRS_LOCALVIEWER レンダリング ステートを FALSE に設定すると、次の公式が使用される。
この公式では、R および N 要素については前の公式と同じである。Nz 要素は頂点法線のワールド空間 z、I は無限大距離にあるビューポートのベクトル (0,0,1) である。システムでは、いずれかの公式で求めた反射ベクトルを使用して、キューブ マップの適切なサーフェスを選択および処理する。
注 ほとんどの場合、アプリケーションでは頂点法線の自動正規化を有効にする必要がある。これを有効にするには、D3DRS_NORMALIZENORMALS を TRUE に設定する。このレンダリング ステートを有効にしていない場合、環境マップの外観が期待とは大きく異なるものになる。