Platform SDK: DirectX

スペキュラ反射モデル

[C++]

スペキュラ反射をモデル化するには、光の進行方向だけでなく、ビューアの視線の方向もシステムに知らせる必要がある。システムでは Phong スペキュラ反射モデルの簡易バージョンを使用する。このモデルでは、"中間ベクトル" を使用してスペキュラ反射強度を概算する。中間ベクトルは、光源へのベクトルと視点へのベクトルの間の中間に存在する。Direct3D では、アプリケーションは、D3DRENDERSTATE_LOCALVIEWER レンダリング ステートで制御する 2 種類の方法を使用して中間ベクトルを計算できる。D3DRENDERSTATE_LOCALVIEWER を TRUE に設定すると、システムではライティングの方向ベクトルに加えて、カメラの位置座標と頂点の位置座標を使用して中間ベクトルを計算する。次の公式はこの計算を示す。

この公式では、norm() は入力ベクトルを正規化する演算子、VC はベクトルの位置座標から視点 (目) の位置座標までに存在するベクトル、Ld はライトの方向ベクトルである。

この方法で中間ベクトルを決定する場合、いくらかの計算負荷がかかる。別の方法としては、D3DRENDERSTATE_LOCALVIEWER を FALSE に設定する。この場合、z 軸の無限遠方に視点が存在するとして処理される。この設定は計算負荷は少ないが、正確さで劣る。したがって、この方法は、正射影を使用するアプリケーションに最適である。D3DRENDERSTATE_LOCALVIEWER を FALSE に設定した場合、Direct3D では次の公式を使用して中間ベクトルを計算する。

この公式は最初の公式に類似しているが、ベクトル VC を計算する代わりに、z 軸上の無限遠方にある視点を表すベクトル I (0, 0, -1) を使用している。

中間ベクトル H を求めた後、システムは次の公式を使用してスペキュラ反射を計算する。

この公式では、Rs はスペキュラ反射率、N は頂点法線、H は中間ベクトル、p は現在のマテリアルのスペキュラ反射強度 (マテリアルの D3DMATERIAL7 構造体の dvPower メンバで指定) である。ベクトル H は正規化される。ベクトル N は、D3DRENDERSTATE_NORMALIZENORMALS レンダリング ステートが有効になっている場合にのみ正規化される。

ディフューズ反射公式と同様、この公式の結果は -1.0 〜 1.0 の範囲の値であり、この値は 0.0 〜 1.0 の範囲に制限され、頂点から反射されるライティングを計算するために使用される。また、ディフューズ反射モデルと同様、その頂点におけるスペキュラ成分を求める次のような公式にその結果が適用される。

この公式では、Sv は計算されるスペキュラ色、A は距離とスポット ライト エフェクト (「距離の増加によるライトの減衰」および「スポット ライト フォールオフ モデル」を参照すること) によって減衰した単一の光源からの光である。Rs 変数は以前に計算されたスペキュラ反射率、Vs は選択された、頂点のスペキュラ成分、Ls はスペキュラ ライトの色である。

D3DRENDERSTATE_COLORVERTEX レンダリング ステートが有効になっている場合、D3DRENDERSTATE_SPECULARMATERIALSOURCE レンダリング ステートの値に基づいて V の色ソースが選択される。このレンダリング ステートを D3DMATERIALCOLORSOURCE 列挙型のメンバに設定して、現在のマテリアルか、頂点の色成分のいずれかを色ソースとして使用できる。

詳細については、「ディフューズ反射モデル」を参照すること。

[Visual Basic]

スペキュラ反射をモデル化するには、光の進行方向だけでなく、ビューアの視線の方向もシステムに知らせる必要がある。システムでは Phong スペキュラ反射モデルの簡易バージョンを使用する。このモデルでは、"中間ベクトル" を使用してスペキュラ反射強度を概算する。中間ベクトルは、光源へのベクトルと視点へのベクトルの間の中間に存在する。Direct3D では、アプリケーションは、D3DRENDERSTATE_LOCALVIEWER レンダリング ステートで制御する 2 種類の方法を使用して中間ベクトルを計算できる。D3DRENDERSTATE_LOCALVIEWER を True に設定すると、システムではライトの方向ベクトルに加えて、カメラの位置座標と頂点の位置座標を使用して中間ベクトルを計算する。次の公式はこの計算を示す。

この公式では、norm() は入力ベクトルを正規化する演算子、VC はベクトルの位置座標から視点 (目) の位置座標までに存在するベクトル、Ld はライティングの方向ベクトルである。

この方法で中間ベクトルを決定する場合、いくらかの計算負荷がかかる。別の方法としては、D3DRENDERSTATE_LOCALVIEWER を False に設定する。この場合、z 軸の無限遠方に視点が存在するとして処理される。この設定は計算負荷は少ないが、正確さで劣る。したがって、この方法は、正射影を使用するアプリケーションに最適である。D3DRENDERSTATE_LOCALVIEWER を False, Direct3D に設定した場合、Direct3D では次の公式を使用して中間ベクトルを計算する。

この公式は最初の公式に類似しているが、ベクトル VC を計算する代わりに、z 軸上の無限遠方にある視点を表すベクトル I (0, 0, -1) を使用している。

中間ベクトル H を求めた後、システムは次の公式を使用してスペキュラ反射を計算する。

この公式では、Rs はスペキュラ反射率、N は頂点法線、H は中間ベクトル、p は現在のマテリアルのスペキュラ反射強度 (マテリアルの D3DMATERIAL7 型の power メンバで指定) である。ベクトル H は正規化される。ベクトル N は、D3DRENDERSTATE_NORMALIZENORMALS レンダリング ステートが有効になっている場合にのみ正規化される。

ディフューズ反射公式と同様、この公式の結果は -1.0 〜 1.0 の範囲の値であり、この値は 0.0 〜 1.0 の範囲に制限され、頂点から反射されるライティングを計算するために使用される。また、ディフューズ反射モデルと同様、その頂点におけるスペキュラ成分を求める公式にその結果が適用される。

この公式では、Sv は計算されるスペキュラ色、A は距離とスポット ライト エフェクト (「距離の増加によるライトの減衰」および「スポット ライト フォールオフ モデル」を参照すること) によって減衰した単一の光源からの光である。Rs 変数は以前に計算されたスペキュラ反射率、Vs は選択された、頂点のスペキュラ成分、Ls はスペキュラ ライトの色である。

D3DRENDERSTATE_COLORVERTEX レンダリング ステートが有効になっている場合、D3DRENDERSTATE_SPECULARMATERIALSOURCE レンダリング ステートの値に基づいて V の色ソースが選択される。このレンダリング ステートを CONST_D3DMATERIALCOLORSOURCE 列挙型のメンバに設定して、現在のマテリアルか、頂点の色成分のいずれかを色ソースとして使用できる。

詳細については、「ディフューズ反射モデル」を参照すること。