マテリアル (Direct3D 9)

マテリアルは、多角形が光を反射したり、3D シーンで光を放出するように見えたりする方法を説明します。 マテリアルプロパティは、マテリアルの拡散反射、アンビエントリフレクション、発光、および反射ハイライト特性を詳細に示します。 Direct3D では、 D3DMATERIAL9 構造体を使用して、すべての数量単価型プロパティ情報を保持します。 反射プロパティを除き、各プロパティは、特定の種類の光の赤、緑、青の部分の反射量とアルファ ブレンド係数を表す RGBA 色として記述されます。

拡散反射とアンビエント反射

D3DMATERIAL9 構造体の拡散およびアンビエント メンバーは、マテリアルがシーン内のアンビエント ライトと拡散光を反射する方法を記述します。 ほとんどのシーンにはアンビエント ライトよりもはるかに多くの拡散光が含まれているため、拡散反射は色を決定する際に最も大きな役割を果たします。 さらに、拡散光は方向であるため、拡散光の入射角は反射の全体的な強度に影響します。 拡散反射は、頂点法線に平行な頂点にライトが当たるとき、最も大きいです。 角度が大きくなると、拡散反射の効果が減少します。 次の図に示すように、反射する光の量は、着信光と頂点法線の間の角度のコサインです。

反射光の量の図

アンビエント反射は、アンビエント ライトと同様に、非方向です。 アンビエント 反射は、レンダリングされたオブジェクトの見かけの色に与える影響は小さくなりますが、全体的な色に影響を与え、拡散光がマテリアルからほとんどまたはまったく反射しない場合に最も顕著です。 マテリアルのアンビエント リフレクションは、D3DRS_AMBIENT フラグを使用して IDirect3DDevice9::SetRenderState メソッドを呼び出すことによって、シーンに設定されたアンビエント ライトの影響を受けます。

拡散反射とアンビエント反射は、オブジェクトの認識される色を決定するために連携し、通常は同じ値です。 たとえば、青色の結晶オブジェクトをレンダリングするには、拡散光とアンビエント ライトの青色成分のみを反射するマテリアルを作成します。 白い光が入った部屋に置くと、クリスタルは青く見えます。 しかし、赤い光しか持たない部屋では、同じ結晶が黒く見えます。その材料は赤い光を反射しないためです。

排出

マテリアルを使用して、レンダリングされたオブジェクトを自己発光のように見せることができます。 D3DMATERIAL9 構造体の放射メンバーは、放射された光の色と透明度を記述するために使用されます。 放射はオブジェクトの色に影響し、暗いマテリアルが明るくなったり、部分的に放射される光の色になったりする場合があります。

マテリアルの放射プロパティを使用すると、シーンにライトを追加する計算オーバーヘッドを発生させずに、オブジェクトが光を放出しているという錯覚を追加できます。 青色の結晶の場合、放射特性は、クリスタルを明るく見せ、シーン内の他のオブジェクトに光を当てないようにしたい場合に便利です。 放射特性を持つマテリアルは、シーン内の他のオブジェクトによって反射できる光を放出しないことを覚えておいてください。 この反射光を実現するには、シーン内に追加のライトを配置する必要があります。

反射反射

鏡面反射を使うと、オブジェクトにハイライトが作成され、光沢があるように見えます。 D3DMATERIAL9 構造体には、反射ハイライトの色とマテリアルの全体的な輝きを表す 2 つのメンバーが含まれています。 反射のハイライトの色を設定するには、反射メンバーを目的の RGBA 色に設定します。最も一般的な色は白または薄い灰色です。 Power メンバーで設定した値は、反射効果のシャープさを制御します。

スペキュラ ハイライトを使用すると、劇的な効果を生み出すことができます。 青いクリスタルの例えでもう一度描画する: Power の値を大きくすると、反射のハイライトがシャープになり、クリスタルが非常に光沢のあるように見えます。 値を小さくすると効果の領域が大きくなり、くすんだ反射が作成され、クリスタルが冷ややかな外観になります。 オブジェクトを真にマットにするには、Power メンバーを 0 に設定し、反射の色を黒に設定します。 さまざまなレベルのリフレクションを試して、ニーズに合わせて現実的な外観を作成します。 次の図は、2 つの同じモデルを示しています。 左側の 1 つは、10 の反射力を使用します。右側のモデルには反射がありません。

