前回はマテリアルを説明しました。今回はライトを説明します。 マテリアルは光の反射・発光で使った光の係数を扱うのに対して、ライトは光の強さを扱います。
typedef struct _D3DLIGHT9 {
D3DLIGHTTYPE Type; //光源の種類
D3DCOLORVALUE Diffuse; //拡散反射の強さ
D3DCOLORVALUE Specular; //鏡面反射の強さ
D3DCOLORVALUE Ambient; //環境光の強さ
D3DVECTOR Position; //光源の位置
D3DVECTOR Direction; //光源の方向
float Range; //光源の有効範囲
float Falloff; //影響範囲の境界で輝度が激減します。通常は1.0fです。
float Attenuation0; //距離によって、一定に光の強度が減少します。
float Attenuation1; //距離によって、一次関数的に光の強度が減少します。
float Attenuation2; //距離によって、二次関数的に光の強度が減少します。
float Theta; //内部スポットライトの角度
float Phi; //外部スポットライトの角度
} D3DLIGHT9;
光源の種類は以下の3タイプがあります。
平行光源は一定の角度で平行な光が放たれます。 主に太陽を表現したりするときに使います。
構造体のtypeメンバー変数にD3DLIGHT_DIRECTIONALを指定することで使用できます。
(完全な余談ですが、太陽も球なのになんで点光源を使わないの?と思った方がいると思いますが、太陽はあまりにも地球から離れているのでとてつもなく離れた所に点光源をおくより、単に平行光源を使ってしまったほうがはるかに楽だからです)
点光源は球上に放たれる光です。 ライトを表現するときに使います。
構造体のtypeメンバー変数にD3DLIGHT_POINTで設定することで使用できます。
スポットライトは影響範囲が円錐上に放たれる光です。 懐中電灯とかを表現するときに使います。
スポットライトは内部コーンと外部コーンに分かれていて、内部コーンだと強い光が、外部コーンだと弱い光が表現されます。
また、フォールオフといった表現があり、これらコーンの境界値でどのように光が影響するかを設定します。
普通は1.0です。
構造体のメンバー変数のtypeにD3DLIGHT_SPOTを指定することで使用できます。
D3DLIGHT9 l; ZeroMemory( &g_Light, sizeof(g_Light)); l.Type = D3DLIGHT_DIRECTIONAL; //平行投影 l.Direction = D3DXVECTOR3( 0, 0, 1 ); l.Diffuse.r = 1.0f; l.Diffuse.g = 1.0f; l.Diffuse.b = 1.0f; l.Ambient.r = 0.2f; l.Ambient.g = 0.2f; l.Ambient.b = 0.2f; デバイスのポインタ->SetRenderState( D3DRS_LIGHTING, TRUE ); デバイスのポインタ->SetLight( 0, &l ); デバイスのポインタ->LightEnable( 0, TRUE );
今回サンプルを用意しました。
MaterialLight.zip
今回のサンプルはBOXにライトとマテリアルを適用した例です。
本当は球でやりたかったでしたが、球だとポリゴン数が多くなりそうで;
閉まっています
[携帯電話用]