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
GLintzurück, der den Frequenzteiler beschreibt, der für instanzierte Rendering verwendet wird, wenn er in der Methodegl.getVertexAttrib()alspnameParameter 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()undext.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.
// 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> |