ライトの種類 (Direct3D 9)

光源の種類プロパティは、使う光源の種類を定義します。 ライト型は、ライトの D3DLIGHT9 構造体の Type メンバーの D3DLIGHTTYPE C++ 列挙の値を使用して設定されます。 Direct3D には 3 種類の光源 (ポイント ライト、スポットライト、指向性ライト) があります。 シーン内のオブジェクトを照らす方法は種類ごとに異なっており、計算オーバーヘッドのレベルも異なります。

ポイント ライト

ポイント ライトには、シーン内の色と位置がありますが、単一の方向はありません。 次の図に示すように、あらゆる方向に光を均等に放射します。

ポイント ライトの図

ライト バルブは、ポイント ライトの良い例です。 ポイント ライトは、減衰と範囲の影響を受け、頂点単位でメッシュを照らします。 照射時、Direct3D はワールド空間におけるポイント ライトの位置と照射する頂点の座標を使って、光の方向に関するベクトルと光が移動する距離を引き出します。 頂点法線と共に両方の値を使って、サーフェスの照射に対する光の貢献度を計算します。

指向性ライト

指向性ライトには位置がなく、色と方向のみです。 平行光を放射します。 つまり指向性ライトにより生成されるすべての光は、シーン内を同じ方向に移動します。 指向性ライトがほぼ無限の距離にある光源 (太陽など) であるとします。 指向性ライトは、減衰または範囲の影響を受けないため、Direct3D が頂点の色を計算する際に考慮される要素は指定した方向と色だけです。 照明要素の数が少ないため、使用時に最も計算の少ないライトです。

スポットライト

スポットライトには、色、位置、光を放射する方向があります。 次の図に示すように、スポットライトから放射される光は明るい内部コーンと大きい外部コーンで構成されており、2 つのコーンの間で光の強さは弱くなっていきます。

内部コーンと外部コーンを持つスポットライトの図

スポットライトは、フォールオフ、減衰、範囲の影響を受けます。 これらの要素と各頂点まで光が移動する距離は、シーン内のオブジェクトに対する照明効果を計算するときに計算されます。 各頂点に対するこれらの効果を計算するため、スポットライトは Direct3D におけるすべての光源の中で最も計算に時間がかかるライトです。

D3DLIGHT9 C++ 構造体には、スポットライトでのみ使用される 3 つのメンバーが含まれています。 これらのメンバー (Falloff、Theta、Phi) は、スポットライト オブジェクトの内部コーンと外側コーンの大きさと小ささ、およびそれらの間の光の減少を制御します。

Theta 値はスポットライトの内円錐のラジアン角度であり、Phi 値は光の外側の円錐の角度です。 フォールオフ値は、内側の円錐の外側の端と外側の円錐の内側の端との間の光強度の低下を制御します。 ほとんどのアプリケーションは、フォールオフを 1.0 に設定し、2 つのコーンの間で均等に発生するフォールオフを作り出しますが、必要に応じて他の値に設定できます。

次の図は、これらのメンバーの値の関係と、それらがスポットライトの光の内側と外側の円錐に与える影響を示しています。

フィー値とシータ値のスポットライト コーンとの関連性を示す図

スポットライトは、明るい内部コーンと外部コーンの 2 つの部分を持つ光のコーンを放射します。 光は、内部コーンで最も明るく、外部コーンの外側には存在しません。光の強さは 2 つの領域間で減衰します。 この種類の減衰は一般的にフォールオフと呼ばれています。

頂点に届く光の量は、内部コーンまたは外部コーンにおける頂点の位置に基づいて決まります。 Direct3D は、スポットライトの方向ベクトル (L) と光源から頂点へのベクトル (D) のドット積を計算します。 この値は、2 つのベクトル間の角度のコサインに等しく、頂点の位置のインジケーターとして機能します。頂点の位置を光のコーン角度と比較することで、頂点が内部コーンまたは外部コーンのどこに位置するかを判断できます。 次の図は、これらの 2 つのベクトルの関連性を視覚的に表現しています。

スポットライトの方向ベクトルと頂点からスポットライトへのベクトル

システムは、この値をスポットライトの内部コーン角度および外部コーン角度のコサインと比較します。 ライトの D3DLIGHT9 構造では、Theta メンバーと Phi メンバーは、内部コーンと外側コーンの合計コーン角度を表します。 頂点が照明の中心から離れると (合計コーン角度を通過するのではなく) 減衰が発生するため、ランタイムはコサインの計算前にこれらのコーン角度を二等分します。

ベクトル L および D のドット積が外部コーン角度のコサイン以下の場合、頂点は外部コーンの外側に位置するため、光は届きません。 L および D のドット積が内部コーン角度のコサインより大きい場合、頂点は内部コーン内にあるため最大量の光が届きますが、この場合も距離に応じて減衰が考慮されます。 頂点が 2 つの領域間にある場合、次の等式を使ってフォールオフが計算されます。

頂点における光の強さの数式 (フォールオフ後)

この場合、

  • I f はフォールオフ後の明るい強度です
  • アルファはベクトル L および D 間の角度
  • シータは内部コーン角度
  • フィーは外部コーン角度
  • p はフォールオフ

この数式は、フォールオフを計算するために頂点における光の強さをスケーリングする 0.0 ~ 1.0 の値を生成します。 光源からの頂点の距離の要素としての減衰も適用されます。 次のグラフは、フォールオフ値がフォールオフ曲線に与える影響の違いを示しています。

光の強さと光源からの頂点の距離のグラフ

実際の照明に対する各種フォールオフ値の影響はわずかであり、1.0 以外のフォールオフ値によってフォールオフ曲線を形成するとパフォーマンスが少し低下します。 そのため、この値は通常 1.0 に設定されます。

ライトとマテリアル