Baseline Widely available
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.
KonstantenDiese 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 in gl.getVertexAttrib()
als pname
-Parameter verwendet wird.
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()
und ext.drawElementsInstancedANGLE()
gerendert werden.
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 Browser-Kompatibilität Siehe auch
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4