2013-08-01 5 views
5

Ich versuche, einige Inkonsistenzen zu beheben, die ich in Dreieckstrip-Scheitelwindungsrichtung (im Uhrzeigersinn und gegen den Uhrzeigersinn) sehe. Ich zeichne ein Trapez, das in OpenGL um 90 Grad gegen den Uhrzeigersinn gedreht ist. Hier ist der relevante Code:Wechselt die Wicklungsrichtung in einem OpenGL-Dreiecksstreifen von Dreieck zu Dreieck?

unsigned char mIndices[] = { 0, 1, 2, 3, 4, 5 }; 
signed short mVertices[] = { 
           -50, 100, 0, // A 
           -85, 65, 0,  // B 
           -50, 65, 0,  // C 
           -85, -65, 0, // D 
           -50, -65, 0, // E 
           -50, -100, 0, // F 
}; 

... 

glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3, GL_SHORT, 0, mVertices); 

... 

glDrawElements(GL_TRIANGLE_STRIP, sizeof(mVertices)/sizeof(mVertices[0]), GL_UNSIGNED_BYTE, mIndices); 

Von dem, was ich gelesen here, die Standard-Vorderseite in OpenGL ist gegen den Uhrzeigersinn, die das erste Dreieck in meinem Streifen bedeutet, sollte es Eckpunkten bestellt gegen den Uhrzeigersinn. Beim Zeichnen eines Dreiecksstreifens wechselt die Wicklung außerdem die Richtungen zwischen dem Uhrzeigersinn und dem Uhrzeigersinn von Dreieck zu Dreieck, so dass meine Eckpunkte auf diese Weise geordnet sind. Das erste Dreieck wäre also ABC, das zweite wäre BCD, das dritte CDE und das vierte DEF. Jedoch, Artikel this (im Zitat aus dem OpenGL Programming Guide) sagt, dass es sie als ABC, CBD, CDE, EDF zeichnen würde (unter der Annahme v0 - A, v1 - B, etc), was bedeutet, dass sie alle gleich gegen den Uhrzeigersinn winden Richtung.

Wenn ich die A/B-Notation korrekt aus der OpenGL-Spezifikation verstehe, würden die Dreiecke alle die gleiche Richtung haben, aber ich habe die wechselnde Wicklung an ein paar verschiedenen Orten gesehen. Ich nehme an, es ist nur eine Frage der Semantik, da die resultierende Form die gleiche ist, aber was ist die tatsächliche Wicklungsreihenfolge?

Antwort

7

Also von meinem Code wäre das erste Dreieck ABC, das zweite wäre BCD, dritte CDE und vierte DEF. Dieser Artikel (im Zitat aus dem OpenGL-Programmierleitfaden) sagt jedoch, dass er sie als ABC, CBD, CDE, EDF (unter der Annahme von v0 - A, v1 - B usw.) zeichnen würde, was bedeutet, dass alle gegen den Uhrzeigersinn gedreht werden Richtung.

Was beide sagten, ist wahr. Aus einem bestimmten Blickwinkel;)

Das Tutorial, das Sie zitiert, ist es aus der Sicht der Reihenfolge, dass die Scheitelpunkte sind bereitgestellt an den Rasterizer. Was genau ist wie gesagt. Der Rasterizer sieht einen einzelnen Stream von ABCDEF ... Vertices. Aus dieser Perspektive muss der Rasterer daher seine interne Wicklungsreihenfolge auf jedes andere Dreieck umschalten, um der Absicht des Benutzers zu entsprechen.

Das Buch, das Sie zitiert, spricht darüber aus der Sicht, wie Sie denken Sie an die Reihenfolge dieser Dreiecke. Während Sie sie in dieser Reihenfolge bereitstellen, möchten Sie, dass die Wicklung wie ABC, CBD, CDE usw. funktioniert. Und um dies zu erreichen, stellen Sie sie in der ABCDEF-Reihenfolge bereit.

4

Seien Sie versichert, dass die Dreiecke, die aus einem Dreiecksstreifen resultieren, alle in der gleichen Reihenfolge gewickelt sind (sonst wäre es ein totales Durcheinander und Sie könnten einfache Dinge wie Rückseitenkeulen oder beidseitiges Rendern überhaupt nicht verwenden) , das ist Teil der Magie eines Dreiecks-Streifens und warum das Zeichnen eines einfachen Dreiecks, das an jedem nachfolgenden Eckpunkt beginnt, nicht funktionieren würde (naja, würde es, aber es würde abwechselnde Windungsordnungen ergeben, was niemals (immer) ein gutes ist Idee). So ist der zweite Artikel (aus dem OpenGL-Programmierleitfaden) korrekt und der erste Artikel ist entweder falsch, hat seine Semantik durcheinander gebracht oder wurde von Ihnen falsch interpretiert (obwohl ich letzteres aufgrund der Qualität dieses Tutorials vermuten würde, aber vielleicht Nicol Bolas selbst kann etwas Licht darauf werfen).

EDIT: Ok, am Ende des ersten Artikels suchen:

Beachten Sie, wie es wechselt zwischen dem Uhrzeigersinn und gegen den Uhrzeigersinn. Diese bedeutet, dass unabhängig davon, welches Gesicht Sie als Vorderseite betrachten und welches Gesicht Sie aussortieren, Sie immer etwa die Hälfte der Gesichter verlieren werden.

Allerdings ist OpenGL ziemlich intelligent darüber. Dreiecksstreifen tun Gesichtskeulen unterschiedlich. Für jedes zweite Dreieck ist derjenige, dessen Wicklungsreihenfolge entgegengesetzt zur Reihenfolge des ersten Dreiecks ist, die Wicklung Reihenfolge wird rückwärts für das Aussortieren betrachtet.

Also, wenn Sie die Vorderseite eingestellt haben im Uhrzeigersinn zu sein, und haben Gesicht Culling Keulung zurück gerichteten Dreiecke, alles genau funktioniert, wie Sie erwarten, solange die Reihenfolge des ersten Dreiecks ist richtig. Jedes geradzahlige Dreieck wird gelöscht, wenn es im Uhrzeigersinn eine Wicklung hat, und jedes ungerade nummerierte Dreieck wird gelöscht, wenn es eine entgegen dem Uhrzeigersinn hat.

Es sagt eigentlich, dass, während die Wicklung um theoretisch abwechselnd würde, OpenGL für die Konten und „fixe“ es für Dreiecksstreifen, in der Wicklung, um resultierende praktisch (für alle mit Blick auf Überlegungen, wie Keulen oder gl_FrontFacing Fragment Shader-Variable) für jedes Dreieck gleich ist. So sind beide Artikel korrekt und du hast die erste nur bis zum Ende gelesen. Allerdings hätte der Artikel deutlicher machen können, dass er nicht nur für Keulungszwecke, sondern für alle Zweckzwecke und damit für Sie praktisch unbemerkbar ist.