拡散光 (Direct3D 9)
任意の減衰効果について光の強さを調整した後、照明エンジンは、頂点法線の角度および入射光の方向から、頂点から反射する残りの光量を計算します。 照明エンジンは、指向性ライトについては、距離による減衰がないためこの手順をスキップします。 システムでは、拡散と鏡面の 2 種類の反射を考慮し、異なる指揮を使用してそれぞれの反射する光量を決定します。 反射の光量を計算した後、Direct3D は、現在のマテリアルの拡散および鏡面反射率プロパティにこれらの新しい値を適用します。 結果として得られる色の値は、ラスタライザーはグーロー シェーディングと鏡面ハイライトを生成するために使用する拡散および鏡面コンポーネントです。
拡散光は次の方程式で表されます。
拡散光 = sum[Cd*Ld*(N.Ldir)*Atten*Spot]
パラメーター | 既定値 | 型 | 説明 |
---|---|---|---|
Sum | 該当なし | 該当なし | 各ライトの拡散コンポーネントの総和。 |
Cd | (0,0,0,0) | D3DCOLORVALUE | 拡散色。 |
Ld | (0,0,0,0) | D3DCOLORVALUE | 明るい拡散色。 |
× | 該当なし | D3DVECTOR | 頂点法線 |
Ldir | 該当なし | D3DVECTOR | オブジェクトの頂点からライトへの方向ベクトル。 |
Atten | 該当なし | FLOAT | 光の減衰。 「減衰とスポットライト係数 (Direct3D 9)」を参照してください。 |
スポット | 該当なし | FLOAT | スポットライト係数。 「減衰とスポットライト係数 (Direct3D 9)」を参照してください。 |
Cd の値は次のいずれかです。
- vertex color1(DIFFUSEMATERIALSOURCE = D3DMCS_COLOR1の場合)、頂点宣言で最初の頂点の色が指定されます。
- vertex color2(DIFFUSEMATERIALSOURCE = D3DMCS_COLOR2の場合)、頂点宣言で 2 番目の頂点の色が指定されます。
- マテリアル拡散色
Note
いずれかの DIFFUSEMATERIALSOURCE オプションを使用し、頂点の色が指定されていない場合は、マテリアル拡散カラーが使用されます。
減衰 (Atten) またはスポットライト特性 (スポット) を計算するには、「 減衰とスポットライト係数 (Direct3D 9)」を参照してください。
拡散コンポーネントは、すべての光が個別に処理されて補間されると、0 ~ 255 になるようにクランプされます。 生成された拡散照明値は、環境光、拡散光、放射光の値の組み合わせです。
例
この例では、オブジェクトの色は、ライトの拡散色とマテリアルの拡散色を使用しています。 コードを次に示します。
D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof(mtrl) );
D3DLIGHT9 light;
ZeroMemory( &light, sizeof(light) );
light.Type = D3DLIGHT_DIRECTIONAL;
D3DXVECTOR3 vecDir;
vecDir = D3DXVECTOR3(0.5f, 0.0f, -0.5f);
D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );
// set directional light diffuse color
light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;
light.Diffuse.a = 1.0f;
m_pd3dDevice->SetLight( 0, &light );
m_pd3dDevice->LightEnable( 0, TRUE );
// if a material is used, SetRenderState must be used
// vertex color = light diffuse color * material diffuse color
mtrl.Diffuse.r = 0.75f;
mtrl.Diffuse.g = 0.0f;
mtrl.Diffuse.b = 0.0f;
mtrl.Diffuse.a = 0.0f;
m_pd3dDevice->SetMaterial( &mtrl );
m_pd3dDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
この方程式では、生成されるオブジェクトの頂点の色は、マテリアルの色と光の色の組み合わせになります。
次の 2 つのイメージは、マテリアルの色がグレーで、ライトの色が明るい赤であることを示しています。
赤
結果として作成されるシーンは、次のようになります。 シーン内の唯一のオブジェクトは球です。 拡散照明の計算では、マテリアルとライトの拡散色を取得した後、内積を使用して、ライトの方向と頂点法線の間の角度からその値を修正します。 その結果、球の背面は、球のサーフェスがカーブしながらライトから遠ざかるに従い暗くなります。
拡散光と前の例の環境光を組み合わせると、オブジェクトのサーフェス全体に影が付けられます。 次の図に示すように、環境光はサーフェス全体に影を付け、拡散光はオブジェクトの 3D 形状を表現するのに役立ちます。
拡散光は、環境光よりも計算の負荷が高くなります。 頂点法線とライトの方向に依存しているため、オブジェクトのジオメトリを 3D 空間で表現でき、環境光よりリアルな照明を生成できます。 鏡面ハイライトを使用すると、さらにリアルな外観を表現できます。
関連トピック