Signatur
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. |