Hallo zusammen,
vor geraumer Zeit hatte ich schon mal hier ein paar Fragen zu Jogl gestellt. Das Projekt war dann erstmal wieder weg, jetzt kommt es wieder (in ähnlicher Form) auf mich zu. Eigtnmlich ist das mehr eine OpenGL Frage, statt JOGL etc., aber man fühlt sich hier im Forum ja gut aufgehoben und ich werd das Ganze eh in Java machen.
Ausgangssituation: Eine Simulation/Emulation (die schon da ist und nicht geändert werden soll), soll statt der bisherigen 2D Swing Grafik nun in 3D darsgetellt werden. Was ich bekomme (bz,w was ich mit jederzeit beim Rendern holen kann), sind eine Menge von Simulationsobjekten, die dargsetellt werden sollen. Kommen neue Objekte hinzu oder werden welche entfernt, werde ich wenigstens noch benachrichtigt.
Nun hat jedes Objekt seine eigenne Eigschaften: Die Form (sprich Verticies), seine Farbe und seine aktualle Position, Größe und Rotation - Die meisten Objekte bewegen sich irgendwie und alle Objekte haben ihre eigene Farbe die sich dynamisch ändert. Position und Farbe kann ich aber nicht voraussehen und ist Sache der Simulation/Emulation. Das einzige was statisch ist, sind die Verticies.
Meine Frage ist nun nach dem Aufbau mit VBOs. Habe ich ein VBO wo die Daten mehrere Objekte enthalten sind, oder habe ich für jedes einzelne Objekt ein VBO (es sind so zwsichen 100- 10.000 Objekte, jedes davon so 10-1000 Verticies)? Der letzere Fall erschein mir einfach: Ein VBO pro Objekt mit Vertexdaten am Anfang initialsieren (oder wann es auch immer erstellt wird) und beim rendering in einem großen Loop alle bekannten Objekte durchgehen, gemerktes VBO binden, model matrix des Objektes berechnen und als unifrom binden und eventuell auch Farbe an den Shader per uniform übertragen.
Nur: Das wären ja sehr sehr sehr viele draw Aufrufe (bis zu 10.000), in jedem Rendering. Man findet im Internet so die Hinweise, viele Objekte lieber in ein VBO zusammenzubündeln, damit das ganze besser parallisiert werden kann. Ok, aber es hat ja noch jedes Objekt seine eignen Translation, Rotation und Skalierung. Ich kann das unform doch aber nur einmal für jeden draw Aufruf binden, oder?
PS: Ganz nebenbei muss das Zeug auch auf älteren Rechner (5+ Jahre und Älter mit OnBoard 3D Karten) laufen. Sollte ich deswegen eventuell eher die alte Fixed Pipeline benutzen (glPop / glPush / glBegin / glEnd)?
vor geraumer Zeit hatte ich schon mal hier ein paar Fragen zu Jogl gestellt. Das Projekt war dann erstmal wieder weg, jetzt kommt es wieder (in ähnlicher Form) auf mich zu. Eigtnmlich ist das mehr eine OpenGL Frage, statt JOGL etc., aber man fühlt sich hier im Forum ja gut aufgehoben und ich werd das Ganze eh in Java machen.
Ausgangssituation: Eine Simulation/Emulation (die schon da ist und nicht geändert werden soll), soll statt der bisherigen 2D Swing Grafik nun in 3D darsgetellt werden. Was ich bekomme (bz,w was ich mit jederzeit beim Rendern holen kann), sind eine Menge von Simulationsobjekten, die dargsetellt werden sollen. Kommen neue Objekte hinzu oder werden welche entfernt, werde ich wenigstens noch benachrichtigt.
Nun hat jedes Objekt seine eigenne Eigschaften: Die Form (sprich Verticies), seine Farbe und seine aktualle Position, Größe und Rotation - Die meisten Objekte bewegen sich irgendwie und alle Objekte haben ihre eigene Farbe die sich dynamisch ändert. Position und Farbe kann ich aber nicht voraussehen und ist Sache der Simulation/Emulation. Das einzige was statisch ist, sind die Verticies.
Meine Frage ist nun nach dem Aufbau mit VBOs. Habe ich ein VBO wo die Daten mehrere Objekte enthalten sind, oder habe ich für jedes einzelne Objekt ein VBO (es sind so zwsichen 100- 10.000 Objekte, jedes davon so 10-1000 Verticies)? Der letzere Fall erschein mir einfach: Ein VBO pro Objekt mit Vertexdaten am Anfang initialsieren (oder wann es auch immer erstellt wird) und beim rendering in einem großen Loop alle bekannten Objekte durchgehen, gemerktes VBO binden, model matrix des Objektes berechnen und als unifrom binden und eventuell auch Farbe an den Shader per uniform übertragen.
Nur: Das wären ja sehr sehr sehr viele draw Aufrufe (bis zu 10.000), in jedem Rendering. Man findet im Internet so die Hinweise, viele Objekte lieber in ein VBO zusammenzubündeln, damit das ganze besser parallisiert werden kann. Ok, aber es hat ja noch jedes Objekt seine eignen Translation, Rotation und Skalierung. Ich kann das unform doch aber nur einmal für jeden draw Aufruf binden, oder?
PS: Ganz nebenbei muss das Zeug auch auf älteren Rechner (5+ Jahre und Älter mit OnBoard 3D Karten) laufen. Sollte ich deswegen eventuell eher die alte Fixed Pipeline benutzen (glPop / glPush / glBegin / glEnd)?