Polygon triangulation in triangle-strips für OpenGL ES
Ich bin auf der Suche für eine schnelle polygon triangulation-Algorithmus kann triangulieren nicht sehr komplexe 2D-konkave Polygone (ohne Löcher) in triangle-strips bereit, gesendet werden, um OpenGL ES für die Zeichnung mit GL_TRIANGLE_STRIP
.
Ich bin mir bewusst, einige algorithmen, aber ich konnte nicht finden, eine, die zu meinen Anforderungen passen:
- http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml
- dieser Algorithmus funktioniert ok, aber das problem ist, es gibt einfache Dreiecke, die Sie nicht zeichnen können mit
GL_TRIANGLE_STRIP
verwenden, benötigen SieGL_TRIANGLES
das ist nicht sehr effizient auf einer großen Anzahl von vertices.
- dieser Algorithmus funktioniert ok, aber das problem ist, es gibt einfache Dreiecke, die Sie nicht zeichnen können mit
- http://code.google.com/p/iphone-glu/
- es muss nicht jedes Beispiel, das verbunden und ich konnte nicht finden, dass jemand erfolgreich verwendet es auf iOS mit OpenGL ES 2.0
- Ich weiß nicht, was es gibt, und es scheint, wie es ruft auch die entsprechenden OpenGL-Befehle, die ich will nicht - ich brauche nur die Dreiecke zurück
- es Lecks Speicher
Die Plattform ich entwickle für: iOS, OpenGL ES 2.0, cocos2d 2.0.
Kann mir jemand helfen mit so ein Algorithmus? Oder sonstige Beratung wird sehr geschätzt.
- Obwohl eine Liste der Dreiecke mag weniger effizient als die eines einzigen triangle strip, zahlt es sich aus, wenn Sie mehr als eine solche konkave Polygone zu zeichnen (wie ein echtes 3d-Objekt konstruiert aus Ihnen). In diesem Fall können Sie ziehen die ganze multi-polygon-Objekt mit einem einzigen draw call (viele tri-Listen können verkettet werden zu einem), in der Erwägung, dass mit einem Dreieck-Streifen-Lösung, die Sie haben zu ziehen, jedes polygon indivdually. Heutzutage ist die Reduzierung der Anzahl der Unentschieden fordert, ist oft eine bessere Idee als Knirschen Objekte in einigen anspruchsvollen primitive, wie tri-Streifen. Ich denke, das gilt auch für heute ist ES-Geräte.
- Wenn Sie ein ganzes Objekt, ist es besser, schalten Sie es in Dreiecke und füttern Sie, um eine Bibliothek, die erzeugen würde, Dreieck, Streifen, wie nvTriStrip oder Stripifier. Das kann getan werden, offline auf PC, so dass Sie nicht brauchen, um die Mühe der Portierung der Bibliothek auf iOS. Die Geräte in der Regel auch Unterstützung primitive starten, die es ermöglicht, die Verkettung tristrips zu können machen Sie mit einem einzigen Befehl. Und dann gibt es glMultiDrawElements() oder Entartete Streifen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In 2D und ohne Löcher, das ist ziemlich einfach. Erste, Sie brauchen, um zu brechen das polygon, um eine oder mehrere monotone Polygone.
Die monotone Polygone sind ziemlich einfach zu biegen Sie in die tristrips, nur die Werte Sortieren, indem Sie
y
finden Sie die obersten und untersten Scheitelpunkt, und dann haben Sie Listen der Knoten auf der rechten und auf der linken Seite (weil vertices kommen, in eine bestimmte, sagen im Uhrzeigersinn, um). Dann beginnen Sie mit dem obersten Knoten und Scheitelpunkte hinzufügen von Links und von der rechten Seiten in abwechselnder Weise.Diese Technik funktioniert für jede 2D-Polygone ohne sich selbst schneidende Kanten, die enthält einige Fälle von Polygonen, die Löcher (die Löcher müssen korrekt Wunde, obwohl).
Können Sie versuchen und spielen mit diesem code:
Dieser code ist nicht optimal, aber es sollte einfach sein zu verstehen. Am Anfang, eine konkave polygon erstellt wird. Dann ein "working set" von Scheitelpunkten erstellt. Auf, die arbeiten eingestellt, eine permutation berechnet, die Art der vertices durch Ihre
y
koordinieren. Dass die permutation wird dann durchgeschleift, auf der Suche für split-Punkte. Einmal eine split-Punkt gefunden wird, eine neue Monotones polygon erstellt wird. Dann die Eckpunkte der neuen polygon entfernt von der Arbeitsgruppe festgelegt und der gesamte Vorgang wiederholt. Endlich, das working-set enthält die letzten polygon, das konnte nicht aufgeteilt werden. Am Ende, das monotone Polygone gerendert werden, zusammen mit Dreieck-Streifen bestellen. Es ist ein bisschen chaotisch, aber ich bin sicher, Sie werden es herausfinden (diese ist C++ - code, nur legte es in ein GLUT-Fenster und sehen, was es tut).Hoffe, das hilft ...
Können Sie extrahieren tesselation-Algorithmus von OpenGL Beispiel-Implementierung, wie in diesem post beschrieben http://choruscode.blogspot.de/2013/03/extracting-tesselation-from-opengl.html , hat es auch ein Beispiel.