ANGLE_instanced_arrays
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 Vertexdaten, Primittivanzahl und Typ teilen.
WebGL-Erweiterungen sind verfügbar über die Methode WebGLRenderingContext.getExtension()
. Weitere Informationen finden Sie unter Verwendung von Erweiterungen im WebGL-Leitfaden.
Hinweis: Diese Erweiterung ist nur für WebGL1 Kontexte verfügbar. In WebGL2 ist die Funktionalität dieser Erweiterung im 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, wenn die ANGLE-Bibliothek verwendet wird. "ANGLE" zeigt lediglich an, dass diese 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
-
Liefert einen
GLint
, der den Frequenzteiler beschreibt, der für das instanzierte Rendering verwendet wird, wenn er ingl.getVertexAttrib()
alspname
-Parameter verwendet wird.
Instanzmethoden
Diese Erweiterung stellt drei neue Methoden bereit.
ext.drawArraysInstancedANGLE()
-
Verhält sich identisch zu
gl.drawArrays()
, außer dass mehrere Instanzen des Elementbereichs ausgeführt werden und die Instanz sich bei jeder Iteration weiterbewegt. ext.drawElementsInstancedANGLE()
-
Verhält sich identisch zu
gl.drawElements()
, außer dass mehrere Instanzen des Elementsatzes ausgeführt werden und die Instanz sich zwischen jeder Gruppe weiterbewegt. ext.vertexAttribDivisorANGLE()
-
Modifiziert die Rate, mit der generische Vertex-Attribute fortschreiten, wenn mehrere Instanzen von Primitiven mit
ext.drawArraysInstancedANGLE()
undext.drawElementsInstancedANGLE()
gerendert werden.
Beispiele
Das folgende Beispiel zeigt, wie man eine bestimmte Geometrie mit einem einzigen Zeichnungsaufruf mehrfach zeichnet.
Warnung: Das folgende ist Bildungsinhalt, kein Produktions-Code. Es sollte allgemein vermieden werden, Daten / Puffer innerhalb der Rendering-Schleife oder direkt vor der Verwendung zu erstellen.
// 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
Specification |
---|
WebGL ANGLE_instanced_arrays Khronos Ratified Extension Specification |
Browser-Kompatibilität
BCD tables only load in the browser