面と頂点の法線ベクトル (Direct3D 9)
次の図に示すように、メッシュ内の各面には垂直な単位法線ベクトルがあります。 ベクトルの方向は、頂点が定義された順序によって、また座標系が右手系であるか左手系であるかによって決まります。 面の法線の向きは面の前面から離れる方向です。 Direct3D では、面の前面のみが表示されます。 前面は、頂点が時計回りの順序で定義されている面です。
前面ではない面はすべて背面です。 Direct3D では、常に背面の面がレンダリングされるとは限りません。そのため、背中の顔はカリングと言われます。 必要に応じて、カリング モードを変更し、背面をレンダリングすることもできます。 詳細については、「 カリング状態 (Direct3D 9)」 を参照してください。
Direct3D では、グーロー シェーディング、光源、テクスチャの効果に頂点の単位法線を使用します。 次の図は、標準の例を示しています。
グーロー シェーディングを多角形に適用するとき、Direct3D では、頂点法線を使用して光源とサーフェスの間の角度が計算されます。 頂点の色と明るさの値が計算され、プリミティブのすべてのサーフェスで、すべてのポイントが補間されます。 Direct3D では、角度を使用して光の強さを計算します。 角度が大きいほど、サーフェスでの光の輝きは少なくなります。
フラットなオブジェクトを作成する場合は、次の図に示すように、頂点法線をサーフェスに垂直なポイントに設定します。
ただし、オブジェクトが三角形のストリップで構成され、三角形が同一平面上にない可能性が高くなります。 ストリップ内のすべての三角形でスムーズ シェーディングを実現するための最も簡単な方法の 1 つは、まず頂点が関連付けられている多角形の面ごとにサーフェスの法線ベクトルを計算することです。 頂点法線は、各サーフェスの法線と等しい角度になるように設定できます。 ただし、この方法は、複雑なプリミティブには十分に効率的でないことがあります。
この方法を次の図で説明します。この図は、上方から横向きに見た 2 つのサーフェス S1 および S2 を示しています。 S1 および S2 の法線ベクトルは青色で示されています。 頂点法線ベクトルは赤色で示されています。 頂点法線ベクトルが S1 のサーフェス法線となす角度は、頂点法線と S2 のサーフェス法線との間の角度と同じです。 これらの 2 つのサーフェスが、光で照らされ、グーロー シェーディングでシェーディングされると、結果として、これらのサーフェスの間のエッジは、滑らかにシェーディングされ、滑らかに丸みの付いたものになります。
頂点法線が、関連付けられた面のうちの 1 つに向かって傾いている場合、光の強度は、頂点法線が光源となす角度に応じて、そのサーフェス上の点に対して増加または減少します。 次の図に例を示します。 ここでも、これらのサーフェスはエッジオンで表示されます。 頂点法線は S1 に向かって傾いており、頂点法線と各サーフェス法線との角度が等しい場合と比べて、光源との角度は小さくなっています。
グーロー シェーディングを使用すると、3D シーンで鋭いエッジを持つオブジェクトを表示できます。 そのためには、次の図に示すように、鋭いエッジが必要な面の交差部分に頂点法線ベクトルを複製します。
DrawPrimitive メソッドを使用してシーンをレンダリングする場合、鋭いエッジを持つオブジェクトは、三角形ストリップではなく三角形リストとして定義します。 三角形ストリップとしてオブジェクトを定義すると、Direct3D では、複数の三角形面から成る単一の多角形として処理されます。 グーロー シェーディングは、多角形の各面全体と、隣接する面の間の両方に適用されます。 結果として、オブジェクトは面から面へと滑らかにシェーディングされます。 三角形リストは一連の結合されていない三角形面から成る多角形であるため、Direct3D では、多角形の各面にグーロー シェーディングが適用されます。 ただし、面と面の間には適用されません。 三角形リストの 2 つ以上の三角形が隣接している場合、それらの間には鋭いエッジがあるように見えます。
別の方法としては、鋭いエッジを持つオブジェクトをレンダリングする場合は、フラット シェーディングに変更することです。 これは、計算上は最も効率的な方法ですが、シーンのオブジェクトは、グーロー シェーディングされたオブジェクトのようにはリアルにレンダリングされないことがあります。
関連トピック