Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 14:10

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Aug 10, 2010 14:03 
Offline
DGL Member

Registriert: Fr Jul 16, 2010 18:28
Beiträge: 40
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 :

Bild

Der Codeschnipsel dazu sieht so aus (Webgl):

Code:
    gl.bindBuffer(gl.ARRAY_BUFFER, cylinderBuffer);
    gl.vertexAttribPointer(shaderProgram.position, 3, gl.FLOAT, false, 9*4, 0*4);
    gl.vertexAttribPointer(shaderProgram.color, 3, gl.FLOAT, false, 9*4, 3*4);
    gl.vertexAttribPointer(shaderProgram.nomals, 3, gl.FLOAT, false, 9*4, 6*4);

    setMatrixUniforms();
    gl.lineWidth(3.0);
    gl.drawArrays(gl.TRIANGLE_STRIP,0,32);
    gl.drawArrays(gl.TRIANGLE_STRIP,32,64);
    gl.drawArrays(gl.TRIANGLE_STRIP,64,96);


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.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 10, 2010 14:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 10, 2010 22:52 
Offline
DGL Member

Registriert: Fr Jul 16, 2010 18:28
Beiträge: 40
Coolcat hat geschrieben:
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:
Code:
gl.drawArrays(gl.TRIANGLE_STRIP,0,32);
gl.drawArrays(gl.TRIANGLE_STRIP,32,64);

-> 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.

merkwürdig #2:
Code:
gl.drawArrays(gl.TRIANGLE_STRIP,0,32);
gl.drawArrays(gl.TRIANGLE_STRIP,32,32);
gl.drawArrays(gl.TRIANGLE_STRIP,64,32);

-> 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.

Kann mir einer die Phänomene erklären?


grüße


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 10, 2010 23:12 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
m.sirin hat geschrieben:
Nach einigem Rumspielen mit den drawArrays, bekomme ich sehr merkwürde Ergebnisse:
Code:
gl.drawArrays(gl.TRIANGLE_STRIP,0,32);
gl.drawArrays(gl.TRIANGLE_STRIP,32,64);

-> 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.
m.sirin hat geschrieben:
merkwürdig #2:
Code:
gl.drawArrays(gl.TRIANGLE_STRIP,0,32);
gl.drawArrays(gl.TRIANGLE_STRIP,32,32);
gl.drawArrays(gl.TRIANGLE_STRIP,64,32);

-> 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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 10, 2010 23:29 
Offline
DGL Member

Registriert: Fr Jul 16, 2010 18:28
Beiträge: 40
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?


grüße


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 11, 2010 00:28 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
m.sirin hat geschrieben:
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 11, 2010 17:53 
Offline
DGL Member

Registriert: Fr Jul 16, 2010 18:28
Beiträge: 40
Schläfer hat geschrieben:
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
Code:
gl.drawElements(gl.TRIANGLES, numberOfVertices, gl.UNSIGNED_SHORT, 0);
.. 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?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 11, 2010 19:02 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
m.sirin hat geschrieben:
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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.014s | 17 Queries | GZIP : On ]