Microsoft DirectX 8.0 (C++) |
すべての減衰エフェクトでライティング強度を調整した後、Microsoft® Direct3D® では頂点法線と入射光の方向の角度を仮定して、頂点から反射する残光の量を計算する。ディレクショナル ライトではこの手順は実行されない。距離が増加しても光が減衰しないためである。
Direct3D ではディフューズとスペキュラの 2 種類の反射を考慮し、異なる公式を使用して各ライティングで反射する光の量を決定する。反射するライティングの量を計算した後、Direct3D はこれらの新しい値を、現在のマテリアルのディフューズ反射率プロパティとスペキュラ反射率プロパティに適用する。この結果として生じるカラー値は、グーロー シェーディングとスペキュラ ハイライト生成のためにラスタライザが使用するディフューズ成分とスペキュラ成分である。
Microsoft Direct3D では、次の公式を使用してディフューズ反射係数を計算する。
この公式では、Rd はディフューズ反射係数、D はライトが頂点に向かう方向、N は頂点法線である。ベクトル D は正規化される。ベクトル N は、D3DRS_NORMALIZENORMALS レンダリング ステートが有効になっている場合にのみ正規化される。ライティングの方向ベクトルに -1 を乗じて逆ベクトルにして、方向ベクトルと頂点法線の間の適正な関係付けを作成する。この公式の結果は -1.0 〜 1.0 の範囲の値である。この値は 0.0 〜 1.0 の範囲に制限され、頂点から反射されるライティングの強度を調整するために使用される。
ディフューズ反射係数を計算した後で、その結果を次のようなディフューズ反射公式に適用して、その頂点におけるディフューズ成分が決定される。次の公式は、アンビエント反射とディフューズ反射を組み合わせて頂点におけるディフューズ成分を作成する。
この公式では、Dv は頂点に対して計算されるディフューズ成分、Ia はシーン内のアンビエント ライト、および A は距離とスポットライト エフェクトのために減衰した光源のライティング強度 (スポットライト フォールオフ モデルで乗算された、距離の増加によるライトの減衰) である。変数 L はライティングのプロパティを表し、V エントリは頂点カラーを表す。ここで、それぞれに適用されている添字 a、d、および e は、色の種類のアンビエント (ambient)、ディフューズ (diffuse)、またはエミッション (emissive) を表す。公式で示すように、まず IaVa + Ve が計算され、すべてのアクティブなライティングの A(RdVdLd + VaLa) が加算される。
D3DRS_COLORVERTEX レンダリング ステートが有効になっている場合、D3DRS_AMBIENTMATERIALSOURCE および D3DRS_DIFFUSEMATERIALSOURCE レンダリング ステートに設定された値に基づいて V の色が選択される。これらのレンダリング ステートを D3DMATERIALCOLORSOURCE 列挙型のメンバに設定して、現在のマテリアルか、頂点の色をカラー ソースとして使用する。
詳細については、「スペキュラ反射モデル」を参照すること。
スペキュラ反射をモデル化するには、光の進行方向だけでなく、視点からの視線の方向もシステムに知らせる必要がある。システムでは Phong スペキュラ反射モデルの簡易バージョンを使用する。このモデルでは、中間ベクトルを使用してスペキュラ反射強度を概算する。中間ベクトルは、光源へのベクトルと視点へのベクトルの間の中間に存在する。Microsoft Direct3D では、アプリケーションは、D3DRS_LOCALVIEWER レンダリング ステートで制御する 2 種類の方法を使用して中間ベクトルを計算できる。D3DRS_LOCALVIEWER を TRUE に設定すると、システムではライティングの方向ベクトルに加えて、カメラの位置座標と頂点の位置座標を使用して中間ベクトルを計算する。次の公式はこの計算を示す。
この公式では、norm は入力ベクトルを正規化する演算子、VC は位置座標から視点または目の位置座標へのベクトル、Ld はライティングの方向ベクトルである。
この方法で中間ベクトルを決定する場合は、計算負荷が大きくなることがある。この代わりに、D3DRS_LOCALVIEWER を FALSE に設定することもできる。この場合、z 軸の無限遠方に視点が存在するとして処理される。この設定は計算負荷は少ないが、正確さで劣る。したがって、この方法は、正射影を使用するアプリケーションに最適である。D3DRS_LOCALVIEWER を FALSE に設定した場合、Direct3D では次の公式を使用して中間ベクトルを計算する。
この公式は最初の公式に類似しているが、ベクトル VC を計算する代わりに、z 軸上の無限遠方にある視点を表すベクトル I (0, 0, -1) を使用している。
中間ベクトル H を求めた後、システムは次の公式を使用してスペキュラ反射を計算する。
この公式では、Rs はスペキュラ反射率、N は頂点法線、H は中間ベクトル、p は現在のマテリアルのスペキュラ反射強度 (マテリアルの D3DMATERIAL8 構造体の Power メンバで指定) である。ベクトル H は正規化される。ベクトル N は、D3DRS_NORMALIZENORMALS レンダリング ステートが有効になっている場合にのみ正規化される。
ディフューズ反射公式と同様、この公式の結果は -1.0 〜 1.0 の範囲の値であり、この値は 0.0 〜 1.0 の範囲に制限され、頂点から反射されるライティングを計算するために使用される。また、ディフューズ反射モデルと同様、その頂点におけるスペキュラ成分を求める公式にその結果が適用される。
この公式では、Sv は計算されるスペキュラ色である。A は、距離およびスポットライト エフェクトのために減衰した単一の光源からのライトである。詳細については、「距離の増加によるライトの減衰」および「スポットライト フォールオフ モデル」を参照すること。変数 Rs は以前に計算されたスペキュラ反射率、Vs は頂点のスペキュラ成分、Ls はスペキュラ ライトの色である。
D3DRS_COLORVERTEX レンダリング ステートが有効になっている場合、D3DRS_SPECULARMATERIALSOURCE レンダリング ステートの値に基づいて V のカラー ソースが選択される。このレンダリング ステートを D3DMATERIALCOLORSOURCE 列挙型のメンバに設定して、現在のマテリアルか、頂点の色成分のいずれかをカラー ソースとして使用できる。
詳細については、「ディフューズ反射モデル」を参照すること。