Aus Wavefront-Datei gewonnene Dreiecke möglichst schnell mit OpenGL 3.x zeichnen
-
Ein 3D-Modell kann ja relativ einfach von einer Wavefront-.obj-Datei geladen werden. Der momentane Stand ist, dass ich je einen Array für alle Vertices, alle Texturkoordinaten und alle Normalen habe und einen Array mit den Flächendefinitionen(jeweils 3 Vertex-, Tex-Coord- und Normalen-Indices)
Ich würde jetzt Dreieck für Dreieck die Daten in ein Vertex Array Object schreiben, und dann zeichnen. Dies würde aber viel Speicher brauchen und ist sicher nicht die schnellste Methode.
Gibt es eine andere Methode, die schneller ist und weniger oder zumindest nicht viel mehr Aufwand bedeutet?
-
Senfti schrieb:
Ich würde jetzt Dreieck für Dreieck die Daten in ein Vertex Array Object schreiben, und dann zeichnen.
Was genau meinst du damit? Also eigentlich kannst du die Indexierung direkt auflösen, also dir einfach einen Vektor anlegen in den du alles schreibst. Danach kopierst du den mit OpenGL in einen Vertexpuffer und zeichnest den so oft du möchtest.
-
Wäre möglich, aber mir geht es weniger darum.
Mich interessiert, ob es eine Möglichkeit gibt, das Ganze schneller zu rendern. Wenn ich es so mache, dann brauche ich für jedes Dreieck 3 Vertices, Tex-Coords und Normalen, obwohl davon viele mehrfach verwendet werden. glDrawElements funktioniert hier meines Wissens nicht, da ich für jeden Parameter einen anderen Index benötige.
Gibt es eine schnellere Methode?
-
als Modus GL_TRIANGLE_STRIP ?
-
Wenn ich es so mache, dann brauche ich für jedes Dreieck 3 Vertices, Tex-Coords und Normalen, obwohl davon viele mehrfach verwendet werden. glDrawElements funktioniert hier meines Wissens nicht, da ich für jeden Parameter einen anderen Index benötige.
Was meinst du mit Parameter? Eigentlich ist glDrawElements genau dafür gedacht. D.h. du kannst ein Quad mit glDrawElements tatsächlich mit nur vier Vertices zeichnen, brauchst aber natürlich 6 Indizes.
-
Genau, das funktioniert mit glDrawElements.
Bedenke beim Speicher, dass Du Vertices, Indices, Texturkoordinaten, Normalen usw. in VertexBuffer bzw. IndexBuffer stecken kannst. Aus dem Programmspeicher kannst Du das dann alles entfernen. Dadurch wird der Speicher dann vernünftig gemanaged und Du brauchst Dir keine Gedanken machen. Die Übergabe geschieht dann auch schnell genug. Wüsste keine Methode, wie es schneller gehen soll.
-
@comonad: Mit Parameter meine ich Vertex, Tex-Coord und Normale. Die Indizes von diesen dreien stimmen aber nicht zusammen und glDrawElements arbeitet nur mit einem Index. Für Vertices alleine kein Problem, aber dadurch kann ich nicht auf die dazu passenden Tex-Coords und Normalen zugreifen.
@pyhax: GL_TRIANGLE_STRIP wäre schneller, aber die Vertices richtig zu ordnen ist recht aufwändig. Gibt es dafür einen fertigen Code oder eine gute Beschreibung, welche auch das Problem berücksichtigt, dass an Kanten für die angrenzenden Flächen unterschiedliche Normalen für die gleichen Vertices benötigt werden, aber sonst geglättete Normalen verwendet werden?
-
Wenn Du eine Mehrfachverwendung von Normalen und Texturkoordinaten hast, solltest Du die redundant abspeichern, sodass der Vertex-Index auch dem Texturkoordinaten-Index entspricht... das ist üblich. Über die zusätzliche Speicherbelastung mach Dir mal keine Gedanken. Es würde im Gegenteil mehr Zeit kosten für alle Attribute eines Vertexes einen anderen Index auszulesen und zu verfolgen...