Hallo, ich habe ein interleaved VBO, das mehrere Objekte (Zylinder) mit ihrer Farbe und Normalenvektoren repräsentiert. Nun möchte ich diese Zylinder durch die Vertex-Indexierung TRIANGLE_STRIP darstellen, was aber natürlich den Effekt hat, dass Teile dieser verschiedenen Zylinder jeweils mit dem anderen verbunden werden :
Habt ihr eine Lösung für mich, wie ich die Objekte visualisiere, ohne dass sie unerwünscht durch irgendwelche Verbindungen zu "einem" Objekt werden? Noch eines nebenbei: Auf dem Bild oben sieht man, dass die blauen Zylinder manchmal eine rote Farbe (eine Linie ist im Zentrum eines Zylinders) durchlassen bzw. irgendwie beschädigt erscheinen aus der Entfernung. Womit kann das zu tun haben? Die Koordinaten sind siebenstellig..
grüße
//edit: titel verändert.dieser passt besser
Zuletzt geändert von m.sirin am Di Aug 10, 2010 14:29, insgesamt 2-mal geändert.
Du kannst zwei TriangleStrips verbinden indem du den letzten Vertex des ersten Strips und den ersten Vertex des zweiten Strips doppelt einfügst. Dadurch erzeugst du vier zusätzliche Dreiecke die aber eine Fläche von Null haben und somit nicht sichtbar sind.
Warum möchtest du TriangleStrips benutzen? Ein Elementbuffer (häufig auch Indexbuffer genannt) ist üblicherweise einfacher zu handhaben und reduziert die Datenmenge auch stärker.
Du kannst zwei TriangleStrips verbinden indem du den letzten Vertex des ersten Strips und den ersten Vertex des zweiten Strips doppelt einfügst. Dadurch erzeugst du vier zusätzliche Dreiecke die aber eine Fläche von Null haben und somit nicht sichtbar sind.
Beim ersten Versuch hat es noch nicht ganz geklappt, weil zwischen zwei Objekten noch eine Verbindung besteht.. werde aber noch weiter rumprobieren.
Zitat:
Warum möchtest du TriangleStrips benutzen? Ein Elementbuffer (häufig auch Indexbuffer genannt) ist üblicherweise einfacher zu handhaben und reduziert die Datenmenge auch stärker.
Die Daten liegen schon so vorbereitet vor, dass ich einfach Triangle_Strip benutzen kann. In diesem Fall hätte ein Indexbuffer keine größeren Unterschiede ausgemacht?
Nach einigem Rumspielen mit den drawArrays, bekomme ich sehr merkwürde Ergebnisse:
-> Es werden plötzlich alle drei Zylinder dargestellt, obwohl dadurch nur zwei hätten angezeigt werden dürfen, da jedes Objekt aus 32 Vertex-Elementen besteht.
-> Alle drei Zylinder dargestellt - und zwar auch noch ohne Verbindung untereinander, wie ich es gern hätte. Doch dies ist Zufallsprodukt, dessen Funktionsweise ich mir nicht erklären kann.
-> Es werden plötzlich alle drei Zylinder dargestellt, obwohl dadurch nur zwei hätten angezeigt werden dürfen, da jedes Objekt aus 32 Vertex-Elementen besteht.
Der dritte Parameter gibt die Anzahl der zu zeichnenden Vertices an und nicht das Ende. Deshalb werden mit dem zweiten Aufruf 2 Zylinder gezeichnet.
-> Alle drei Zylinder dargestellt - und zwar auch noch ohne Verbindung untereinander, wie ich es gern hätte. Doch dies ist Zufallsprodukt, dessen Funktionsweise ich mir nicht erklären kann.
Ist eigentlich garnicht so schwer zu verstehen. Durch die 3 getrennten DrawCalls ist es so als ob vor dem ersten Vertex des 2ten und 3ten Zylinders kein Vertex stehen würde. Da man ein Dreieck nur zeichnen kann wenn man 3 Punkte hat wird erst ab dem 3ten Vertex jedes Zylinders gezeichnet und nicht schon ab dem erstem, sodass keine verbindenen Dreiecke zwischen den Zylindern möglich sind. Das ist etwa so als ob man 3mal "glBegin(GL_TRIANGLE_STRIP)...glEnd" hat, statt 1mal mit allen Vertices drin.
Okay, jetzt ist das Ganze einleuchtend! Danke Schläfer für die Erklärung
Je nach Datensatz können es ziemlich viele Zylinder werden, somit auch viele draw-Aufrufe. Das ist, soweit ich mitbekommen habe, eher nicht gut für die Peformance. Müsste ich es also so machen wie Coolcat vorgeschlagen hat (sodass dann nur ein draw-Aufruf nötig ist), oder gibt es auch noch eine anderen Lösungsansatz?
Je nach Datensatz können es ziemlich viele Zylinder werden, somit auch viele draw-Aufrufe. Das ist, soweit ich mitbekommen habe, eher nicht gut für die Peformance. Müsste ich es also so machen wie Coolcat vorgeschlagen hat (sodass dann nur ein draw-Aufruf nötig ist), oder gibt es auch noch eine anderen Lösungsansatz?
Ja, das stimmt. Mehrere von den Zylindern über sogenannte degenerierte Dreiecke zu verbinden, ist wohl die übliche Vorgehensweise. Indizes sind wie schon genannt eine andere Möglichkeit. Sofern deine Zylinder aber keinen Deckel oder Boden haben, würde das aber genau genommen mehr Speicher verbrauchen, als mit zusätzlichen Dreiecken. Allerdings brauch man sich davon nicht abschrecken lassen, weil das sowieso nur ein paar Bytes sind. Und meiner Meinung ist die Variante mit Indizes auch übersichtlicher.
Sofern deine Zylinder aber keinen Deckel oder Boden haben, würde das aber genau genommen mehr Speicher verbrauchen, als mit zusätzlichen Dreiecken. Allerdings brauch man sich davon nicht abschrecken lassen, weil das sowieso nur ein paar Bytes sind. Und meiner Meinung ist die Variante mit Indizes auch übersichtlicher.
Sie haben keine Deckel. Ich möchte es mit den Indizes versuchen. Habe ich es richtig verstanden, dass zuerst ein VBO erstellt werden muss, der alle meine Zylinderdaten enthält, dann ein Indexbuffer-Object nötig ist, der alle Objekte im VBO beschreibt? Zum Schluss lasse ich diese Zylinder mit einem Aufruf der Art
.. also mit dem Primitiv triangle zum Zwecke der Trennung der Zylinder, zeichnen?
Im ersten Moment habe ich an jeweils einen IBO pro Objekt im VBO gedacht,d.h. mehrere drawElements-Aufrufe, was aber ja fast die gleiche Vorgehensweise wie meine bisherige wäre.. oder?
Im ersten Moment habe ich an jeweils einen IBO pro Objekt im VBO gedacht,d.h. mehrere drawElements-Aufrufe, was aber ja fast die gleiche Vorgehensweise wie meine bisherige wäre.. oder?
Ja also mehrere glDrawElements-Aufrufe würde nicht wirklich was bringen. Ansonsten alles so wie du schon vermutet hast. Die Indizes kommen dann in einen Extra Buffer der eigentlich so ähnlich erstellt wird, wie der für die Vertices. Einziger Unterschied ist glaub ich, dass man GL_ELEMENT_ARRAY_BUFFER statt GL_ARRAY_BUFFER verwendet und die Daten natürlich Integer sind. Zum Zeichnen kann man GL_TRIANGLES verwenden oder man nimmt GL_QUADS. Das würde bei Zylindern auch gehen und man spart ein paar Primitive.
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.