Start · Sprachen · JavaScript · Referenz · WEBGL_multi_draw extension

WEBGL_multi_draw extension

Schnittstelle

WebGL-Erweiterung, mit der Sie viele Draw-Calls in einem einzigen Funktionsaufruf zeichnen – auf Wunsch instanziert und mit <code>gl_DrawID</code> im Shader.

seit JavaScript WebGL 1 und WebGL 2 (Erweiterung); Chromium 86+, i Kategorie: webapi

Signatur

interface WEBGL_multi_draw

Beschreibung

WEBGL_multi_draw ist eine WebGL-Erweiterung. Sie erhalten sie mit gl.getExtension("WEBGL_multi_draw"), und zwar in einem WebGLRenderingContext wie auch in einem WebGL2RenderingContext. Das Objekt hat keinen Konstruktor. Es bietet vier Methoden, die jeweils eine ganze Liste von Zeichenbefehlen in einem Aufruf abarbeiten:

  • multiDrawArraysWEBGL(mode, firstsList, firstsOffset, countsList, countsOffset, drawCount)
  • multiDrawElementsWEBGL(mode, countsList, countsOffset, type, offsetsList, offsetsOffset, drawCount)
  • multiDrawArraysInstancedWEBGL(mode, firstsList, firstsOffset, countsList, countsOffset, instanceCountsList, instanceCountsOffset, drawCount)
  • multiDrawElementsInstancedWEBGL(mode, countsList, countsOffset, type, offsetsList, offsetsOffset, instanceCountsList, instanceCountsOffset, drawCount)

Die Erweiterung lohnt sich, wenn Sie viele kleine Objekte mit demselben Shader-Programm und denselben Puffern zeichnen, etwa Kacheln, Text-Glyphen, Partikelgruppen oder Level-Geometrie in einem gemeinsamen Vertex-Puffer. Ohne die Erweiterung bräuchten Sie dafür hunderte Aufrufe von drawArrays() oder drawElements(), und jeder davon kostet Zeit in JavaScript und bei der Prüfung durch WebGL. Mit der Erweiterung übergeben Sie stattdessen typisierte Arrays mit Startindizes, Längen und bei Bedarf Instanzzahlen.

Im Shader können Sie mit der Direktive #extension GL_ANGLE_multi_draw : require die eingebaute Variable gl_DrawID (Typ int) nutzen. Sie enthält den Index des aktuellen Teil-Draws innerhalb des Multi-Draw-Aufrufs. So kann jeder Teil-Draw eigene Daten wie Farbe, Transformation oder Textur-Layer aus einem Uniform-Array oder einer Textur lesen. Zwischen den Teil-Draws kann sich kein Zustand ändern: Programm, Puffer, Texturen und Uniforms sind für alle gleich.

Parameter

Name Typ Default Beschreibung
$mode Pflicht GLenum Primitivtyp, z. B. gl.TRIANGLES, gl.TRIANGLE_STRIP, gl.LINES oder gl.POINTS. Gilt für alle Teil-Draws.
$firstsList Pflicht Int32Array | number[] Nur bei den Arrays-Varianten: Startindex im Vertex-Puffer für jeden Teil-Draw.
$firstsOffset Pflicht number 0 Ab welchem Element von firstsList gelesen wird (Elementindex, nicht Bytes).
$countsList Pflicht Int32Array | number[] Anzahl der Vertices (bei Arrays) bzw. der Indizes (bei Elements) je Teil-Draw.
$countsOffset Pflicht number 0 Startelement in countsList.
$type Pflicht GLenum Nur bei den Elements-Varianten: Typ der Indizes, also gl.UNSIGNED_BYTE, gl.UNSIGNED_SHORT oder gl.UNSIGNED_INT. gl.UNSIGNED_INT braucht in WebGL 1 die Erweiterung OES_element_index_uint.
$offsetsList Pflicht Int32Array | number[] Nur bei den Elements-Varianten: Byte-Offset in den gebundenen ELEMENT_ARRAY_BUFFER für jeden Teil-Draw. Der Wert muss ein Vielfaches der Indexgröße sein.
$offsetsOffset Pflicht number 0 Startelement in offsetsList.
$instanceCountsList Pflicht Int32Array | number[] Nur bei den Instanced-Varianten: Anzahl der Instanzen je Teil-Draw.
$instanceCountsOffset Pflicht number 0 Startelement in instanceCountsList.
$drawCount Pflicht number Anzahl der auszuführenden Teil-Draws. Jede Liste muss ab ihrem Offset mindestens so viele Einträge haben, sonst meldet WebGL INVALID_OPERATION.