Microsoft DirectX 8.0 (C++)

Direct3D のライティングにおける数学的計算

ここでは、Microsoft® Direct3D® ライティング エンジンのしくみおよび実装の詳細を説明する。Direct3D は、自然光の振る舞いを評価してライティングをモデル化する。Direct3D ライティング モデルは、ライトの色、ライトの進行方向と距離、ビューアの位置座標、およびマテリアルの特性を監視して、面の各頂点で 2 つの色成分を計算する。Direct3D は、これらの色成分を使用して、面のピクセルをラスタ化するときに描画する色を計算する。

  すべての計算はモデル空間で行われる。ワールド行列の逆行列を使用してカメラ位置座標と共にライトの位置座標と方向をモデル空間にトランスフォームし、次に逆トランスフォームする。その結果、ワールド行列またはビュー行列によって一様でないスケーリングが生じる場合は、最終的なライティングが不正確になることがある。

ここでは、ディフューズ成分とスペキュラ成分を提供するために Direct3D で使用する公式について技術的観点から説明する。Direct3D の方法を理解すれば、Direct3D ライティング モデルが要望に合うかどうかをより正確に判断できるようになる。Direct3D ライティング モデルは、正確さ、効率性、および使いやすさを目指して設計されている。しかし、Direct3D で使用する公式がニーズに合わない場合は、Direct3D ライティング モジュールは使用せず、独自のライティング モデルを実装することもできる。説明するトピックは、次のとおりである

この公式で使用されるパラメータを、次の表に示す。各表には、対応するデフォルト値、型、および許容値の範囲を示す。

次の表は、位置パラメータを示している。

パラメータ デフォルト値 説明
Pe (0,0,0) D3DVECTOR カメラ空間でのカメラの位置座標。
Po N/A D3DVECTOR カメラ空間における現在のモデル原点 (0,0,0,1) の位置。これは Mw*Mv 行列の 4 行目である。
Mw N/A D3DMATRIX D3DTRANSFORMSTATE_VIEW によって設定されるワールド行列。
Mv N/A D3DMATRIX D3DTRANSFORMSTATE_VIEW によって設定されるビュー行列。
Mwv N/A D3DMATRIX Mw*Mv。
Halfway N/A D3DVECTOR 正規化されたベクトル。スペキュラ反射を計算するために使用される。
La (0.0, 0.0, 0.0, 0.0) D3DCOLORVALUE ライト ステートのアンビエント色。D3DRENDERSTATE_AMBIENT によって設定される。
V N/A D3DVECTOR カメラ空間での頂点の位置座標。
N N/A D3DVECTOR カメラ空間での正規化された頂点の法線。
Vcd N/A D3DCOLORVALUE 頂点のディフューズ色。
Vcs N/A D3DCOLORVALUE 頂点のスペキュラ色。

次の表は、マテリアル パラメータを示している。

パラメータ デフォルト値 説明
Ma (0.0, 0.0, 0.0, 0.0) D3DCOLORVALUE アンビエント色。
Md (255, 255, 255, 255) D3DCOLORVALUE ディフューズ色。
Ms (0.0, 0.0, 0.0, 0.0) D3DCOLORVALUE スペキュラ色。
Me (0.0, 0.0, 0.0, 0.0) D3DCOLORVALUE エミッション色。
Mp 0.0 D3DVALUE スペキュラ指数。範囲 : (-∞,+∞)

次の表は、光源 i パラメータを示している。

パラメータ デフォルト値 説明
LpI (0.0, 0.0, 0.0) D3DVECTOR カメラ空間での位置座標。
LdI (0.0, 0.0, 1.0) D3DVECTOR カメラ空間でのライトへの方向。
LrI 0.0 D3DVALUE 距離の範囲。範囲 : [0.0, D3DLIGHT_RANGE_MAX]。
LcaI (0.0, 0.0, 0.0, 0.0) D3DCOLORVALUE アンビエント色。
LcsI (0.0, 0.0, 0.0, 0.0) D3DCOLORVALUE スペキュラ色。
LcI (1.0, 1.0, 1.0, 0.0) D3DCOLORVALUE ディフューズ色。
att0I 0.0 D3DVALUE 固定減衰係数。範囲 : (0, +∞)
att1I 0.0 D3DVALUE 線形減衰係数。範囲 : (0, +∞)
att2I 0.0 D3DVALUE 2 次減衰係数。範囲 : (0, +∞)
falloffI 0.0 D3DVALUE フォールオフ係数。範囲 : (-∞, +∞)
thetaI 0.0 D3DVALUE スポットライトの本影角度 (ラジアン単位)。範囲 : [0, π)
phiI 0.0 D3DVALUE スポットライトの半影角度 (ラジアン単位)。範囲 : [thetaI, π)。