Platform SDK: DirectX

ライト プロパティの設定

[C++]

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

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

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

    /*
* この例では、g_lpd3dDev 変数は、IDirect3DDevice7 インターフェイスへの
* 有効なポインタである。
     */
    D3DLIGHT7 d3dLight;
    HRESULT   hr;
 
// 構造体を初期化する。
    ZeroMemory(&d3dLight, sizeof(D3DLIGHT7));
 
// 白色のポイント ライトの設定を行う。
    d3dLight.dltType = D3DLIGHT_POINT;
d3dLight.dcvDiffuse.r = 1.0f;
d3dLight.dcvDiffuse.g = 1.0f;
d3dLight.dcvDiffuse.b = 1.0f;
d3dLight.dcvAmbient.r = 1.0f;
d3dLight.dcvAmbient.g = 1.0f;
d3dLight.dcvAmbient.b = 1.0f;
d3dLight.dcvSpecular.r = 1.0f;
d3dLight.dcvSpecular.g = 1.0f;
d3dLight.dcvSpecular.b = 1.0f;
 
// ポイント ライトをシーンの上部でビューアの背後に配置する。
// (これらの座標はワールド空間のものである。したがって、
//  "ビューア" はワールド空間内のどの位置座標にでも存在できる。
この例では、
//  ビューアはワールド空間の原点にいるとする)。
    d3dLight.dvPosition.x = 0.0f;
    d3dLight.dvPosition.y = 1000.0f;
    d3dLight.dvPosition.z = -100.0f;
 
// 減衰させない。
    d3dLight.dvAttenuation0 = 1.0f; 
    d3dLight.dvRange = D3DLIGHT_RANGE_MAX;

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

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

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

[Visual Basic]

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

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

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

'
' この例では、d3dDevice 変数に Direct3DDevice7 オブジェクトへの
' 有効な参照が格納される。
'
Dim LightDesc As D3DLIGHT7
Dim c As D3DCOLORVALUE
Dim vPos As D3DVECTOR

' すべての放射光色に同じ色設定を使用する。
With c
.r = 1#:.g = 1#:.b = 1#
.a = 1# ' アルファ成分は使用しない。
End With

With vPos
.x = 0:.y = 1000:.z = -100
End With

With LightDesc
.dltType = D3DLIGHT_POINT
.position = vPos
.Ambient = c:.diffuse = c:.specular = c
.attenuation0 = 1# ' 光を減衰させない。
End With

d3dDevice.SetLight 0, LightDesc

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

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