ライトとマテリアル (Direct3D 9)
ライトは、シーンのオブジェクトを照らすために使用します。ライティングが有効になっている場合、Direct3D では各オブジェクトの頂点の色を次の組み合わせに基づいて計算します。
- 現在のマテリアル色と、関連付けられたテクスチャー マップのテクセル
- 頂点の拡散色と反射色 (指定されている場合)
- シーンの光源によって生成されるライティングの色と強度や、シーンの環境光レベル
Direct3D のライティングとマテリアルを使用する際は、Direct3D で照明の詳細を制御できます。経験を積んだユーザーであれば、必要に応じて独自のライティングを実行できます。
ライティングとマテリアルの処理方法によって、レンダリングしたシーンの表示は大きく異なります。マテリアルは、サーフェスからの反射光の状態を定義します。直接光レベルと環境光レベルは、反射される光を定義します。ライティングが有効な場合は、マテリアルを使用してシーンをレンダリングする必要があります。ライティングはシーンのレンダリングにおいて必須ではありませんが、ライティングしなければレンダリングしたシーンの細部が見えません。ライティングしないシーンをレンダリングしても、シーンのオブジェクトのシルエットが表示される程度となります。これでは、ほとんどの用途で細部が十分に表示されません。
直接光と環境光の比較
直接光と環境光はともにシーン内のオブジェクトを照らしますが、互いに影響し合うことはなく、それぞれの効果は大きく異なり、操作方法もまったく異なります。
直接光は、文字通り直接的です。直接光には必ず方向と色があり、グーロー シェーディングなどのシェーディング アルゴリズムの係数として使用されます。ライティングの種類が異なれば、直接光の放射も異なり、それぞれ特別な減衰効果が生まれます。直接光のライティング パラメーターのセットは、IDirect3DDevice9::SetLight メソッドを呼び出して作成します。
環境光は、シーン内のどの位置にも効果を及ぼします。環境光は、オブジェクトやそのオブジェクトのシーン内の位置にかかわらず、シーン全体を同じ強度の光で照らすライティングと考えることができます。環境光には色と強度はありますが、位置や方向はありません。各ライトはシーン内の全体的な環境光に加わります。環境光レベルを設定するには、IDirect3DDevice9::SetRenderState メソッドを呼び出し、D3DRS_AMBIENT を State パラメーターに指定し、目的の RGBA 色を Value パラメーターに指定します。
環境光の色は、RGBA 値の形をとり、各成分は 0 ~ 255 の整数値となります。これは、Direct3D のほとんどのカラー値とは異なります。
RGBA 値は、D3DCOLOR_RGBA マクロを使用して生成できます。赤、緑、および青の成分を組み合わせて、環境光の最終的な色を作成します。アルファ成分は色の透明度を制御します。ハードウェア アクセラレーションまたは RGB エミュレーションを使用するときは、アルファ成分は無視されます。
Direct3D のライティング モデルと自然光の比較
自然界では、光源から放射された光は、何千や何百万ではないにしても、何百もの物体に反射した末に私たちの目に届きます。光は反射するたびに、一部が物体の表面に吸収されたり、周囲に拡散したりして、残りが他の表面や私たちの目に達します。この過程は、光が減衰して消えてなくなるか、または私たちが光が届いたことを知覚するまで繰り返されます。
自然光の動きを完全にシミュレートする計算にはあまりにも膨大な時間がかかるため、リアルタイム 3D グラフィックスで使用できないことは明白です。そこで、速度を考慮して、Direct3D のライティング モデルでは自然光の動きを大まかにシミュレートします。Direct3D では、赤、緑、および青の成分に換算して光を記述し、この成分を組み合わせて最終的な色を作成します。
Direct3D では、光がサーフェスに反射したとき、光の色とサーフェス自体を数学的に処理することで、最終的に画面に表示される色を作成します。Direct3D で使用するアルゴリズムの詳細については、「ライティングの計算 (Direct3D 9)」を参照してください。
Direct3D のライティング モデルでは光を 2 つのタイプに一般化しています。1 つは環境光で、もう 1 つは直接光です。それぞれ互いに異なる属性を持ち、サーフェスのマテリアルとの相互作用も異なります。環境光とは、あまりにも分散していて、方向も光源もはっきりとしない光です。つまり、低い強度で、あらゆる場所に満ちています。カメラマンが使う間接照明が、環境光の良い例です。Direct3D の環境光には、自然光と同様、実際の方向や光源はなく、色と強度のみがあります。実際、環境光のレベルは、シーン内で光を発するオブジェクトとはまったく関係しません。環境光は鏡面反射を起こしません。
直接光は、シーン内の光源が生成する光です。必ず色と強度があり、特定の方向に進みます。直接光はサーフェスのマテリアルと相互作用して、反射によるハイライトを生みます。直接光の方向はグーロー シェーディングなどのシェーディング アルゴリズムで係数として使用されます。直接光が反射する際は、シーンの環境光レベルに影響を与えません。シーン内で直接光を発する光源にはさまざまな特性があり、それに応じてシーンの照らし方が異なります。
さらに、ポリゴンのマテリアルには、ポリゴンが受けた光をどのように反射するかに影響を与えるプロパティがあります。マテリアルがどのように環境光を反射するかを示す反射特性を 1 つ設定し、マテリアルの鏡面反射率および拡散反射率を決める個々の特性を設定します。詳細については、「マテリアル (Direct3D 9)」を参照してください。
ライティングとマテリアルのカラー値
Direct3D では、赤、緑、青、およびアルファの 4 つの成分に換算して色を記述し、この成分を組み合わせて最終的な色を作成します。C++ の D3DCOLORVALUE 構造体は、これらの各成分の値を格納するように定義されています。各メンバーは、通常 0.0 と 1.0 を含む 0.0 ~ 1.0 の範囲の浮動小数点値です。ライティングとマテリアルでは、共に同じ構造体を使用して色を記述しますが、構造体内で使用する値はそれぞれ少しずつ異なります。
光源のカラー値は、光源が発する特定の光の成分の量を表します。ライティングではアルファ成分は使用しないため、関連するのは色の赤、緑、および青の成分のみです。これらの 3 つの成分は、プロジェクション テレビの赤色、緑色、および青色のレンズにたとえることができます。各レンズはオフにしたり (対応するメンバーの値を 0.0 に設定)、できるだけ明るくしたり (1.0 の値を設定)、その中間のレベルを設定したりすることができます。最終的なライティングの色は、各レンズからの色を組み合わせて作成されます。R(1.0)、 G(1.0)、B(1.0) のような組み合わせでは白色光になり、R(0.0)、G(0.0)、B(0.0) では光がまったく放射されません。カラー成分を 1 つだけ放射するライティングを作成して、純粋な赤色、緑色、または青色のライティングを作ることができます。また、カラー成分を組み合わせて、黄色や紫色などの色を放射するライティングを作成することもできます。カラー成分の値を負に設定して、シーンから光を取り除く "暗色光" も作成できます。また、成分に 1.0 より大きな値を設定して、きわめて明るいライティングを作成することもできます。
一方、マテリアルの場合、カラー値はそのマテリアルでレンダリングされるサーフェスがどのくらい光の成分を反射するかを表します。マテリアルのカラー成分が R(1.0)、G(1.0)、B(1.0)、A(1.0) の場合、そのマテリアルはすべての光を反射します。同様に、マテリアルのカラー成分が R(0.0)、G(1.0)、B(0.0)、A(1.0) の場合、そのマテリアルに当たる緑色の光をすべて反射します。マテリアルには、複数の反射率値があり、さまざまな効果を作成できます。
追加情報については、「ライトの種類 (Direct3D 9)」および「ライト プロパティ (Direct3D 9)」を参照してください。