Normalvektoren für Gesichts- und Scheitelpunkte (Direct3D 9)
Jedes Gesicht in einem Gitter hat einen senkrechten Einheits-Normalvektor, wie in der folgenden Abbildung gezeigt. Die Richtung des Vektors wird durch die Reihenfolge bestimmt, in der die Scheitelpunkte definiert werden und ob das Koordinatensystem rechts- oder linkshändig ist. Das Gesicht ist normal von der Vorderseite entfernt. In Direct3D ist nur die Vorderseite eines Gesichts sichtbar. Eine Frontseite ist eine, in der Scheitelpunkte im Uhrzeigersinn definiert werden.
Jedes Gesicht, das kein Vordergesicht ist, ist eine Hinterseite. Direct3D rendert nicht immer Rücksichten. daher sollen Die Hintergesichten gekrüppt sein. Sie können den Culling-Modus ändern, um Rückflächen zu rendern, wenn Sie möchten. Weitere Informationen finden Sie unter Culling State (Direct3D 9).
Direct3D verwendet die Vertexeinheit Normals für Gouraud-Schattierungs-, Beleuchtungs- und Texturierungseffekte. Die folgende Abbildung zeigt Beispielnormale.
Beim Anwenden der Gouraud-Schattierung auf ein Polygon verwendet Direct3D die Vertex-Normals, um den Winkel zwischen der Lichtquelle und der Oberfläche zu berechnen. Es berechnet die Farb- und Intensitätswerte für die Scheitelpunkte und interpoliert sie für jeden Punkt auf allen Oberflächen des Grundtyps. Direct3D berechnet den Lichtintensitätswert mithilfe des Winkels. Je größer der Winkel, desto weniger Licht leuchtet auf der Oberfläche.
Wenn Sie ein Objekt erstellen, das flach ist, legen Sie den Scheitelpunkt normal so fest, dass er senkrecht zur Oberfläche zeigt, wie in der folgenden Abbildung dargestellt.
Es ist jedoch wahrscheinlicher, dass Ihr Objekt aus Dreiecksstreifen besteht und die Dreiecke nicht koplanar sind. Eine einfache Möglichkeit, eine gleichmäßige Schattierung über alle Dreiecke im Streifen zu erzielen, besteht darin, zunächst den Oberflächen-Normalvektor für jede polygonale Fläche zu berechnen, der der Scheitelpunkt zugeordnet ist. Der Scheitelpunkt normal kann so eingestellt werden, dass er einen gleichen Winkel mit jeder Oberfläche normal macht. 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 am Rand angezeigt werden. Die normalen Vektoren für S1 und S2 sind blau dargestellt. Der Scheitelpunkt-Normalvektor ist rot dargestellt. Der Winkel, den der Scheitelpunkt-Normalvektor mit der Oberflächennormale von S1 macht, ist der gleiche wie der Winkel zwischen dem Scheitelpunkt normal und der Oberflächennormal von S2. Wenn diese beiden Oberflächen beleuchtet und mit Gouraud-Schattierung beschattet sind, entsteht zwischen ihnen eine glatt schattierte, glatt abgerundete Kante.
Wenn der Scheitelpunkt normal zu einem der Gesichter neigt, mit denen er verknüpft ist, bewirkt dies, dass die Lichtintensität für Punkte auf dieser Oberfläche erhöht oder verringert wird, abhängig vom Winkel, den er mit der Lichtquelle macht. Das folgende Diagramm zeigt ein Beispiel. Auch hier werden diese Oberflächen am Rand angezeigt. Der Scheitelpunkt normal neigt sich in Richtung S1, wodurch er einen kleineren Winkel mit der Lichtquelle hat, als wenn der Scheitelpunkt normal den gleichen Winkel wie die Oberflächennormale aufweist.
Sie können Gouraud-Schattierung verwenden, um einige Objekte in einer 3D-Szene mit scharfen Kanten anzuzeigen. Duplizieren Sie dazu die Scheitelpunkt-Normalvektoren an jedem Schnittpunkt von Flächen, bei denen eine scharfe Kante erforderlich ist, wie in der folgenden Abbildung gezeigt.
Wenn Sie die DrawPrimitive-Methoden zum Rendern Ihrer 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 Flächen besteht. Die Gouraud-Schattierung wird sowohl auf jede Fläche des Polygons als auch zwischen angrenzenden Gesichtern angewendet. Das Ergebnis ist ein Objekt, das von Gesicht zu Gesicht glatt schattiert ist. Da eine Dreiecksliste ein Polygon ist, das aus einer Reihe von nicht zusammenhängenden dreieckigen Gesichtern besteht, wendet Direct3D gouraud-Schattierung auf jede Fläche des Polygons an. Es wird jedoch nicht von Angesicht zu Angesicht angewendet. Wenn zwei oder mehr Dreiecke einer Dreiecksliste nebeneinander liegen, scheinen sie eine scharfe Kante dazwischen zu haben.
Eine andere Alternative besteht darin, beim Rendern von Objekten mit scharfen Kanten auf flache Schattierung umzustellen. Dies ist rechnerisch die effizienteste Methode, kann jedoch zu Objekten in der Szene führen, die nicht so realistisch gerendert werden wie die Objekte, die gouraud-schattiert sind.
Zugehörige Themen