0からのゲームプログラミング > ライト

Back Next
更新日 2004.05.02
ライト

 今回は、ライト(光源)を設定してみましょう。

 ライトを定義するには、D3DLIGHT9 構造体 を使用します。ScreenStage.cpp の CScreenStage::InitRender メンバ関数に以下のコードがありました。


ScreenStage.cpp

// ライトの設定
D3DLIGHT9	light;
::ZeroMemory(&light, sizeof(D3DLIGHT9));
light.Type = D3DLIGHT_DIRECTIONAL;
light.Diffuse.r = 0.9f;   light.Diffuse.g = 0.9f;   light.Diffuse.b = 0.9f;
light.Specular.r = 0.2f;  light.Specular.g = 0.2f;  light.Specular.b = 0.2f;
light.Ambient.r = 0.5f;   light.Ambient.g = 0.5f;   light.Ambient.b = 0.5f;
light.Direction = D3DXVECTOR3(0.0f, -0.5f, -0.2f);
g_pD3DDevice->SetLight(0, &light);
g_pD3DDevice->LightEnable(0, TRUE);


 以上のコードでライトを設定しています。試しに上記のコードをすべてコメントアウトして実行してみると、光が無くなる為に画面が真っ黒になります。


 D3DLIGHT9 構造体 には、メンバが沢山ありますが、初めにすべてのメンバに ZeroMemory 関数で 0 を代入しておきます。これは、メンバの設定し忘れを防ぐ為です。デバッグモードでは、メンバに不正な値が入っていると、うまく実行されないことがあります。


 光源の種類(light.Type)には、ポイント・ライト(点光源)、スポット・ライトディレクショナル・ライト(平行光源)等指定出来ますが、ここでは、D3DLIGHT_DIRECTIONAL(ディレクショナル・ライト)を設定しています。

 D3DLIGHT_DIRECTIONAL(ディレクショナル・ライト)を設定した場合には、光が指す方向(light.Direction)を設定しておきます。例では、真上より少し斜めから光が射す感じです。


 ディフューズ色(light.Diffuse)、スペキュラ色(light.Specular)、アンビエント色(light.Ambient)には、RGBの色成分に 0 〜 1 の間で、適当に値を入れておきます。


 そして、IDirect3DDevice9::SetLight メソッドライトをセットし、IDirect3DDevice9::LightEnable メソッド の第2パラメータに TRUE を指定して、ライトを有効にしておきます。

 それぞれのメソッドの第1パラメータには、ゼロから始まるインデックス(最大数あり)を指定します。これで、一度に複数のライトを設定することが出来ます。(光源の数が増えると、当然計算量も増えますので、処理落ちの原因になることもあります。)


 以下のように、赤成分の割合を大きくすると、夕焼けのシーンを作成することも出来ます。
 

light.Diffuse.r = 0.9f;   light.Diffuse.g = 0.4f;   light.Diffuse.b = 0.4f;
light.Specular.r = 0.2f;  light.Specular.g = 0.1f;  light.Specular.b = 0.1f;
light.Ambient.r = 0.5f;   light.Ambient.g = 0.3f;   light.Ambient.b = 0.3f;


スクリーンショット
夕焼け

【スポンサード リンク】


Back Next

0からのゲームプログラミング > ライト