Freigeben über


Face- und Vertex-Normalvektoren (Direct3D 9)

Jede Oberfläche in einem Gitter weist einen senkrechten Einheitsnormalvektor auf, wie in der folgenden Abbildung dargestellt. 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.

Abbildung eines normalen Vektors für eine Vorderseite

Jedes Gesicht, das kein Vordergesicht ist, ist eine Rückseite. Direct3D rendert nicht immer Hintergrundblätter; daher sollen Rückengesichten gekullt werden. Sie können den Culling-Modus ändern, um bei Bedarf Gesichter zu rendern. Weitere Informationen finden Sie unter Culling State (Direct3D 9).

Direct3D verwendet die Vertexeinheitsnormalen für Gouraud-Schattierungs-, Beleuchtungs- und Textureffekte. Die folgende Abbildung zeigt Beispielnormalen.

Abbildung von Vertexnormalen

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.

Wenn Sie ein objekt erstellen, das flach ist, legen Sie die Vertexnormalen so fest, dass sie senkrecht zur Oberfläche zeigen, wie in der folgenden Abbildung dargestellt.

Abbildung einer flachen Oberfläche aus zwei Dreiecken mit Vertexnormalen

Es ist jedoch 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.

Diagramm von zwei Oberflächen (s1 und s2) und ihren normalen Vektoren und vertexnormalen Vektoren

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. Auch hier sind diese Oberflächen am Rand zu sehen. 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.

Diagramm von zwei Oberflächen (s1 und s2) mit einem Vertexnormalvektor, der sich in Richtung einer Fläche

Sie können die Gouraud-Schattierung verwenden, um einige Objekte in einer 3D-Szene mit scharfen Kanten anzuzeigen. Duplizieren Sie dazu die Scheitelpunktnormalvektoren an allen Schnittpunkten von Gesichtern, bei denen eine scharfe Kante erforderlich ist, wie in der folgenden Abbildung gezeigt.

Abbildung duplizierter Vertexnormalvektoren an scharfen Kanten

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-