次の方法で共有


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

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

手記

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

 

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

Direct3D 照明とマテリアルを使用する場合は、Direct3D で照明の詳細を処理できます。 上級ユーザーは、必要に応じて、自分で照明を実行できます。

照明やマテリアルを操作する方法は、レンダリングされたシーンの外観に大きな違いを生み出します。 マテリアルは、サーフェスから光を反射する方法を定義します。 直接光と周囲光レベルは、反射する光を定義します。 照明が有効になっている場合は、マテリアルを使用してシーンをレンダリングする必要があります。 ライトはシーンをレンダリングするために必要ありませんが、ライトなしでレンダリングされたシーンの詳細は表示されません。 せいぜい、照明のないシーンをレンダリングすると、シーン内のオブジェクトのシルエットが作成されます。 これはほとんどの目的で十分な詳細ではありません。

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

直接光と周囲光の両方がシーン内のオブジェクトを照らしますが、互いに独立しており、非常に異なる効果を持ち、まったく異なる方法で操作する必要があります。

直接光はただそれです:直接。 直接光は常に方向と色を持ち、グルート シェーディングなどのシェーディング アルゴリズムの要素です。 ライトの種類が異なると、さまざまな方法で直接光が放出され、特殊な減衰効果が生まれます。 IDirect3DDevice9::SetLight メソッドを呼び出して、直接光のライト パラメーターのセットを作成します。

環境光は、シーン内のあらゆる場所で効果的に使用されます。 これは、オブジェクトとそのシーン内の場所に関係なく、シーン全体を塗りつぶす一般的なレベルの光と考えることができます。 環境光には位置や方向がなく、色と強度のみが含まれます。 各ライトは、シーン内の全体的なアンビエント ライトに追加されます。 IDirect3DDevice9::SetRenderState メソッドを呼び出してアンビエント ライト レベルを設定し、D3DRS_AMBIENTを State パラメーターとして指定し、必要な RGBA 色を Value パラメーターとして指定します。

アンビエント ライトの色は RGBA 値の形式になります。各コンポーネントは 0 から 255 の整数値です。 これは Direct3D のほとんどの色の値とは異なります。

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

Direct3D ライト モデルと Nature

本質的に、光源から光が放出されると、ユーザーの目に到達する前に数千または数百万のオブジェクトではないにしても、数百から反射されます。 反射するたびに、一部の光はサーフェスに吸収され、一部はランダムな方向に散乱し、残りは別のサーフェスまたはユーザーの目に向かいます。 このプロセスは、光が何も減らされないか、ユーザーが光を認識するまで続けられます。

明らかに、光の自然な動作を完全にシミュレートするために必要な計算は、リアルタイムの Direct3D グラフィックスに使用するには時間がかかりすぎます。 したがって、速度を念頭に置いて、Direct3D ライト モデルは、自然の世界での光の動作を近似します。 Direct3D は、最終的な色を作成するために組み合わせる赤、緑、青のコンポーネントの観点から光を記述します。

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

Direct3D ライト モデルは、環境光と直接光の 2 種類に光を一般化します。 それぞれに異なる属性があり、それぞれ異なる方法でサーフェスのマテリアルと対話します。 環境光は、その方向とソースが不確定になるように散らばっている光であり、あらゆる場所で低レベルの強度を維持します。 写真家が使用する間接照明は、周囲光の良い例です。 Direct3D の環境光は、自然と同様に、実際の方向やソースがなく、色と強度のみを持っています。 実際、環境光レベルは、光を生成するシーン内のオブジェクトから完全に独立しています。 周囲光は反射には影響しません。

直接光は、シーン内のソースによって生成される光です。常に色と強度を持ち、指定された方向に移動します。 直接光はサーフェスのマテリアルと相互作用して反射ハイライトを作成し、その方向は、グーロー シェーディングを含むシェーディング アルゴリズムの要因として使用されます。 直接光を反射しても、シーン内のアンビエント ライト レベルには影響しません。 直接光を生成するシーン内のソースには、シーンを照らす方法に影響するさまざまな特性があります。

さらに、ポリゴンのマテリアルには、そのポリゴンが受け取るライトの反射方法に影響するプロパティがあります。 マテリアルが周囲光を反射する方法を記述する 1 つの反射率特性を設定し、個々の特性を設定して、マテリアルの反射および拡散反射率を決定します。 詳細については、「マテリアル (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) のマテリアルは、それに向けられたすべての緑色の光を反射します。 材料には複数の反射率値があり、さまざまな種類の効果を生み出します。

その他の情報は、ライトタイプ(Direct3D 9)、および ライトプロパティ(Direct3D 9)に含まれています。

作業の開始