次の方法で共有


キューブ環境マップ

キューブ環境マップ

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

中心の座標軸がキューブの面に対して垂直のキューブ

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

各面に座標の射影があるキューブの面

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

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

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

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

n 個のミップ レベルを持つミップマップ化されたキューブ マップ

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

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

キューブ環境マップを指し示すテクスチャ座標は、標準テクスチャを適用する際に使う単純な u、v スタイルの座標とは異なる。実際、キューブ環境マップではテクスチャ座標を使わない。テクスチャ座標セットの代わりに、キューブ環境マップでは 3D ベクトルが必要である。適切な頂点フォーマットを指定することが大切である。また、システムにアプリケーションで使うテクスチャ座標のセット数を知らせるほかにも、各セット内の要素数についての情報を知らせる必要がある。Microsoft® 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 3-D texture coordinates.

DWORD dwFVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3(0); 

ディフューズ ライト マッピングなどの場合には、ベクトルにカメラ空間の頂点法線を使う。スペキュラ環境マッピングなどの場合には、反射ベクトルを使う。トランスフォーム済みの頂点法線については広く理解されているため、ここでは反射ベクトルの計算について詳しく説明する。

独自に反射ベクトルを計算するには、各頂点の位置座標と、ビューポートからその頂点へのベクトルを知っている必要がある。Direct3D ではジオメトリの反射ベクトルを自動的に計算できる。この機能を使えば、環境マップのテクスチャ座標を含める必要がないので、メモリを節約できる。さらに、帯域幅が減少し、TnLHAL デバイスの場合は、アプリケーションで独自に計算するよりもはるかに速く計算を実行できる。この機能を利用するには、キューブ環境マップを含むテクスチャ ステージにおいて、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 要素は頂点法線のワールド空間 zI は無限大距離にある視点のベクトル (0,0,1) である。システムでは、いずれかの公式で求めた反射ベクトルを使って、キューブ マップの適切なサーフェイスを選択および処理する。

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

詳細については、以下のトピックを参照すること。

  • キューブ環境マップ サーフェイスの作成