Ein Objekt zeichnen geht gut, aber wen ich zwei oder mehrere Objekte einbinden will, komme ich nicht weiter. Bei Delphi konnte mit glBindVertexArray(uiVAO[2]); sagen, welche Objekte er zeichnen soll, dasselbe beim renden. Aber java kennt GLES20.glBindVertexArray(???); nicht.
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Ich nehme einfach mal an, OpenGL ES 2.0 entspricht dem, was auf dem Desktop OpenGL 2.0 ist. Da gibt es noch keine Vertex Array Objects - höchstens mit Extension. Dann bleibt dir nichts anderes übrig, als bei jedem Objektwechsel manuell glBindBuffer, glEnableVertexAttribArray und glDisableVertexAttribArray aufzurufen.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
So (ähnlich, natürlich entsprechend abstrahiert) render ich zumindest meine box2D-Sandbox auf Android, und die stellt jede Menge Objekte gleichzeitig dar.
Ich dachte, mit glVertexAttribPointer kopiert man die Vector-Daten in den Speicher der Grafikkarte. Oder verstehe ich das was falsch ?
Die Daten werden über das VBO auf die Grafikkarte geladen. Mit VertexAttribPointer sagst du nur noch welche Daten aus dem VBO mit welcher Variable im Shader verknüpft werden. (Also zB. die ersten 4 Floats eines Vertices an den Shader Input mit dem Namen "vPosition", oder 3 Byte an "color" usw.)
"Normales" OpenGL unterstützt noch folgende Befehle (diese sind glaube ich nicht in OpenGL ES 2 vorhanden), mit denen du den Buffer auch zurücklesen und ändern kannst:
So wie du es machst, gar keine. VAOs gibt es eigentlich dafür, damit die Einstellungen wie die Daten in einen VBO Aufgebaut sind, nicht immer wieder erneut eingestellt werden müssen. Für das Rendern muss dann nur noch mit einen OpenGL-Aufruf das VAO gebunden werden und es kann los gehen. Es ist einfach eine Funktion die darauf abzielt, viele unnötige redundante performanceraubende OpenGL-Aufrufe zur Laufzeit beim Rendern einzusparen.
Vielleicht hast du mich falsch verstanden, was ich bei // Render Routine habe, wird nur einmal im Programm aufgerufen. Die // draw Routine bei jedem Timer-Aufruf.
So wie ich es weiter oben verstanden habe braucht VertexAttribPointer fast keine Zeit, da nur ein Pointer auf die Array zeigt.
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Jeder OpenGL-Funktionsaufruf braucht Zeit, weshalb man die Anzahl möglichst niedrig halten sollte. Durch den Einsatz von VAOs sparst du dir wie gesagt Aufrufe wie glBindBuffer, glEnableVertexAttribArray und glDisableVertexAttribArray. Dass es in OpenGL2 (ES) bei dir trotzdem ohne diese Funktionen in der Draw-Routine (dazu sagt man eigentlich auch Render-Routine) funktioniert, liegt wahrscheinlich daran, dass du nur ein Objekt zeichnest und daher nie das VBO bzw. die VertexAttrib-Einstellungen ändern musst.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Dass es in OpenGL2 (ES) bei dir trotzdem ohne diese Funktionen in der Draw-Routine (dazu sagt man eigentlich auch Render-Routine) funktioniert, liegt wahrscheinlich daran, dass du nur ein Objekt zeichnest und daher nie das VBO bzw. die VertexAttrib-Einstellungen ändern musst.
Ich habe die Routine zur Initialisierung auf InitScene umbenannt. Ich habe drei Objekte, mit je einem Vektor und Normalen Vertex welche initialisieren muss und das Programm läuft. Ich hoffe ich habe die Elemente richtig genannt.
Mitglieder in diesem Forum: 0 Mitglieder und 18 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.