Freigeben über


Seiten- und Scheitelnormalenvektoren

Jedes Gesicht in einem Gitter weist einen senkrechten Einheitsnormalvektor auf. Die Richtung des Vektors wird durch die Reihenfolge bestimmt, in der die Scheitelpunkte definiert sind und ob das Koordinatensystem rechts- oder linkshändig ist.

Senkrechter Einheitsnormalvektor für eine Vorderseite

Jedes Gesicht in einem Gitter weist einen senkrechten Einheitsnormalvektor auf. Die Richtung des Vektors wird durch die Reihenfolge bestimmt, in der die Scheitelpunkte definiert sind und ob das Koordinatensystem rechts- oder linkshändig ist. Die Gesichtsnormalpunkte von der Vorderseite des Gesichtes entfernt. In Direct3D ist nur die Vorderseite eines Gesichts sichtbar. Eine Vorderseite ist eine, in der Scheitelpunkte im Uhrzeigersinn definiert sind.

Die folgende Abbildung zeigt einen normalen Vektor für eine Vorderseite:

normaler Vektor für eine Vorderseite

Culling back faces

Jedes Gesicht, das kein Vordergesicht ist, ist eine Rückseite. Direct3D rendert nicht immer Hintergrundblätter; Zurückgesichtsflächen sollen gekullt werden. Die Rückseiten-Culling bedeutet, dass hintergrundgesichtige Gesichter nicht gerendert werden. Sie können den Culling-Modus ändern, um bei Bedarf Gesichter zu rendern. Weitere Informationen finden Sie unter Culling State .

Vertexeinheitsnormale

Direct3D verwendet die Vertexeinheitsnormalen für Gouraud-Schattierungs-, Beleuchtungs- und Textureffekte.

Die folgende Abbildung zeigt Vertexnormale:

Scheitelpunktnormale

Beim Anwenden der Gouraud-Schattierung auf ein Polygon verwendet Direct3D die Vertexnormalen, um den Winkel zwischen der Lichtquelle und der Oberfläche zu berechnen. Sie berechnet die Farb- und Intensitätswerte für die Scheitelpunkte und interpoliert sie für jeden Punkt über alle Oberflächen des Grundtyps. Direct3D berechnet den Lichtintensitätswert mithilfe des Winkels. Je größer der Winkel ist, desto weniger Licht leuchtet auf der Oberfläche.

Flache Oberflächen

Wenn Sie ein objekt erstellen, das flach ist, legen Sie die Vertexnormalen so fest, dass sie senkrecht zur Oberfläche zeigen.

Die folgende Abbildung zeigt eine flache Oberfläche, die aus zwei Dreiecken mit Vertexnormalen besteht:

Flache Oberfläche bestehend aus zwei Dreiecken mit Vertexnormalen

Reibungslose Schattierung für ein nicht flaches Objekt

Anstatt ein flaches Objekt, ist es wahrscheinlicher, dass Ihr Objekt aus Dreiecksstreifen besteht und die Dreiecke nicht koplanar sind. Eine einfache Möglichkeit, eine glatte Schattierung über alle Dreiecke im Streifen zu erzielen, besteht darin, zuerst den Oberflächennormalvektor für jedes polygonale Gesicht zu berechnen, dem der Scheitelpunkt zugeordnet ist. Die Scheitelpunktnormal kann so festgelegt werden, dass ein gleicher Winkel mit jeder Oberfläche normal ist. Diese Methode ist jedoch möglicherweise nicht effizient genug für komplexe Grundtypen.

Diese Methode wird durch das folgende Diagramm veranschaulicht, das zwei Oberflächen zeigt, S1 und S2, die von oben gesehen werden. Die normalen Vektoren für S1 und S2 werden blau angezeigt. Der Scheitelpunktnormalvektor wird rot angezeigt. Der Winkel, den der Vertexnormalvektor mit der Oberflächennormale von S1 macht, entspricht dem Winkel zwischen der Scheitelpunktnormal und der Oberflächennormale von S2. Wenn diese beiden Oberflächen mit Gouraud-Schattierung beleuchtet und schattiert werden, ist das Ergebnis eine glatt schattierte, glatt abgerundete Kante dazwischen.

Die folgende Abbildung zeigt zwei Oberflächen (S1 und S2) und deren normaler Vektor und Vertexnormalvektor:

zwei Oberflächen (s1 und s2) und deren normaler Vektor und Vertexnormalvektor

Wenn sich der Scheitelpunktnormal in Richtung eines der Gesichter richtet, mit denen es verbunden ist, bewirkt die Lichtintensität, dass die Lichtintensität für Punkte auf dieser Oberfläche je nach Winkel, den sie mit der Lichtquelle macht, zunimmt oder verkleinert. Das folgende Diagramm zeigt ein Beispiel. Diese Oberflächen werden am Rand angezeigt. Der Scheitelpunktnormal lehnt sich in Richtung S1 und hat einen kleineren Winkel mit der Lichtquelle, als wenn die Scheitelpunktnormal gleich Winkel mit den Oberflächennormalen hatte.

Die folgende Abbildung zeigt zwei Oberflächen (S1 und S2) mit einem Scheitelpunktnormalvektor, der sich in Richtung eines Gesichtes richtet:

zwei Oberflächen (s1 und s2) mit einem Scheitelpunktnormalvektor, der sich in Richtung eines Gesichtes richtet

Scharfe Kanten

Sie können die Gouraud-Schattierung verwenden, um einige Objekte in einer 3D-Szene mit scharfen Kanten anzuzeigen. Duplizieren Sie dazu die Vertexnormalen Vektoren an jeder Schnittmenge von Gesichtern, bei denen eine scharfe Kante erforderlich ist.

Die folgende Abbildung zeigt duplizierte Vertexnormalvektoren an scharfen Kanten:

Duplizierte Vertexnormalvektoren an scharfen Rändern

Wenn Sie die DrawPrimitive-Methoden zum Rendern der Szene verwenden, definieren Sie das Objekt mit scharfen Kanten als Dreiecksliste und nicht als Dreiecksstreifen. Wenn Sie ein Objekt als Dreiecksstreifen definieren, behandelt Direct3D es als ein einzelnes Polygon, das aus mehreren dreieckigen Gesichtern besteht. Die Gouraud-Schattierung wird auf jeder Fläche des Polygons und zwischen angrenzenden Gesichtern angewendet.

Das Ergebnis ist ein Objekt, das von Gesicht zu Gesicht glatt schattiert wird. Da es sich bei einer Dreiecksliste um ein Polygon handelt, das aus einer Reihe nicht zusammenhängender dreieckiger Gesichter besteht, wendet Direct3D die Gouraud-Schattierung auf jede Fläche des Polygons an. Es wird jedoch nicht von Gesicht zu Gesicht angewendet. Wenn zwei oder mehr Dreiecke einer Dreiecksliste nebeneinander liegen, scheinen sie einen scharfen Rand dazwischen zu haben.

Eine weitere Alternative besteht darin, beim Rendern von Objekten mit scharfen Kanten eine flache Schattierung zu ändern. Dies ist rechnerisch die effizienteste Methode, kann aber dazu führen, dass Objekte in der Szene, die nicht so realistisch gerendert werden wie die Objekte, die gouraud-schattiert sind.

Koordinatensysteme und Geometrie