次の方法で共有


面および頂点法線ベクトル (Direct3D 9)

メッシュ内の各面には、垂直な単位法線ベクトルがあります。ベクトルの方向は、頂点が定義された順序によって、また座標系が右手系であるか左手系であるかによって決まります。面の法線は、面の前面側から離れる方向を指します。Direct3D では、面の前面のみが表示されます。前面とは、頂点が時計回りの順序で定義される面です。

Normal vector

前面ではない面はすべて背面となります。Direct3D では、背面は常にレンダリングされるわけではなく、したがって背面はカリングされるといわれます。カリング モードを変更して、必要な場合に背面をレンダリングすることができます。詳細については、「カリング ステート (Direct3D 9)」を参照してください。

Direct3D は、グーロー シェーディング、ライティング、およびテクスチャー エフェクトに、頂点の単位法線を使用します。

Vertex normals

グーロー シェーディングをポリゴンに適用するとき、Direct3D では、頂点法線を使用して光源とサーフェスの間の角度が計算されます。色および強度の値が各頂点について計算され、プリミティブの全サーフェスにわたるすべての点に対してそれらの値が補間されます。Direct3D では、角度を使用して光強度が計算されます。角度が大きくなるにつれて、サーフェスでの光の輝きは弱くなります。

平らなオブジェクトを作成する場合、次の図のように、サーフェスに垂直な方向を指すように頂点法線を設定します。2 つの三角形で構成された平らなサーフェスが定義されます。

Flat vertex

ただし、多くの場合、オブジェクトはトライアングル ストリップでできており、またそれらの三角形は同一平面内に存在しません。滑らかなシェーディングをストリップ内のすべての三角形に対して簡単に実現する方法として、先に、頂点が関連付けられたポリゴン面ごとにサーフェスの法線ベクトルを計算する方法があります。頂点法線は、各サーフェスの法線と等しい角度をなすように設定することができます。ただし、この方法は、複雑なプリミティブには十分に効率的でないことがあります。

この方法を次の図で説明します。この図は、上方から横向きに見た 2 つのサーフェス S1 および S2 を示しています。S1 および S2 の法線ベクトルは青色で示されています。頂点法線ベクトルは赤色で示されています。頂点法線ベクトルが S1 のサーフェス法線となす角度は、頂点法線と S2 のサーフェス法線との間の角度と同じです。これらの 2 つのサーフェスが、光で照らされ、グーロー シェーディングでシェーディングされると、結果として、これらのサーフェスの間のエッジは、滑らかにシェーディングされ、滑らかに丸みの付いたものになります。

Gouraud vertex

頂点法線が、関連付けられた面のうちの 1 つに向かって傾いている場合、光の強度は、頂点法線が光源となす角度に応じて、そのサーフェス上の点に対して増加または減少することになります。この例を次の図に示します。ここでも、これらのサーフェスは横向きに見たものです。頂点法線は S1 に向かって傾いており、頂点法線と各サーフェス法線との角度が等しい場合と比べて、光源との角度は小さくなっています。

Gouraud vertex

グーロー シェーディングを使用すると、3D シーンにおける特定のオブジェクトを鋭角なエッジで表示することができます。そのためには、次の図に示すように、鋭利なエッジが必要となる面の交線に頂点法線ベクトルを複製します。

Sharp-edge vertex

DrawPrimitive メソッドを使用してシーンをレンダリングする場合、鋭利なエッジを持つオブジェクトは、トライアングル ストリップではなくトライアングル リストで定義します。オブジェクトをトライアングル ストリップとして定義すると、Direct3D はそのオブジェクトを、複数の三角形面で構成された単一のポリゴンとして扱います。グーロー シェーディングは、ポリゴンの各面にも、隣接する面の間にも適用されます。結果として、オブジェクトは、面から面へ滑らかにシェーディングされます。トライアングル リストは、結合されていない一連の三角形面で構成されているため、Direct3D では、グーロー シェーディングがポリゴンの各面に適用されます。ただし、面に個別には適用されません。トライアングル リストのうちの 2 つ以上の三角形が隣接している場合、それらの三角形の間に鋭角のエッジがあるように表されます。

もう 1 つの方法は、鋭角のエッジを持つオブジェクトをレンダリングするとき、平面シェーディングに変更することです。これは、計算上は最も効率的な方法ですが、結果的に、シーンのオブジェクトは、グーロー シェーディングされたオブジェクトのようにはリアルにレンダリングされないことがあります。