アンビエント ライト

アンビエント ライト

アンビエント ライトは、シーンに均一なライティングをもたらす。アンビエント ライトは、頂点法線、ライトの方向、ライトの位置座標、範囲、減衰などのライティング要因に依存しないため、オブジェクトのすべての頂点を同様に照らす。最速のライティングであるが、得られる結果のリアリティは最も低い。Microsoft® Direct3D® には、ライトを作成しなくても使用できるグローバル アンビエント ライト属性が 1 つだけある。代わりに、ライト オブジェクトの設定によってアンビエント ライトを実現することもできる。シーンのアンビエント ライトは、次の方程式で表される。

Ambient Lighting = Ca*[Ga + sum(Lai*Atteni*Spoti)]

各パラメータについて次の表に示す。

パラメータ デフォルト値 説明
Ca (0,0,0,0) D3DCOLORVALUE マテリアルのアンビエント色。
Ga (0,0,0,0) D3DCOLORVALUE グローバルなアンビエント色。
sum N/A N/A ライト オブジェクトのアンビエント ライトの合計。
Lai (0,0,0,0) D3DVECTOR i 番目のライトのアンビエント色。
Atteni (0,0,0,0) D3DCOLORVALUE i 番目のライトの減衰「減衰とスポットライト係数」を参照すること。
Spoti (0,0,0,0) D3DVECTOR i 番目のライトのスポットライト係数「減衰とスポットライト係数」を参照すること。

Ca の値は次のいずれかである。

  • 頂点色 1 (AMBIENTMATERIALSOURCE = D3DMCS_COLOR1 で、頂点の宣言で最初の頂点色を指定した場合)
  • 頂点色 2 (AMBIENTMATERIALSOURCE = D3DMCS_COLOR2 で、頂点の宣言で 2 番目の頂点色を指定した場合)
  • マテリアルのアンビエント色

  いずれかの AMBIENTMATERIALSOURCE オプションが使われていて、頂点色が指定されていない場合は、マテリアルのアンビエント色を使う。

マテリアルのアンビエント色を使うには、次のサンプル コードに示すように SetMaterial を使う。

Ga はグローバルなアンビエント色である。これは、SetRenderState(D3DRENDERSTATE_AMBIENT) を使って設定する。Direct3D シーンには、グローバルなアンビエント色が 1 つある。このパラメータと Direct3D のライト オブジェクトは関連していない。

Lai は、シーン内の i 番目のライトのアンビエント色である。Direct3D の各ライトは一連のプロパティを持ち、その中の 1 つがアンビエント色である。sum(Lai) の項は、シーン内のすべてのアンビエント色の合計である。

この例では、シーンのアンビエント ライトおよびマテリアルのアンビエント ライトを使ってオブジェクトに色を付けている。コードを次に示す。

#define GRAY_COLOR			0x00bfbfbf

// create material
D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl;, sizeof(mtrl) );
mtrl.Ambient.r = 0.75f;
mtrl.Ambient.g = 0.0f;
mtrl.Ambient.b = 0.0f;
mtrl.Ambient.a = 0.0f;
m_pd3dDevice->SetMaterial( &mtrl; );
m_pd3dDevice->SetRenderState( D3DRS_AMBIENT, GRAY_COLOR);

方程式に従うと、オブジェクト頂点の色は、マテリアル色とライティング色を組み合わせた色になる。

これらの 2 つのイメージが示すように、マテリアルの色はグレー、ライトの色は明るい赤である。

グレーの球 赤い球

この結果、次に示すようなシーンになる。シーン内の唯一のオブジェクトは球である。アンビエント ライトは、オブジェクトのすべての頂点を同じ色で照らす。頂点法線やライトの方向には依存しない。結果的に、球体は 2D の円のように見える。 これは、オブジェクトのサーフェイスにシェーディングの違いが生じないためである。

アンビエント ライトを設定した球

オブジェクトをよりリアルに見せるには、アンビエント ライトに加えてディフューズ ライトやスペキュラ ライトを適用する。