Wie WaclawJasper sagte, gibt es viele Kompromisse.
Die allgemeine Vorgehensweise in WebGL ist ein Zeichenaufruf pro Objekt (Ihre erste Methode).
Eine andere wäre instanced Zeichnung using ANGLE_instanced_arrays
zu verwenden. In dieser Methode würden Ihre Übersetzungen in einem Puffer gespeichert werden. Sie würden den Puffer nur eine Übersetzung pro Instanz aktualisieren (gegenüber einer pro Vertex in der zweiten Methode). Bei dieser Methode wird davon ausgegangen, dass alle Instanzen identisch sind.
Wenn Ihre Geometrie zufällig gemischt ist (Würfel + Kugel + Pyramide), wäre eine andere Methode, Ihre Orientierungsdaten in eine Textur zu bringen. Indem Sie jedem Stützpunkt eine instanceId geben, können Sie damit den Speicherort der Daten dieser Instanz in der Textur berechnen. In diesem Fall würden Sie eine Ausrichtung pro Instanz wie die vorherige Methode aktualisieren. Sie würden nur eine Textur anstelle eines Puffers aktualisieren. Wenn die Hardware das Lesen von Gleitkomma-Texturen (OES_texture_float
) unterstützt, die die meisten Hardware an diesem Punkt verwendet, ist diese Methode ziemlich einfach.
Als Beispiel für das Speichern der Ausrichtung in einer Textur speichert three.js optional Knochenmatrizen in Texturen für das Rendering mit Skinned Mesh, um eine begrenzte Anzahl von Uniformen zu umgehen.
Beachten Sie, dass Sie mithilfe von Texturen auch die Scheitelpunktdaten in eine Textur einfügen können. Die Puffer würden dann nur Vertex-Indizes enthalten.
Ich render meine meine Würfel mit gl.drawArrays, vielleicht mit ELEMENT-Puffer wäre auch eine Option? – Skeen