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