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.
Hinweis: Diese Funktion ist in Web Workers verfügbar.
Die Erweiterung WEBGL_multi_draw ist Teil der WebGL-API und ermöglicht es Ihnen, mit einem einzigen Funktionsaufruf mehrere Primitive zu rendern. Dies kann die Leistung einer WebGL-Anwendung verbessern, da es den Aufwand für Bindungen im Renderer reduziert und die Verarbeitungszeit des GPU-Threads bei der Verwendung von Uniform-Daten verkürzt.
Wenn diese Erweiterung aktiviert ist:
- Werden neue Methoden hinzugefügt, die mehrere Argumentlisten in einem Aufruf verarbeiten (siehe die Methodenliste unten).
- Wird das Built-in
gl_DrawIDzur Shading-Sprache hinzugefügt.
Hinweis: Diese Erweiterung ist sowohl für WebGL-1-Kontexte als auch für WebGL-2-Kontexte verfügbar.
Im Shader-Code muss die Direktive #extension GL_ANGLE_multi_draw verwendet werden, um die Erweiterung zu aktivieren.
Diese Erweiterung aktiviert implizit die Erweiterung ANGLE_instanced_arrays.
Instanzmethoden
ext.multiDrawArraysWEBGL()-
Rendert mehrere Primitive aus Array-Daten (entspricht mehreren Aufrufen von
drawArrays). ext.multiDrawElementsWEBGL()-
Rendert mehrere Primitive aus Element-Array-Daten (entspricht mehreren Aufrufen von
drawElements). ext.multiDrawArraysInstancedWEBGL()-
Rendert mehrere Primitive aus Array-Daten (entspricht mehreren Aufrufen von
drawArraysInstanced). ext.multiDrawElementsInstancedWEBGL()-
Rendert mehrere Primitive aus Element-Array-Daten (entspricht mehreren Aufrufen von
drawElementsInstanced).
Shader-Erweiterung
Hinweis: Obwohl die Erweiterung WEBGL_multi_draw heißt, muss sie mit der Direktive #extension GL_ANGLE_multi_draw aktiviert werden, damit sie in einem Shader verwendet werden kann.
Wenn diese Erweiterung aktiviert ist, kann das Built-in gl_DrawID im Shader-Code verwendet werden. Bei jeder multi*-Variante eines Zeichenaufrufs kann der Vertex-Shader den Index i des jeweiligen Zeichenaufrufs als gl_DrawID auslesen. Bei Aufrufen ohne multi* ist der Wert von gl_DrawID gleich 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
>Erweiterung aktivieren
WebGL-Erweiterungen sind über die Methode WebGLRenderingContext.getExtension() verfügbar. Weitere Informationen finden Sie unter WebGL-Erweiterungen verwenden.
let ext = gl.getExtension("WEBGL_multi_draw");
Mehrere Arrays zeichnen
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,
);
Mehrere Elemente zeichnen
Beispielaufrufe für ext.multiDrawElementsWEBGL() und ext.multiDrawElementsInstancedWEBGL().
Dabei wird angenommen, 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> |