反射モデルの図

マテリアル プロパティの設定

Direct3D レンダリング デバイスは、一度に 1 セットのマテリアル プロパティを使用してレンダリングできます。

C++ アプリケーションでは、 D3DMATERIAL9 構造体を準備し、 IDirect3DDevice9::SetMaterial メソッドを呼び出して、システムが使用するマテリアル プロパティを設定します。

使用する D3DMATERIAL9 構造体を準備するには、構造のプロパティ情報を設定して、レンダリング中に目的の効果を作成します。 次のコード例では、鮮明な白い反射ハイライトを持つ紫色の素材に D3DMATERIAL9 構造体を設定します。

D3DMATERIAL9 mat;

// Set the RGBA for diffuse reflection.
mat.Diffuse.r = 0.5f;
mat.Diffuse.g = 0.0f;
mat.Diffuse.b = 0.5f;
mat.Diffuse.a = 1.0f;

// Set the RGBA for ambient reflection.
mat.Ambient.r = 0.5f;
mat.Ambient.g = 0.0f;
mat.Ambient.b = 0.5f;
mat.Ambient.a = 1.0f;

// Set the color and sharpness of specular highlights.
mat.Specular.r = 1.0f;
mat.Specular.g = 1.0f;
mat.Specular.b = 1.0f;
mat.Specular.a = 1.0f;
mat.Power = 50.0f;

// Set the RGBA for emissive color.
mat.Emissive.r = 0.0f;
mat.Emissive.g = 0.0f;
mat.Emissive.b = 0.0f;
mat.Emissive.a = 0.0f;

D3DMATERIAL9 構造体を準備した後、レンダリング デバイスの IDirect3DDevice9::SetMaterial メソッドを呼び出してプロパティを適用します。 このメソッドは、準備された D3DMATERIAL9 構造体のアドレスを唯一のパラメーターとして受け入れます。 IDirect3DDevice9::SetMaterial を呼び出し、必要に応じて新しい情報を使用してデバイスのマテリアル プロパティを更新できます。 次のコード例は、これがコードでどのように表示されるかを示しています。

// This code example uses the material properties defined for 
// the mat variable earlier in this topic. The pd3dDev is assumed
// to be a valid pointer to an IDirect3DDevice9 interface.
HRESULT hr;
hr = pd3dDev->SetMaterial(&mat);
if(FAILED(hr))
{
    // Code to handle the error goes here.
}

Direct3D デバイスを作成すると、現在のマテリアルは次の表に示す既定値に自動的に設定されます。

メンバー
拡散光 (R:0、G:0、B:0、A:0)
反射 (R:0、G:0、B:0、A:0)
環境光 (R:0、G:0、B:0、A:0)
発光 (R:0、G:0、B:0、A:0)
Power (0.0)

 

マテリアル プロパティの取得

レンダリング デバイスが現在使用しているマテリアル プロパティを取得するには、デバイスの IDirect3DDevice9::GetMaterial メソッドを呼び出します。 IDirect3DDevice9::SetMaterial メソッドとは異なり、IDirect3DDevice9::GetMaterial では準備は必要ありません。 IDirect3DDevice9::GetMaterial メソッドは、D3DMATERIAL9 構造体のアドレスを受け取り、返される前に、現在のマテリアル プロパティを記述する情報を指定した構造体に入力します。

// For this example, the pd3dDev variable is assumed to 
// be a valid pointer to an IDirect3DDevice9 interface.
HRESULT hr;
D3DMATERIAL9 mat;

hr = pd3dDev->GetMaterial(&mat);
if(FAILED(hr))
{
    // Code to handle the error goes here.
}

注意

アプリケーションでレンダリング用のマテリアル プロパティが指定されていない場合、システムは既定のマテリアルを使用します。 既定のマテリアルは、すべての拡散光 (たとえば、白) を反射し、アンビエント反射や反射反射はなく、放射色も反映しません。

 

ライトとマテリアル