OpenGL: Problem mit Dreiecksstreifen für 3D-Mesh und Normalen

8

Ich bin neu in der OpenGL-Programmierung. Ich mache gerade Animation der Höhle Schachtbildung. Ich habe eine Reihe von Koordinaten für Profile der Welle entlang der Z-Achse. Mein Plan ist, aus diesen Daten ein 3D-Mesh zu machen und dazu habe ich beschlossen, TRIANGLE_STRIPS zu verwenden. Wie ich das gemacht habe, habe ich mehrere Streifen wie folgt erstellt:

%Vor%

Meine Fragen sind:

  1. Ist das der richtige Weg? Weil ich jetzt Probleme mit Normalen habe. Ich würde gerne GL_SMOOTH-Schattierung verwenden und dafür, wie ich verstehe, muss ich Normalen von Scheitelpunkten berechnen? Aber in meinem Fall sind Vertex 10 und 3 gleich, also gäbe es zwei Normale ??? Ist das ein Problem? Und gibt es eine andere Möglichkeit, mehrere Streifen zu erstellen?

  2. Und gibt es eine andere Möglichkeit, mehrere Streifen zu erstellen? Oder die Lösung mit Streifen ist vielleicht nicht die beste?

  3. Ein weiteres Problem ist, dass diese Streifen nicht gleich lang sind. Manche sind kürzer als andere. Danke für Ihre Hilfe :)

Diba 31.05.2011, 13:12
quelle

2 Antworten

6

Verwenden Sie keine Dreiecksleisten. Es ist ein altes Konzept für alte Hardware. Verwenden Sie einfache indizierte Dreieckslisten. Es ist einfacher (zuerst) und schneller. Zu deinen Fragen:

1) Jeder Knoten hat eine Normale. Es ist genauso einzigartig und wichtig wie die Position. Wenn zwei Scheitelpunkte eine andere Position hätten, wären sie unterschiedliche Scheitelpunkte. Gleiches gilt für Normale: Es gibt Scheitelpunkte mit gleicher Position aber unterschiedlichen Normalen. Aber sie sind unterschiedliche Eckpunkte. Denken Sie darüber nach, wie sich die Scheitelpunkte einer Kugel von den Scheitelpunkten eines Würfels unterscheiden.

2) Verwenden Sie Listen (glDrawElements). Verwenden Sie keine Streifen. Es gibt optimale Möglichkeiten, diese Listen für das Caching zu bestellen, nvidia und ati haben viel Code in ihren Entwicklerbereichen.

3) Mach dir darüber noch keine Sorgen. Ein gutes Netz wird ungefähr gleich große Dreiecke haben. Die Indizes sind so sortiert, dass sie die meiste Zeit auf einen Vertex-Cache (normalerweise mindestens 16 Einträge) treffen. Mit Strips können Sie einen Vertexcache mit zwei Einträgen optimieren.

    
starmole 01.06.2011 13:55
quelle
2

Zuerst werden in Ihrem Bild die Diagonalen tatsächlich umgedreht, wenn die Zahlen die Reihenfolge der Scheitelpunkte darstellen (aber das ist ein kleiner Präsentationsfehler).

  1. Dies ist die einfachste und meist ausreichende Methode, um ein mehr oder weniger gleichmäßiges Gitter aus Knoten zu entfernen. Du hast recht, da 10 und 3 dieselbe Norm brauchen, also musst du ihnen die gleiche Norm geben, damit sie richtig leuchten. In diesem Fall ist die Indexierung Ihr Freund. Verwenden Sie einfach einen einzigen Scheitelpunkt für 3 und 10 (mit einer entsprechenden Normalen) und verwenden Sie einen indizierten Dreiecksstreifen, wobei Index 3 und 10 auf denselben Scheitelpunkt verweisen. Dies ist die Standardmethode zur Auflösung von Eckpunkt-Ambiguitäten. Wenn Sie nicht wissen, was ich meine, vertiefen Sie ein wenig tiefer in OpenGL und 3D-Programmierung im Allgemeinen, insbesondere Vertex-und Index-Arrays.

  2. Für reguläre Raster sind Streifen oft eine gute Idee, weil sie recht einfach aufgebaut werden können. Für komplexere Netze wird es heutzutage nicht mehr benötigt, da es oft wichtiger ist, die Anzahl der Zeichenaufrufe zu reduzieren.

  3. Sie sollten mindestens eine angemessene Länge im Vergleich zur Gesamtzahl der Dreiecke haben, da ansonsten der Aufwand für das Zeichnen eines einzelnen Streifens die Zeit, die durch die etwas schnellere Vertex-Verarbeitung eingespart wird, überwiegt, aber die tatsächlichen Zahlen sind stark abhängig von der Implementierung. Sie sollten trotzdem Vertex-Arrays / Puffer verwenden. Vermeiden Sie Anfang und Ende, wenn Sie Wert auf Leistung legen.

Sie können mehrere Streifen zu einem zusammenführen, indem Sie entartete Dreiecke einfügen, die nicht gerendert werden (um die Anzahl der Zeichenaufrufe zu reduzieren). Ihr Beispiel kann als der folgende einzelne Streifen gerendert werden:

1, 2, 3, 4, 5, 6, 6, 7 , 7, 8, 9, 10, 11, 12

Aber noch einmal, behalte Antwort 3. im Hinterkopf. Die Streifen sollten eine angemessene Größe haben, so dass die degenerierten Dreiecke die echten Dreiecke nicht zu sehr überlasten.

    
Christian Rau 31.05.2011 17:51
quelle

Tags und Links