次の方法で共有


キューブ環境マッピング (Direct3D 9)

キューブ環境マップ (キューブ マップとも呼ばれる) とは、オブジェクトの周囲のシーンをオブジェクトが立方体の中心にあるかのように表現した画像データを含むテクスチャーです。キューブ環境マップの各面は、水平方向と垂直方向の 90 度の視野を対象とし、1 つのキューブ マップには 6 つの面があります。各面の向きは、次の図に示すとおりです。

Cube with central coordinate axes perpendicular to cube faces

立方体の各面は、ワールド空間の x/y、y/z、または x/z 平面に垂直に位置します。次の図は、各平面と面の対応を示しています。

Faces of cube with coordinate projections on each face

キューブ環境マップは、一連のテクスチャー オブジェクトとして実装されます。アプリケーションでは、キューブ環境マップに静的な画像を使ったり、キューブ マップの面にレンダリングを行うことで動的な環境マッピングを実行することができます。この場合、キューブ マップ サーフェスは有効なレンダー ターゲット サーフェスでなければならず、D3DUSAGE_RENDERTARGET フラグ セットで作成されている必要があります。

キューブ マップの各面に、周囲のシーンを緻密にレンダリングする必要はありません。ほとんどの場合、環境マップは曲面に適用されます。大部分のアプリケーションで使う曲率が与えられたとすると、結果として反射して歪んだ画像が生成されるため、環境マップの緻密さはメモリーの点からもレンダリングのオーバーヘッドの点からも無駄になります。

キューブ環境マップのミップマップ化

キューブ マップはミップマップ化できます。ミップマップ化したキューブ マップを作成するには、IDirect3DDevice9::CreateCubeTexture メソッドの Levels パラメーターを必要なレベル数に設定します。これらのサーフェスの形状は、次の図に示すようになります。

Mipmapped cube map with n mip levels

ミップマップ化キューブ環境マップを作成するアプリケーションで各面にアクセスするには、IDirect3DCubeTexture9::GetCubeMapSurface メソッドを呼び出します。D3DCUBEMAP_FACES 列挙型から適切な値を設定して開始します。これについては、「キューブ環境サーフェスの作成 (Direct3D 9)」を参照してください。次に、IDirect3DCubeTexture9::GetCubeMapSurface の level パラメーターを目的のミップマップ レベルに設定して、取得するレベルを選択します。前に説明したとおり、0 は最上位画像に対応します。

キューブ環境マップのテクスチャー座標

キューブ環境マップを指し示すテクスチャー座標は、標準テクスチャーを適用する際に使う単純な 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&LHAL デバイスの場合は、アプリケーションで独自に計算するよりもはるかに速く計算を実行できます。この機能を利用するには、キューブ環境マップを含むテクスチャー ステージにおいて、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 = 2(ExN)N-E

この公式では、R は計算する反射ベクトル、E は位置座標から視点までの正規化されたベクトル、N はカメラ空間の頂点法線です。

D3DRS_LOCALVIEWER レンダリング ステートを FALSE に設定すると、次の公式が使われます。

R = 2NzN-I

この公式では、R および N 要素については前の公式と同じです。NZ 要素は頂点法線のワールド空間 z、I は無限大距離にある視点のベクトル (0,0,1) です。システムでは、いずれかの公式で求めた反射ベクトルを使って、キューブ マップの適切な面を選択および処理します。

    ほとんどの場合、アプリケーションでは頂点法線の自動正規化を有効にする必要があります。これを有効にするには、D3DRS_NORMALIZENORMALS を TRUE に設定します。このレンダリング ステートを有効にしていない場合、環境マップの外観が期待とは大きく異なるものになります。

追加情報は次のトピックに含まれます。

  • キューブ環境サーフェスの作成 (Direct3D 9)