ライトとマテリアル (Direct3D 9)

光源は、シーン内のオブジェクトを照射するのに使われます。 照明を有効にすると、Direct3D は次の組み合わせに基づいて各オブジェクトの頂点の色を計算します。

注意

このセクションは、固定関数パイプラインのみを対象としています。 プログラム可能なシェーダーは、すべての光源を明示的に実行します。

 

  • 関連付けられたテクスチャ マップ内の現在のマテリアルカラーとテクセル。
  • 頂点における拡散および反射の色 (指定されている場合)。
  • シーンまたはシーンの環境光レベルで光源により生成される色と強さ。

Direct3D 照明とマテリアルを使用する場合、Direct3D で照明の詳細を処理できます。 詳しい知識のあるユーザーは、必要に応じて自分で光源を実行することもできます。

光源と素材をどのように使うかによって、レンダリングされるシーンの外観が大きく変わります。 素材は、照明がサーフェスにどのように反射するかを定義します。 直接光レベルと環境光レベルは、反射する照明を定義します。 光源が有効な場合、素材を使ってシーンをレンダリングする必要があります。 シーンをレンダリングするのに照明は必要ありませんが、照明なしでレンダリングされたシーンのディテールは見えません。 照明のないシーンをレンダリングすると、よくてもシーン内のオブジェクトのシルエットが見える程度です。 このディテールはほとんどのケースで不十分です。

ダイレクト ライトとアンビエント ライト

直接光と環境光はどちらもシーン内のオブジェクトを照射しますが、互いに独立していて効果が大きく異なり、完全に異なる方法で使う必要があります。

直接光は、直接です。 直接光には必ず方向と色があります。これは、グロー シェーディングなどのシェーディング アルゴリズムの要素です。 照明の種類ごとに直接光を照射する方法が異なっており、特殊な減衰効果を生み出します。 直接光のライト パラメーターのセットを作成する場合は、 IDirect3DDevice9::SetLight メソッドを呼び出します。

環境光は事実上シーン内のどこにでも存在します。 これは、オブジェクトとそのシーン内の場所に関係なく、シーン全体を塗りつぶす一般的なレベルの光と考えることができます。 環境光には位置や方向がなく、色と強さのみです。 各照明がシーン内の環境光全体を増大させます。 IDirect3DDevice9::SetRenderState メソッドを呼び出してアンビエント ライト レベルを設定し、state パラメーターとしてD3DRS_AMBIENTを指定し、目的の RGBA 色を Value パラメーターとして指定します。

環境光の色は RGBA 値の形をとっており、その各コンポーネントは 0 ~ 255 の整数値です。 これは、Direct3D におけるほとんどの色値と異なります。

D3DCOLOR_RGBA マクロを使用して RGBA 値を生成できます。 赤、緑、青のコンポーネントが組み合わされて、環境光の最終的な色ができあがります。 アルファ コンポーネントは、色の透明度を制御します。 ハードウェア アクセラレーションや RGB エミュレーションを使っている場合、アルファ コンポーネントは無視されます。

Direct3D Light Model と Nature

自然界では、光が光源から放射されると、ユーザーの目に届くまでに、数千~数百万まではいかなくても、数百ものオブジェクトに反射します。 反射するたびに、いくらかの光がサーフェスに吸収されたりランダムな方向に拡散されたりし、残りは別のサーフェスやユーザーの目に届きます。 このプロセスは、光がまったくなくなるか、ユーザーが光と認識するまで続きます。

明らかに、光の自然な動作を完全にシミュレートするのに必要な計算には時間がかかりすぎて、リアルタイムの Direct3D グラフィックスには使うことができません。 したがって、スピードを考慮して、Direct3D の照明モデルでは自然界における光の動作を概算しています。 Direct3D は、組み合わせることで最終的な色を生み出す赤、緑、青のコンポーネントの観点で照明を表します。

Direct3D では、照明がサーフェスに反射すると、照明の色がサーフェス自体と数学的に相互作用し、最終的に画面に表示される色を生み出します。 Direct3D で使用されるアルゴリズムの詳細については、「 照明の数学 (Direct3D 9)」を参照してください。

Direct3D の照明モデルでは、照明が環境光と直接光の 2 つの種類に一般化されます。 それぞれ属性が異なっており、サーフェスの素材と相互作用する方法が異なっています。 環境光は、かなり大きく拡散する照明であり、その方向と光源ははっきりしません。どの場所でも強さのレベルは低いままです。 写真家が使う間接照明は環境光の良い例です。 Direct3D における環境光は、自然界と同じように実際の方向や光源がなく、色と強さのみです。 実際、環境光レベルは照明を生成するシーン内のどのオブジェクトからも完全に独立しています。 環境光は、鏡面反射には影響を与えません。

直接光は、シーン内の光源により生成される照明です。常に色と強さがあり、指定された方向に移動します。 直接光はサーフェスの素材と相互作用して鏡面ハイライトを生み出し、その方向はグロー シェーディングなどのシェーディング アルゴリズムの要素として使われます。 直接光が反射しても、シーン内の環境光レベルには影響を与えません。 直接光を生成するシーン内の光源は、シーンを照射する方法に影響を与えるさまざまな特性があります。

さらに、多角形の素材には、照射された照明を多角形が反射する方法に影響を与えるプロパティがあります。 素材が環境光を反射する方法を表す単一の反射率特性を設定し、個々の特性を設定して素材の反射および拡散の反射率を決定します。 詳細については、「 マテリアル (Direct3D 9)」を参照してください。

ライトとマテリアルの色の値

Direct3D は、赤、緑、青、アルファの 4 つのコンポーネントで色を表し、最終的な色を作ります。 D3DCOLORVALUE C++ 構造体は、各コンポーネントの値を格納するように定義されています。 各メンバーは、通常、0.0 から 1.0 までの範囲の浮動小数点値です。 ライトとマテリアルはどちらも同じ構造を使用して色を記述しますが、構造内の値はそれぞれ少し異なる方法で使用されます。

光源の色値は、その光源が放射する特定の照明コンポーネントの量を表します。 照明はアルファ コンポーネントを使わないため、色の赤、緑、青コンポーネントのみが関係します。 プロジェクション テレビでは、3 つのコンポーネントを赤、緑、青のレンズとして視覚化できます。 各レンズはオフ (該当する要素の値が 0.0)、明るさが最大 (値が 1.0)、またはその間のレベルのいずれかになります。 レンズを通過した色が組み合わされて、照明の最終的な色ができあがります。 R(1.0)、G(1.0)、B(1.0) のような組み合わせは白い光になります。R(0.0)、G(0.0)、B(0.0) は光をまったく照射しません。 1 つのコンポーネントのみ照射する照明 (完全に赤、緑、または青の光になります) を作ることができます。または、光を組み合わせて黄色や紫などの色を放射できます。 負の色コンポーネント値を設定し、実際にはシーンから光をなくす "ダーク ライト" を作ることもできます。 または、コンポーネントを 1.0 より大きい値に設定し、非常に軽い光を作ることもできます。

一方、素材では、その素材を使ってレンダリングされるサーフェスに反射する照明コンポーネントの量を色値が表します。 色コンポーネントが R(1.0)、G(1.0)、B(1.0)、A(1.0) の素材は、到達するすべての照明を反射します。 同様に、R(0.0)、G(1.0)、B(0.0)、A(1.0) の素材は、そこに到達する緑の光をすべて反射します。 素材には反射率の値が複数あるため、さまざまな種類の効果が生み出されます。

追加情報は、「 Light Types (Direct3D 9)」および「 Light Properties (Direct3D 9)」に含まれています

はじめに