Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

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_DrawID Built-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.

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

js
let ext = gl.getExtension("WEBGL_multi_draw");

Zeichnen mehrerer Arrays

Beispielaufrufe für ext.multiDrawArraysWEBGL() und ext.multiDrawArraysInstancedWEBGL():

js
// multiDrawArrays variant
const firsts = new Int32Array(/* … */);
const counts = new Int32Array(/* … */);
ext.multiDrawArraysWEBGL(gl.TRIANGLES, firsts, 0, counts, 0, firsts.length);
js
// 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.

js
// multiDrawElements variant
const counts = new Int32Array(/* … */);
const offsets = new Int32Array(/* … */);
ext.multiDrawElementsWEBGL(
  gl.TRIANGLES,
  counts,
  0,
  gl.UNSIGNED_SHORT,
  offsets,
  0,
  counts.length,
);
js
// 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

Browser-Kompatibilität

Siehe auch