立方環境マッピング (Direct3D 9)
立方環境マップ (キューブ マップとも呼ばれることもあります) は、オブジェクトがキューブの中心にあるかのように、オブジェクトを囲むシーンを表す画像データを含むテクスチャです。 立方環境マップの各面は、水平および垂直の 90 度の視野をカバーし、キューブ マップごとに 6 つの面があります。 次の図は、顔の向きを示しています。
キューブの各面は、ワールド空間の x/y、y/z、または x/z 平面に対して垂直に配置されます。 次の図は、各平面が面にどのように対応するかを示しています。
立方環境マップは、一連のテクスチャ オブジェクトとして実装されます。 アプリケーションでは、立方環境マッピングに静的イメージを使用することも、キューブ マップの顔にレンダリングして動的環境マッピングを実行することもできます。 この手法では、キューブ マップ サーフェスが有効なレンダー ターゲット サーフェスであり、D3DUSAGE_RENDERTARGET フラグが設定された状態で作成されている必要があります。
キューブ マップの面には、周囲のシーンの非常に詳細なレンダリングを含める必要はありません。 ほとんどの場合、環境マップは曲線サーフェスに適用されます。 ほとんどのアプリケーションで使用される曲率の量を考えると、結果として生じる反射歪みにより、環境マップの詳細がメモリとレンダリングのオーバーヘッドの点で無駄になります。
Mipmapped 立方環境マップ
キューブ マップは mipmapped できます。 mipmapped キューブ マップを作成するには、 CreateCubeTexture メソッドの Levels パラメーターを目的のレベル数に設定します。 次の図に示すように、これらのサーフェスの地形を想定できます。
mipmapped 立方環境マップを作成するアプリケーションは 、GetCubeMapSurface メソッドを呼び出すことによって、各顔にアクセスできます。 最初に、「立方環境マップ サーフェスの作成 (Direct3D 9)」で説明されているように、D3DCUBEMAP_FACES列挙型から適切な値を設定します。 次に、 GetCubeMapSurface レベル パラメーターを目的のミップマップ レベルに設定して、取得するレベルを選択します。 0 は最上位のイメージに対応します。
立方環境マップのテクスチャ座標
3 次環境マップにインデックスを付けるテクスチャ座標は、標準テクスチャを適用するときに使用される単純な u、v スタイルの座標とは限りません。 実際、立方環境マップではテクスチャ座標はまったく使用されません。 テクスチャ座標のセットの代わりに、立方環境マップには 3D ベクターが必要です。 適切な頂点形式を指定するには、注意が必要です。 アプリケーションで使用するテクスチャ座標のセットの数をシステムに伝えるだけでなく、各セット内の要素の数に関する情報を提供する必要があります。 Direct3D には、この目的のために マクロのD3DFVF_TEXCOORDSIZEN セットが用意されています。 これらのマクロは 1 つのパラメーターを受け取り、サイズが記述されているテクスチャ座標セットのインデックスを識別します。 3D ベクターの場合は、D3DFVF_TEXCOORDSIZE3 マクロによって作成されたビット パターンを含めます。 次のコード例は、このマクロの使用方法を示しています。
// Create a flexible vertex format descriptor for a vertex that contains
// a position, normal, and one set of 3D texture coordinates.
DWORD dwFVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3(0);
拡散光マッピングなど、場合によっては、ベクトルにカメラ空間の頂点法線を使用します。 反射環境マッピングなどの他の場合は、反射ベクトルを使用します。 変換された頂点法線は広く理解されているため、ここでの情報は反射ベクトルの計算に集中します。
反射ベクトルを独自に計算するには、各頂点の位置と、視点からその頂点までのベクトルを理解する必要があります。 Direct3D では、ジオメトリの反射ベクトルを自動的に計算できます。 この機能を使用すると、環境マップのテクスチャ座標を含める必要がないため、メモリが節約されます。 また、帯域幅も削減され、T&L HAL デバイスの場合は、アプリケーションが独自に行うことができる計算よりも大幅に高速になる可能性があります。 この機能を使用するには、立方環境マップを含むテクスチャ ステージで、D3DTSS_TEXCOORDINDEXテクスチャ ステージの状態を 、D3DTEXTURESTAGESTATETYPE のD3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR メンバーとテクスチャ座標セットのインデックスの組み合わせに設定します。 拡散光マッピングなどの状況では、 D3DTEXTURESTAGESTATETYPE のD3DTSS_TCI_CAMERASPACENORMAL メンバーを使用すると、変換されたカメラ空間の頂点法線がテクスチャのアドレス指定ベクトルとして使用される場合があります。 インデックスは、テクスチャのラップ モードを決定するためにシステムによってのみ使用されます。
次のコード例は、この値の使用方法を示しています。
// The m_d3dDevice variable is a valid pointer
// to an IDirect3DDevice9 interface.
// Automatically generate texture coordinates for stage 2.
// This assumes that stage 2 is assigned a cube map.
// Use the wrap mode from the texture coordinate set at index 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) です。 システムは、いずれかの数式の反射ベクトルを使用して、キューブ マップの適切な面を選択して対処します。
Note
ほとんどの場合、アプリケーションでは頂点法線の自動正規化を有効にする必要があります。 これを行うには、D3DRS_NORMALIZENORMALS を TRUE に設定します。 このレンダリング状態を有効にしない場合、環境マップの外観は予想と大きく異なります。
追加情報については、次のトピックを参照してください。
関連トピック