2016-04-30 4 views
0

Ich lerne JOGL alleine. Ich habe gerade von GL2 zu GL3 gewechselt. Ich habe festgestellt, dass es auf dem GL3 nur wenige Tutorials gibt. Außerdem stellte ich fest, dass GL3 sich völlig von GL2 unterscheidet. Soweit ich weiß, verwendeten viele Personen Puffer, um alle Scheitelpunkte zu halten und sie an OpenGL zu binden. Als sie jedoch die Puffer initialisierten, verwendeten sie Arrays, die in der Länge festgelegt waren. Wie soll ich an einer variierenden Anzahl von Scheitelpunkten oder Objekten arbeiten, wenn die Anzahl der Scheitelpunkte von Anfang an festgelegt wurde? Gibt es einfache Beispiele? Wie kann ich mein Programm generell "dynamischer" gestalten? (d. h. eine benutzerdefinierte 3D-Welt rendern)Wie arbeiten Sie mit einer unterschiedlichen Anzahl von Scheitelpunkten in OpenGL gl3?

+0

Es hängt von der durchschnittlichen Größe und Lebensdauer Ihrer Objekte ab – elect

+0

Also, gibt es noch konkretere Beispiele? Sagen wir mal, wenn ich einen Mini-Blender (das 3D-Modellierungsprogramm) machen soll, kann der Benutzer eine kleine Menge von Objekten erzeugen und modifizieren? Welchen Ansatz sollte ich nehmen? Oder, wenn ich mit einer großen Anzahl von Objekten umgehen müsste (vielleicht eine Mini-Minecraft-Welt) Welchen Ansatz sollte ich nehmen? – FunnyFunkyBuggy

+0

Wenn wir über Dinge sprechen, die vom Benutzer geändert werden, bedeutet dies eine lange Lebensdauer in Computerbegriffen. Sie sollten nur den alten Puffer löschen und den neuen Puffer erstellen, wenn sich die Anzahl der Scheitelpunkte ändert. Derselbe Ansatz für eine Mini-Minecraft-Welt. Um Ihnen einige Zahlen zu geben, benötigt ein CAD-Programm, an dem ich arbeite, mit über 4.000 Objekten und über 27 Millionen Dreiecken insgesamt etwa 1 Sekunde, um die gesamte Geometrie (Position, Normale und Indizes) auf die GPU zu übertragen. gtx 770) – elect

Antwort

1

Das beste, was ich mir vorstellen kann, ist das Erstellen eines großen Puffers in der Initialisierungsphase und das Ändern der Daten mit glBufferSubData(). Eine andere Möglichkeit besteht darin, den Puffer mit glBufferData() neu zu erstellen, obwohl dies nicht vorzuziehen ist, weil es so teuer ist, den Puffer jedes Mal neu zu erstellen, wenn eine neue Entität/ein neu erstelltes Objekt aus der Welt entfernt wird (wahrscheinlich ab und zu gut).

+0

Danke für Ihren Vorschlag. Es scheint, dass GL3/GL4 die Flexibilität von GL2 opfern, um an Geschwindigkeit zu gewinnen. Sicherlich wird die Neuerstellung des Puffers viel Rechenzeit kosten und ich denke nicht, dass es eine gute Idee ist (aber immer noch praktikabel). – FunnyFunkyBuggy

+0

@FunnyFunkyBuggy Nun, Sie können diese Entitäten natürlich in einer 'ArrayList' speichern, die Sie Entitäten hinzufügen oder entfernen können, wie Sie möchten und sie einzeln mit dem gleichen Puffer (ein einfacher Quad-Puffer) rendern. Aber dieser Ansatz kostet auch Ihre Leistung, da das Aufrufen vieler Draw-Aufrufe ohne Batching ebenfalls schlecht ist. – Greffin28

+0

@FunnyFunkyBuggy Ich weiß, das ist sehr sehr spät, lol. Aber nach weiteren Recherchen bin ich zu [dem] (http://stackoverflow.com/questions/1728026/how-doi-i-use-opengl-3-x-vbos-to-render-a-dynamic-world) gerannt könnte antworten. Wenn Sie das bereits herausfinden, ignorieren Sie diesen Kommentar einfach. – Greffin28

Verwandte Themen