Microsoft DirectX 8.0 (C++) |
Microsoft® Direct3D® で使用できるライトには、ポイント ライト、ディレクショナル ライト、およびスポットライトの 3 種類がある。サンプル コードでは、光が 1 方向に進むディレクショナル ライトを作成し、ライトの方向を変化させている。
次のサンプル コードでは、D3DLIGHT8 構造体を使って、ディレクショナル ライトを作成する。
D3DXVECTOR3 vecDir; D3DLIGHT8 light; ZeroMemory( &light, sizeof(D3DLIGHT8) ); light.Type = D3DLIGHT_DIRECTIONAL;
次のサンプル コードでは、このライトのディフューズ色を白に設定している。
light.Diffuse.r = 1.0f; light.Diffuse.g = 1.0f; light.Diffuse.b = 1.0f;
次のサンプル コードでは、ライトの方向を円弧で回転させている。
vecDir = D3DXVECTOR3(cosf(timeGetTime()/360.0f), 0.0f, sinf(timeGetTime()/360.0f) ); D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );
D3DXVec3Normalize の呼び出しによって、ライトの方向を決定するための方向ベクトルを正規化する。
範囲を指定して、ライトのエフェクトが届く範囲を Direct3D に指示できる。このメンバは、ディレクショナル ライトには影響しない。次のサンプル コードでは、このライトに 1000 単位の範囲を割り当てている。
light.Range = 1000.0f;
次のサンプル コードでは、IDirect3DDevice8::SetLight を呼び出して、Direct3D デバイスにライトを割り当てている。
g_pd3dDevice->SetLight( 0, &light );
SetLight が受け取る最初のパラメータは、このライトが割り当てられるインデックスである。ライトが既にその位置に存在する場合、新しいライトによって上書きされることに注意すること。2 番目のパラメータは、ライトを定義する light 構造体へのポインタである。Lights サンプル プロジェクトでは、このライトをインデックス 0 に配置する。
次のサンプル コードでは、IDirect3DDevice8::LightEnable を呼び出してライトを有効にしている。
g_pd3dDevice->LightEnable( 0, TRUE);
LightEnable が受け取る最初のパラメータは、有効にするライトのインデックスである。2 番目のパラメータは、ライトをオンにする (TRUE) か、オフにする (FALSE) かを指定するブール値である。上記のサンプル コードでは、インデックス 0 にあるライトがオンになっている。
次のサンプル コードでは、IDirect3DDevice8::SetRenderState を呼び出して、ライトをレンダリングするように Direct3D に指示している。
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
SetRenderState が受け取る最初の 2 つのパラメータは、変更するデバイス ステート変数と、その変数に設定する値である。このサンプル コードでは、D3DRS_LIGHTING デバイス変数を TRUE に設定している。これは、ライトのレンダリングを有効にする効果がある。
このサンプル コードの最後のステップは、もう一度 SetRenderState を呼び出して、アンビエント ライトをオンにすることである。
g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00202020 );
上記のサンプル コードでは、D3DRS_AMBIENT デバイス変数をライト グレー (0x00202020) に設定している。アンビエント ライトは、すべてのオブジェクトを指定された色でライトアップする。
ライティングの詳細については、「Direct3D のライティングにおける数学的計算」を参照すること。
このチュートリアルでは、ライトとマテリアルの使い方を示した。「チュートリアル 5 : テクスチャ マップの使い方」では、サーフェスにテクスチャを追加する方法を示す。