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
GLintzurück, der den für das Instanz-Rendering verwendeten Divisor angibt, wenn die Konstante ingl.getVertexAttrib()als Parameterpnameverwendet 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()undext.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.
// 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> |