ディフューズ ライト

ディフューズ ライト

すべての減衰エフェクトでライティング強度を調整した後、ライティング エンジンは頂点法線と入射光の方向の角度を仮定して、頂点から反射する残光の量を計算する。ディレクショナル ライトではこの手順は実行されない。距離が増加しても光が減衰しないためである。ディフューズとスペキュラの 2 種類の反射を考慮し、異なる公式を使って各ライティングで反射する光の量を決定する。反射するライティングの量を計算した後、Microsoft® Direct3D® はこれらの新しい値を、現在のマテリアルのディフューズ反射率プロパティとスペキュラ反射率プロパティに適用する。この結果として生じる色値は、グーロー シェーディングとスペキュラ ハイライト生成のためにラスタライザが使うディフューズ成分とスペキュラ成分である。

ディフューズ ライトは、次の方程式で表される。

Diffuse Lighting = sum[Cd*Ld*(N.Ldir)*Atten*Spot]
パラメータ デフォルト値 説明
sum N/A N/A 各ライトのディフューズ成分の合計。
Cd (0,0,0,0) D3DCOLORVALUE ディフューズ色。
Ld (0,0,0,0) D3DCOLORVALUE ライトのディフューズ色。
N N/A D3DVECTOR 頂点法線。
Ldir N/A D3DVECTOR オブジェクトの頂点からライトへの方向ベクトル。
Atten N/A FLOAT ライトの減衰。「減衰とスポットライト係数」を参照すること。
Spot N/A FLOAT スポットライト係数。「減衰とスポットライト係数」を参照すること。

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

  • 頂点色 1 (DIFFUSEMATERIALSOURCE = D3DMCS_COLOR1 で、頂点の宣言で最初の頂点色を指定した場合)
  • 頂点色 2 (DIFFUSEMATERIALSOURCE = D3DMCS_COLOR2 で、頂点の宣言で 2 番目の頂点色を指定した場合)
  • マテリアルのディフューズ色

   いずれかの DIFFUSEMATERIALSOURCE オプションを使い、頂点色を指定しないと、マテリアルのディフューズ色が使われる。

減衰 (Atten) またはスポットライト特性 (Spot) の計算方法については、「減衰とスポットライト係数」を参照すること。

すべてのライトが処理され、個別に補間された後、ディフューズ成分は 0 ~ 255 にクランプされる。その結果得られるディフューズ ライト値は、アンビエント ライト、ディフューズ ライト、エミッション ライトの値の組み合わせである。

この例では、ライトのディフューズ色とマテリアルのディフューズ色を使って、オブジェクトに色を付ける。コードを次に示す。

D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl;, sizeof(mtrl) );

D3DLIGHT9 light;
ZeroMemory( &light;, sizeof(light) );
light.Type = D3DLIGHT_DIRECTIONAL;

D3DXVECTOR3 vecDir;
vecDir = D3DXVECTOR3(0.5f, 0.0f, -0.5f);
D3DXVec3Normalize( (D3DXVECTOR3*)&light;.Direction, &vecDir; );

// set directional light diffuse color
light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;
light.Diffuse.a = 1.0f;
m_pd3dDevice->SetLight( 0, &light; );
m_pd3dDevice->LightEnable( 0, TRUE );

// if a material is used, SetRenderState must be used
// vertex color = light diffuse color * material diffuse color
mtrl.Diffuse.r = 0.75f;
mtrl.Diffuse.g = 0.0f;
mtrl.Diffuse.b = 0.0f;
mtrl.Diffuse.a = 0.0f;
m_pd3dDevice->SetMaterial( &mtrl; );
m_pd3dDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);

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

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

グレーの球 赤い球

この結果、次に示すようなシーンになる。シーン内のオブジェクトは 1 つの球体だけである。ディフューズ ライトの計算では、マテリアルとライトのディフューズ色を受け取り、ライトの方向と頂点法線との角度から内積を使ってそれを修正する。その結果、球の裏側はサーフェイスがライトから逸れて曲がっていくに従って暗くなる。

ディフューズ ライトのみ

ディフューズ ライトを前の例のアンビエント ライトと組み合わせることにより、オブジェクトのサーフェイス全体に陰影が付けられる。アンビエント ライトはサーフェイス全体に色を付け、ディフューズ ライトによって陰影が付き、オブジェクトの 3D 形状が明らかになる。

ディフューズ ライトを設定した球

ディフューズ ライトは、アンビエント ライトよりコンピュータへの負荷が重い。頂点法線とライトの方向に依存するので、アンビエント ライトよりリアルなライティングが得られ、オブジェクトのジオメトリを 3D 空間で表現できる。スペキュラ ハイライトを使えば、さらにリアルな外観を実現できる。