ライトの種類 (Direct3D 9)
ライトの種類のプロパティでは、使用する光源の種類を定義します。C++ では、ライトの種類は、ライトの D3DLIGHT9 構造体の Type メンバーにおける D3DLIGHTTYPE 列挙の値を使用して設定します。Direct3D には、ポイント ライト、スポットライト、および指向性ライトの 3 種類のライトがあります。ライトの種類ごとに、シーン内のオブジェクトの照らし方が異なり、計算におけるオーバーヘッドのレベルも異なります。
ポイント ライト
ポイント ライトには、シーン内での色と位置がありますが、単一の方向はありません。次の図に示すように、ポイント ライトはすべての方向に均等に光を放ちます。
ポイント ライトの例としては電球があります。ポイント ライトは減衰と範囲の影響を受け、頂点単位でメッシュを照らします。ライティングの実行中、Direct3D は、ワールド空間でのポイント ライトの位置とライティングする頂点の座標を使用して、ライトの方向を表すベクトルと光が進んだ距離を導きます。頂点法線に加え、このベクトルと距離の両方を使用して、サーフェスにどのくらい光が当っているかを計算します。
指向性ライト
指向性ライトには、色と方向はありますが、位置はありません。指向性ライトは平行な光を放射します。つまり、指向性ライトで生成された光はすべてシーン内を同じ方向に進みます。指向性ライトは、太陽のように、遠く離れた光源に例えることができます。指向性ライトは減衰または範囲の影響を受けないので、Direct3D では指定された方向と色のみ考慮して、頂点の色を計算します。照明の係数の個数が少ないため、指向性ライトはコンピューターへの負荷が最も軽いライトです。
スポットライト
スポットライトには、色、位置、および光を放射する方向があります。スポットライトから放射される光は、明るい内部コーンとこれより大きな外部コーンで構成されます。次の図に示すように、光の強度は 2 つのコーン間で減少していきます。
スポットライトは、減衰と範囲の影響を受けます。これらの要因は、光が各頂点まで進む距離と同様、シーン内のオブジェクトへのライティング効果を計算するときに考慮に入れられます。各頂点に対するこれらの効果を計算するので、Direct3D のすべてのライトの中で計算に最も時間がかかるのはスポットライトです。
C++ の D3DLIGHT9 構造体には、スポットライトでのみ使用される 3 つのメンバーが含まれています。これらのメンバー、Falloff、Theta、および Phi は、スポットライト オブジェクトの内部コーンと外部コーンの大きさを制御し、両方のコーンの間でライトがどのように減少するかを制御します。
Theta 値はスポットライトの内部コーンのラジアン角度を表し、Phi 値は外部コーンのラジアン角度を表します。Falloff 値は、内部コーンの外側の端と外部コーンの内側の端との間で、ライトの強度がどのように減少するかを制御します。ほとんどのアプリケーションでは、Falloff を 1.0 に設定して 2 つのコーン間で減衰が一様に生じるようにしますが、必要に応じてこれ以外の値を設定することもできます。
次の図は、これらのメンバーの値の間の関係と、これらの値がスポットライトの光の内部コーンと外部コーンに与える影響を示しています。
スポットライトは、明るい内部コーンおよび外部コーンの 2 つの部分を持つ光のコーンを放射します。ライトは内部コーンの内側が最も明るく、外部コーンの外側には存在しません。ライティングの強度は、この 2 つの領域の間で弱まります。このようにライトが弱まることを、一般に減衰と呼びます。
頂点が受ける光の量は、内部コーン内または外部コーン内での頂点の位置によって決まります。Direct3D では、スポットライトの方向ベクトル (L) と、ライトから頂点へのベクトル (D) の内積を計算します。この値は、2 つのベクトルの間の角度の余弦に等しく、ライティングのコーン角度と比較できる頂点位置を示すので、内部コーンまたは外部コーンのどちらに頂点があるかを判断できます。次の図は、これら 2 つのベクトルの間の関係を示しています。
システムは、この値をスポットライトの内部および外部コーンの角度の余弦と比較します。スポットライトの D3DLIGHT9 構造体で Theta および Phi メンバーは、内部および外部コーンのコーン角度の合計を表します。減衰は、全コーン角度にわたってではなく、ライティングの中心から頂点が離れることによって生じるため、ランタイムではコーン角度を半分に割ってから余弦を計算します。
ベクトル L と D の内積が外部コーンの角度の余弦以下の場合、頂点は外部コーンの外側に存在し、光が当たりません。L と D の内積が内部コーン角度の余弦より大きい場合、頂点は内部コーンの内側に存在し、最大量のライティングで照らされます (ただし、距離の増加による減衰を考慮します)。頂点が 2 つの領域の間にある場合、次の公式を使用して減衰を計算します。
この場合
- If は減衰後の光の強度
- アルファはベクトル L と D がなす角度
- シータは内部コーンの角度
- ファイは外部コーンの角度
- p は減衰
この式では、頂点のライティングの強度を増減して減衰を示す、0.0 ~ 1.0 の値を求めます。ライティングから頂点までの距離の係数として減衰も適用されます。次の図は、Falloff 値によって減衰カーブがどのように異なるかを示しています。
falloff 値が変化しても実際のライティングに与える影響はわずかであり、falloff 値が 1.0 以外の場合でも形成される減衰カーブには若干のパフォーマンス ペナルティが生じるのみです。これらの理由により、通常、この値は 1.0 に設定されます。