Platform SDK: DirectX

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

[C++]

キューブ環境マップを指し示すテクスチャ座標は、標準テクスチャの適用時に使用する単純な u、v スタイルの座標とは異なる。実際、キューブ環境マップではテクスチャ座標をまったく使用しない。テクスチャ座標セットの代わりに、キューブ環境マップでは 3D ベクトルが必要である。適切な頂点フォーマットを指定することが大切である。また、システムにアプリケーションで使用するテクスチャ座標のセット数を知らせるほかにも、各セット内の要素数についての情報を知らせる必要がある。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 フラグを使用して、システムにカメラ空間のトランスフォーム済み頂点法線をテクスチャのアドレッシング ベクトルとして使用することを知らせることができる)。インデックスは、システムがテクスチャのラッピング モードを決定するためにのみ使用する。

次のコードは、この値の使用方法を示す。

// pd3dDevice 変数は、IDirect3DDevice7 インターフェイスへの
// 有効なポインタである。

// ステージ 2 に対してテクスチャ座標を自動生成する。
// ここでは、ステージ 2 にキューブ マップが割り当てられているとする 
// (インデックス 1 のテクスチャ座標セットからのラップ モードを使用する)。
pd3dDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 
D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR | 1); 

自動テクスチャ座標生成を有効にすると、2 つの公式のいずれかを使用して各頂点の反射ベクトルが計算される。D3DRENDERSTATE_LOCALVIEWER レンダリング ステートを TRUE に設定すると、次の公式が使用される。

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

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

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

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

[Visual Basic]

キューブ環境マップを指し示すテクスチャ座標は、標準テクスチャの適用時に使用する単純な u、v スタイルの座標とは異なる。実際、キューブ環境マップではテクスチャ座標をまったく使用しない。テクスチャ座標セットの代わりに、キューブ環境マップでは 3D ベクトルが必要である。適切な頂点フォーマットを指定することが大切である。また、システムにアプリケーションで使用するテクスチャ座標のセット数を知らせるほかにも、各セット内の要素数についての情報を知らせる必要がある。Direct3D は、これを行うためにヘルパー関数の D3DFVF_TEXCOORDSIZEn セットを Math.bas ソース ファイルに用意している (Math.bas ファイルはこの SDK に付属している)。これらのヘルパー関数にはパラメータが 1 つあり、サイズが記述されるテクスチャ座標セットのインデックスを識別する。3D ベクトルの場合は、D3DFVF_TEXCOORDSIZE3 ヘルパー関数で作成するビット パターンを含める。次のコードは、この関数の使用方法を示す。

' 頂点の柔軟な頂点フォーマット記述子を作成する。
' これには、位置座標、法線、および
' 3D テクスチャ座標のセットが 1 つ含まれる。
Dim lFVF As Long
lFVF = D3DFVF_XYZ Or D3DFVF_NORMAL Or 
D3DFVF_TEX1 Or D3DFVF_TEXCOORDSIZE3(0) 

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

独自に反射ベクトルを計算するには、各頂点の位置座標と、ビューポートからその頂点へのベクトルを知っている必要がある。Direct3D ではジオメトリの反射ベクトルを自動的に計算できる。この機能を使用すれば、メモリを節約できる (環境マップのテクスチャ座標を含める必要がない)。つまり、帯域幅が減少し、TnLHAL デバイスの場合は、アプリケーションで独自に計算するよりもはるかに速く計算を実行できる。この機能を利用するには、キューブ環境マップを含むテクスチャ ステージにおいて、D3DTSS_TEXCOORDINDEX テクスチャ ステージ ステートを、D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR フラグの組み合わせとテクスチャ座標セットのインデックスに設定するだけである (ディフューズ ライト マッピングの場合などには、D3DTSS_TCI_CAMERASPACENORMAL フラグを使用して、システムにカメラ空間のトランスフォーム済み頂点法線をテクスチャのアドレッシング ベクトルとして使用することを知らせることができる)。インデックスは、システムがテクスチャのラッピング モードを決定するためにのみ使用する。

次のコードは、この値の使用方法を示す。

' pd3dDevice 変数は、Direct3DDevice7 オブジェクトへの
' 有効な参照である。

' ステージ 2 に対してテクスチャ座標を自動生成する。
' ここでは、ステージ 2 にキューブ マップが割り当てられているとする 
' (インデックス 1 のテクスチャ座標セットからのラップ モードを使用する)
Call d3dDevice.SetTextureStageState(2, D3DTSS_TEXCOORDINDEX, 
D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR Or 1)

自動テクスチャ座標生成を有効にすると、2 つの公式のいずれかを使用して各頂点の反射ベクトルが計算される。D3DRENDERSTATE_LOCALVIEWER レンダリング ステートを True に設定すると、次の公式が使用される。

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

D3DRENDERSTATE_LOCALVIEWER レンダリング ステートを False に設定すると、次の公式が使用される。

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

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