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.

Die ANGLE_instanced_arrays Erweiterung ist Teil der WebGL API und ermöglicht es, dasselbe Objekt oder Gruppen ähnlicher Objekte mehrfach zu zeichnen, wenn sie die gleichen Vertex-Daten, Primitiveanzahl und Type teilen.

WebGL-Erweiterungen sind über die Methode WebGLRenderingContext.getExtension() verfügbar. Für weitere Informationen siehe auch Verwendung von Erweiterungen im WebGL-Leitfaden.

Hinweis: Diese Erweiterung ist nur in WebGL1 Kontexten verfügbar. In WebGL2 ist die Funktionalität dieser Erweiterung auf dem WebGL2-Kontext standardmäßig verfügbar und die Konstanten und Methoden sind ohne das ANGLE_ Präfix verfügbar.

Trotz des Namens "ANGLE" funktioniert diese Erweiterung auf jedem Gerät, wenn die Hardware sie unterstützt, und nicht nur auf Windows bei Verwendung der ANGLE-Bibliothek. "ANGLE" zeigt nur an, dass diese Erweiterung von den Autoren der ANGLE-Bibliothek geschrieben wurde.

Konstanten

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

ext.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE

Gibt einen GLint zurück, der den Frequenzteiler beschreibt, der für instanzierte Rendering verwendet wird, wenn er in der Methode gl.getVertexAttrib() als pname Parameter verwendet wird.

Instanzmethoden

Diese Erweiterung bietet drei neue Methoden.

ext.drawArraysInstancedANGLE()

Verhält sich identisch wie gl.drawArrays(), außer dass mehrere Instanzen des Bereichs von Elementen ausgeführt werden und die Instanz bei jeder Iteration voranschreitet.

ext.drawElementsInstancedANGLE()

Verhält sich identisch wie gl.drawElements(), außer dass mehrere Instanzen des Satzes von Elementen ausgeführt werden und die Instanz zwischen jedem Satz voranschreitet.

ext.vertexAttribDivisorANGLE()

Modifiziert die Rate, mit der generische Vertex-Attribute voranschreiten, wenn mehrere Instanzen von Primitiven mit ext.drawArraysInstancedANGLE() und ext.drawElementsInstancedANGLE() gerendert werden.

Beispiele

Das folgende Beispiel zeigt, wie eine gegebene Geometrie mehrfach mit einem einzigen Zeichenaufruf gezeichnet wird.

Warnung: Das Folgende ist bildend, nicht auf Produktionsniveau Code. Es sollte allgemein vermieden werden, Daten / Buffer innerhalb der Rendering-Schleife oder unmittelbar vor der Nutzung zu konstruieren.

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