WEBGL_multi_draw Erweiterung
Eingeschränkt verfügbar
Diese Funktion ist nicht Baseline, da sie in einigen der am weitesten verbreiteten Browser nicht funktioniert.
Want more browser support for this feature? Tell us why.
Die WEBGL_multi_draw Erweiterung ist Teil der
WebGL API und ermöglicht es, mehr als ein
Primitive mit einem einzigen Funktionsaufruf zu rendern. Dies kann die
Leistung einer WebGL-Anwendung verbessern, da es die Bindungskosten im Renderer
reduziert und die GPU-Thread-Zeit mit gleichmäßigen Daten beschleunigt.
Wenn diese Erweiterung aktiviert ist:
- Neue Methoden, die mehrere Listen von Argumenten in einem Aufruf verarbeiten, werden hinzugefügt (siehe Methodenliste unten).
- Die
gl_DrawIDBuilt-in wird der Shading-Sprache hinzugefügt.
Hinweis: Diese Erweiterung ist sowohl in WebGL 1 als auch WebGL 2 Kontexten verfügbar.
Im Shader-Code muss die Direktive #extension GL_ANGLE_multi_draw
aufgerufen werden, um die Erweiterung zu aktivieren.
Diese Erweiterung aktiviert implizit die ANGLE_instanced_arrays Erweiterung.
Instanzmethoden
ext.multiDrawArraysWEBGL()-
Rendert mehrere Primitives aus Array-Daten (identisch zu mehreren Aufrufen von
drawArrays). ext.multiDrawElementsWEBGL()-
Rendert mehrere Primitives aus Elementarray-Daten (identisch zu mehreren Aufrufen von
drawElements). ext.multiDrawArraysInstancedWEBGL()-
Rendert mehrere Primitives aus Array-Daten (identisch zu mehreren Aufrufen von
drawArraysInstanced). ext.multiDrawElementsInstancedWEBGL()-
Rendert mehrere Primitives aus Elementarray-Daten (identisch zu mehreren Aufrufen von
drawElementsInstanced).
Shader-Erweiterung
Hinweis: Obwohl der Name der Erweiterung WEBGL_multi_draw lautet,
muss die Erweiterung mit der Direktive #extension GL_ANGLE_multi_draw
aktiviert werden, um die Erweiterung in einem Shader zu verwenden.
Wenn diese Erweiterung aktiviert ist, kann das gl_DrawID Built-in
im Shader-Code verwendet werden. Für jede multi* Zeichnungsaufrufvariante
kann der Index der Zeichnung i vom Vertex-Shader als gl_DrawID gelesen werden.
Für nicht-multi* Aufrufe ist der Wert von
gl_DrawID 0.
<script type="x-shader/x-vertex">
#extension GL_ANGLE_multi_draw : require
void main() {
gl_Position = vec4(gl_DrawID, 0, 0, 1);
}
</script>
Beispiele
>Aktivieren der Erweiterung
WebGL-Erweiterungen sind über die Methode WebGLRenderingContext.getExtension() verfügbar.
Für weitere Informationen siehe auch Verwendung von Erweiterungen
im WebGL Tutorial.
let ext = gl.getExtension("WEBGL_multi_draw");
Zeichnen mehrerer Arrays
Beispielaufrufe für ext.multiDrawArraysWEBGL()
und ext.multiDrawArraysInstancedWEBGL():
// multiDrawArrays variant
const firsts = new Int32Array(/* … */);
const counts = new Int32Array(/* … */);
ext.multiDrawArraysWEBGL(gl.TRIANGLES, firsts, 0, counts, 0, firsts.length);
// multiDrawArraysInstanced variant
const firsts = new Int32Array(/* … */);
const counts = new Int32Array(/* … */);
const instanceCounts = new Int32Array(/* … */);
ext.multiDrawArraysInstancedWEBGL(
gl.TRIANGLES,
firsts,
0,
counts,
0,
instanceCounts,
0,
firsts.length,
);
Zeichnen mehrerer Elemente
Beispielaufrufe für ext.multiDrawElementsWEBGL()
und ext.multiDrawElementsInstancedWEBGL().
Es wird davon ausgegangen, dass die zuvor in den ELEMENT_ARRAY_BUFFER hochgeladenen
Indizes als UNSIGNED_SHORT behandelt werden.
// multiDrawElements variant
const counts = new Int32Array(/* … */);
const offsets = new Int32Array(/* … */);
ext.multiDrawElementsWEBGL(
gl.TRIANGLES,
counts,
0,
gl.UNSIGNED_SHORT,
offsets,
0,
counts.length,
);
// multiDrawElementsInstanced variant
const counts = new Int32Array(/* … */);
const offsets = new Int32Array(/* … */);
const instanceCounts = new Int32Array(/* … */);
ext.multiDrawElementsInstancedWEBGL(
gl.TRIANGLES,
counts,
0,
gl.UNSIGNED_SHORT,
offsets,
0,
instanceCounts,
0,
counts.length,
);
Spezifikationen
| Spezifikation |
|---|
| WebGL WEBGL_multi_draw Extension Specification> |