Microsoft DirectX 8.0 (C++)

ライト プロパティの設定

C++ アプリケーションでライト プロパティを設定するには、D3DLIGHT8 構造体を用意し、次に IDirect3DDevice8::SetLight メソッドを呼び出す。SetLight メソッドは、デバイスがライト プロパティ セットをデバイス内部のライト プロパティのリストに配置する際のインデックスと、そのライト プロパティを定義する D3DLIGHT8 構造体のアドレスを受け取る。ライト プロパティの更新が必要なときは、新しい情報で SetLight を呼び出すことができる。

プロパティを割り当てられていないインデックスで SetLight メソッドを呼び出すたびに、システムはライト プロパティ セットを格納するためのメモリを割り当てる。アプリケーションでは、割り当てられているライトのサブセットを一度に有効にして、数多くのライトを設定できる。デバイスがサポートするアクティブなライトの最大数を決定するためにデバイス能力を取得するときは、D3DCAPS8 構造体の MaxActiveLights メンバをチェックする。ライトを使用する必要がなくなった場合は、そのライトを無効にするか、新しいライト プロパティ セットで上書きすることができる。

次の C++ のサンプル コードは、距離の増加によって減衰しない、白色のポイント ライトのプロパティを準備および設定する。

/*
* このコードでは、変数 g_pd3dDev は、IDirect3DDevice8 インターフェイスへの
* 有効なポインタであると仮定している。
 */
D3DLIGHT8 d3dLight;
HRESULT   hr;

// 構造体を初期化する。
ZeroMemory(&d3dLight, sizeof(D3DLIGHT8));

// 白色のポイント ライトの設定を行う。
d3dLight.Type = D3DLIGHT_POINT;
d3dLight.Diffuse.r  = 1.0f;
d3dLight.Diffuse.g  = 1.0f;
d3dLight.Diffuse.b  = 1.0f;
d3dLight.Ambient.r  = 1.0f;
d3dLight.Ambient.g  = 1.0f;
d3dLight.Ambient.b  = 1.0f;
d3dLight.Specular.r = 1.0f;
d3dLight.Specular.g = 1.0f;
d3dLight.Specular.b = 1.0f;

// ポイント ライトをシーンの上部でビューアの背後に配置する。
// これらの座標はワールド空間のものである。
// ユーザーはワールド空間内のどの位置座標にでも存在できる。 
// このコードでは、
// ユーザーはワールド空間の原点にいると仮定している。
d3dLight.Position.x = 0.0f;
d3dLight.Position.y = 1000.0f;
d3dLight.Position.z = -100.0f;

// 減衰させない。
d3dLight.Attenuation0 = 1.0f; 
d3dLight.dvRange      = 1000.0f;

// 最初のライトのプロパティ情報を設定する。
hr = d3dDevice->SetLight(0, &d3dLight);
if (FAILED(hr))
{
    // エラー処理コード。
}

ライト プロパティ セットは、再度 SetLight を呼び出していつでも更新できる。更新するライト プロパティ セットのインデックスと、新しいプロパティを含む D3DLIGHT8 構造体のアドレスを指定するだけである。

  ライト プロパティ セットをデバイスに割り当てても、追加されるプロパティを持つ光源が有効になるわけではない。光源を有効にするには、デバイスに対して IDirect3DDevice8::LightEnable メソッドを呼び出す。