Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

ANGLE_instanced_arrays

Baseline
Weitgehend verfügbar

Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juni 2016 browserübergreifend verfügbar.

Hinweis: Diese Funktion ist in Web Workers verfügbar.

Die Erweiterung ANGLE_instanced_arrays ist Teil der WebGL-API und ermöglicht es Ihnen, dasselbe Objekt oder Gruppen ähnlicher Objekte mehrfach zu zeichnen, sofern sie dieselben Vertex-Daten sowie dieselbe Anzahl und denselben Typ von Primitiven verwenden.

WebGL-Erweiterungen sind über die Methode WebGLRenderingContext.getExtension() verfügbar. Weitere Informationen finden Sie unter WebGL-Erweiterungen verwenden.

Hinweis: Diese Erweiterung ist nur für WebGL1-Kontexte verfügbar. In WebGL2 steht ihre Funktionalität im WebGL2-Kontext standardmäßig zur Verfügung; die Konstanten und Methoden sind ohne das Präfix ANGLE_ verfügbar.

Trotz des Namens „ANGLE“ funktioniert diese Erweiterung auf jedem Gerät, dessen Hardware sie unterstützt – nicht nur unter Windows bei Verwendung der ANGLE-Bibliothek. „ANGLE“ weist lediglich darauf hin, dass die Erweiterung von den Autoren der ANGLE-Bibliothek geschrieben wurde.

Konstanten

Diese Erweiterung stellt eine neue Konstante bereit, die in der Methode gl.getVertexAttrib() verwendet werden kann:

ext.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE

Gibt einen GLint zurück, der den für das Instanz-Rendering verwendeten Divisor angibt, wenn die Konstante in gl.getVertexAttrib() als Parameter pname verwendet wird.

Instanzmethoden

Diese Erweiterung stellt drei neue Methoden bereit.

ext.drawArraysInstancedANGLE()

Verhält sich wie gl.drawArrays(), führt jedoch mehrere Instanzen des Elementbereichs aus und wechselt bei jeder Iteration zur nächsten Instanz.

ext.drawElementsInstancedANGLE()

Verhält sich wie gl.drawElements(), führt jedoch mehrere Instanzen der Elementmenge aus und wechselt zwischen den einzelnen Mengen zur nächsten Instanz.

ext.vertexAttribDivisorANGLE()

Ändert die Häufigkeit, mit der generische Vertex-Attribute fortgeschaltet werden, wenn mehrere Instanzen von Primitiven mit ext.drawArraysInstancedANGLE() und ext.drawElementsInstancedANGLE() gerendert werden.

Beispiele

Das folgende Beispiel zeigt, wie Sie eine bestimmte Geometrie mit einem einzigen Zeichenaufruf mehrfach zeichnen.

Warnung: Der folgende Code dient der Veranschaulichung und ist nicht für den Produktiveinsatz gedacht. Im Allgemeinen sollten Daten oder Buffer nicht innerhalb der Rendering-Schleife oder unmittelbar vor ihrer Verwendung erstellt werden.

js
// enable the extension
const ext = gl.getExtension("ANGLE_instanced_arrays");

// binding the geometry buffer as usual
gl.bindBuffer(gl.ARRAY_BUFFER, geometryVertexBuffer);
gl.enableVertexAttribArray(vertexPositionAttributeLocation);
gl.vertexAttribPointer(
  vertexPositionAttributeLocation,
  3,
  gl.FLOAT,
  false,
  0,
  0,
);

// build position buffer
const instancePositions = [];
for (const instance of instances) {
  instancePositions.push(
    instance.position.x,
    instance.position.y,
    instance.position.z,
  );
}
const instancePositionBuffer = createWebGLBufferFromData(instancePositions);

// binding the instance position buffer as you would with any attribute
gl.bindBuffer(gl.ARRAY_BUFFER, instancePositionBuffer);
gl.enableVertexAttribArray(instancePositionAttributeLocation);
gl.vertexAttribPointer(
  instancePositionAttributeLocation,
  3,
  gl.FLOAT,
  false,
  0,
  0,
);

// mark the attribute as instanced and advance it every single(1) instance rather than every vertex
ext.vertexAttribDivisorANGLE(instancePositionAttributeLocation, 1);

// draw geometry for each instance
ext.drawArraysInstancedANGLE(
  gl.TRIANGLES,
  0,
  numGeometryVertices,
  instances.length,
);

Spezifikationen

Spezifikation
WebGL ANGLE_instanced_arrays Khronos Ratified Extension Specification

Browser-Kompatibilität

Siehe auch